標籤:
原文地址:http://my.oschina.net/yangfuhai/blog/87459
今天給大家介紹下#afinal#來操作android的資料庫sqlite。
#afinal#是一個android的orm、ioc快速開發架構,裡麵包含了四大功能:空間的id綁定和事件綁定功能;網狀圖片的顯示功能(裡麵包含了強大的緩衝架構);資料庫sqlite的操作功能;http資料的讀取功能(支援ajax方式讀取);
#afinal#開源網址:https://github.com/yangfuhai/afinal
這篇文章主要是介紹afinal的功能之一FinalDb組件,其他組件請關注我的部落格吧,以後將會一一介紹:
# afinal#的FinalDb組件是android的一個輕量級的orm架構,使用簡單,一行代碼就可以完成資料庫的各種操作功能。
首先我們來建立一個測試實體類 User.java
?
| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
package com.devchina.ormdemo; import java.util.Date; public class User { private int id; private String name; private String email; private Date registerDate; private Double money; /////////////getter and setter 不能省略哦/////////////// public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public Date getRegisterDate() { return registerDate; } public void setRegisterDate(Date registerDate) { this.registerDate = registerDate; } public Double getMoney() { return money; } public void setMoney(Double money) { this.money = money; } } |
這個實體類要注意一點就是getter和setter是不能省略的哦,,,,因為afinal的finalDb最終會調用setter去給實體類的屬性賦值。
現在實體類建立完畢了,我們來寫我們的第一個demo:
AfinalOrmDemoActivity.java
?
| 1234567891011121314151617181920212223242526272829303132333435363738 |
package com.devchina.ormdemo; import java.util.Date;import java.util.List; import net.tsz.afinal.FinalActivity;import net.tsz.afinal.FinalDb;import net.tsz.afinal.annotation.view.ViewInject;import android.os.Bundle;import android.util.Log;import android.widget.TextView; public class AfinalOrmDemoActivity extends FinalActivity { @ViewInject(id=R.id.textView) TextView textView; //這裡使用了afinal的ioc功能,以後將會講到 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); FinalDb db = FinalDb.create(this); User user = new User(); user.setEmail("[email protected]"); user.setName("探索者"); user.setRegisterDate(new Date()); db.save(user); List<User> userList = db.findAll(User.class);//查詢所有的使用者 Log.e("AfinalOrmDemoActivity", "使用者數量:"+ (userList!=null?userList.size():0)); textView.setText(userList.get(0).getName()+":"+user.getRegisterDate()); }} |
很簡單吧,就一個FinalDb db = FinalDb.create(this),然後db.save(user);就可以把我們定義的實體類儲存到資料庫去啦。我們來看輸出日誌:
什嗎?就這樣就儲存到sqlite資料庫裡面去了?可是我們還沒有建立資料庫,也沒有建立表呀?怎麼可能?
這裡,我要跟大家說的是afinal自己去建立啦,簡單吧。
我們來看下adt的File Exploer 查看database目錄,下面確實有一個afinal.db檔案,如:
我們把afinal.db匯出來後,通過sqlite資料庫開啟afinal.db,如:
同時afinal自動給我們建立來表:com_devchina_ormdemo_User,由此看出afinal會以類名為表名自動建立表:我們再過來看下錶的資料:
到這裡,相信大家能明白了,原理afinal自動給我們建立了資料庫afinal.db同時給我們建立了表com_devchina_ormdemo_User,儲存的時候,afinal自動把資料儲存到sqlite表裡面去了。
這時候,估計大家的疑問又起來了
afinal自動建立了資料庫afinal.db,同時自動建立了表com_devchina_ormdemo_User。可是,我們不想建立資料庫afinal.db,也不想讓我們的表示com_devchina_ormdemo_User,那我們應該怎麼辦呢?
這一些呀,afinal都已經想好了。
接下來,我們來介紹下afinal的orm註解功能。
第一個,設定資料庫中的表名 net.tsz.afinal.annotation.sqlite.Table,我們來給user,java配置一下:
?
| 123456789101112131415161718 |
package com.devchina.ormdemo; import java.util.Date; import net.tsz.afinal.annotation.sqlite.Table; @Table(name="user_test")public class User { private int id; private String name; private String email; private Date registerDate; private Double money; /////////////getter and setter/////////////// //代碼太長,略getter setter,開發中不能省略} |
這裡和上邊唯一不同的是 多了一個註解 @Table(name="user_test"),只要我們配置了這個以後,我們再來看下afinal建立的資料庫和表:
由此,我們可以看出來,afinal又自動給我們建立了表user_test,但是要注意的是com_devchina_ormdemo_User這個表afinal並沒有去刪除,所以這裡也要提醒下大家,我們在重新設計了類的結構或者屬性的時候,先手動刪除掉直接的資料,否則就會有垃圾資料儲存在資料庫裡面,當然,不刪除也可以,不會有任何的影響。
在上面的講述中,細心的朋友可能會注意到了一個問題,afinal自動把user的id的這個屬性當做了主鍵。而且自動成長。
可是,可是在我們的開發過程中,我們的user可能沒有id這個屬性啊,可能是userId,或者又可能是其他我們喜歡的屬性,那怎麼辦呢?
沒有關係:afinal有給我們準備了另一個註解:net.tsz.afinal.annotation.sqlite.Id,通過這個,我們就可以給我們的實體類定義主鍵啦
afinal的主鍵機制是:
當給某個屬性添加註解@id的時候,該屬性就是主鍵(一個類中只有一個主鍵),儲存在資料庫中的列名為屬性的名稱,@Id(column="userId")給屬性添加註解的時候,儲存在資料庫的列名是userId,當這個屬性沒有的時候,afinal自動回去該類尋找_id屬性,_id屬性也沒有的時候,afinal就會自動去尋找id屬性。如果連id屬性也沒有,那麼afinal就報錯啦,afinal的orm規則中,表示必須有主鍵的,而且只能有一個(目前暫時不支援複合主鍵)。
回到剛才的問題,afinal給我們自動建立資料庫afinal.db,可是,我們不想建立讓資料庫名是afinal.db,那怎麼辦呢?
afinal的建立時候有多個方法的重載。
在create的方法中,
isDebug表示是否是debug模式,debug模式中,使用afinal操作資料庫的時候就會答應SQL語句的log,
dbName就是資料庫的名稱啦。
所以這裡,我們傳入我們自己想要的資料庫名稱就行了。
其實afinal的FinalDb模組中,還有很多其他的功能,比如一對多,多對一的配置和註解等等。等待大家挖掘了。
afinal的orm註解中有:
Id------->註解註解
Property------>屬性註解
Table------->資料表註解
ManyToOne-------->多對一註解
OneToMany--------->一對多註解
Transient------->忽略屬性註解(如果該屬性添加這個註解,afinal的orm功能將忽略該屬性)
源代:
http://pan.baidu.com/s/1i3vWSkP
裡面沒有jar包,自己去afinal的廣髮網站下載最新jar包
使用android快速開發架構afinal的FinalDb操作android資料庫