前言
ORM ( Object Relational Mapping ),透過直接操作物件的方式就能夠對DB執行新增、修改、刪除、搜尋的功能,大大簡化RD在開發過程中繁瑣的工作。
使用心得
目前使用過下列幾種Github上熱門的專案
– greenDAO 過程太過繁瑣我就不介紹了
– sugar Github上雖然一直有更新,但都沒有真正釋出,文件也是…
– LitePal 推薦!非常簡單,步驟不超過五步
– realm-java 推薦!官網支援非常完整,文件也算相當清楚
結論:小資料、單筆資料,建議用LitePal,大量資料再用realm-java
LitePal
由於官網已經有相當完整的介紹,就不在贅述,這專案的好處是就算資料結構有所變動也不需要去作所謂的Migrations,而且可以跟Gson完美結合
LitePal物件上面需要繼承 DataSupport
//新增
Album album = new Album();
album.setName("album");
album.setPrice(10.99f);
album.save();
//修改
Album albumToUpdate = new Album();
albumToUpdate.setPrice(20.99f); // 改價格
albumToUpdate.update(指定id);
//刪除
DataSupport.delete(Album.class, 指定id);
//查詢
Album album = DataSupport.find(Album.class, 指定id);
List<Album> allAlbums = DataSupport.findAll(Album.class);
List<Album> albums = DataSupport.where("name like ?", "album%").order("duration").find(Album.class);
realm-java
realm-java 雖然步驟稍嫌複雜,如果資料架構有變動需要Migrations,但其速度卻是非常快速,對於有大量資料要處理的來說可以是真心推薦,而且有支援直接JSON轉入,非常方便!
realm物件上面需要繼承 RealmObject,並提供 Tag 避免不要的型態進入DB當中
public class User extends RealmObject {
private String name;
private int age;
@Ignore
private int sessionId;
// Standard getters & setters generated by your IDE…
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
public int getSessionId() { return sessionId; }
public void setSessionId(int dontPersist) { this.sessionId = sessionId; }
}
realm對於boolean的變數方法要求有點奇怪,必須強制使用get 跟set 而不是 is 跟 set
//啟動DB
Realm realm = Realm.getInstance(this);
//開始
realm.beginTransaction();
//... 這邊可以執行新增資料或者更新資料 ...
//commit
realm.commitTransaction();
//結束 官方建議如果不使用DB了就一定要關掉,避免記憶體浪費
realm.close();
新增
//直接新增
realm.beginTransaction();
User user = realm.createObject(User.class); // Create a new object
user.setName("John");
user.setEmail("john@corporation.com");
realm.commitTransaction();
//事後新增
User user = new User("John");
user.setEmail("john@corporation.com");
// Copy the object to Realm. Any further changes must happen on realmUser
realm.beginTransaction();
User realmUser = realm.copyToRealm(user);
realm.commitTransaction();
查詢
// Build the query looking at all users:
RealmQuery<User> query = realm.where(User.class);
// Add query conditions:
query.equalTo("name", "John");
query.or().equalTo("name", "Peter");
// Execute the query:
RealmResults<User> result = query.findAll();
// Or alternatively do the same all at once (the "Fluent interface"):
RealmResults<User> result2 = realm.where(User.class)
.equalTo("name", "John")
.or()
.equalTo("name", "Peter")
.findAll();
修改
RealmResults<User> result = query.findAll();
User user = result.get(0);
user.setName("Omima");
realm.commitTransaction();
刪除
// All changes to data must happen in a transaction
realm.beginTransaction();
// remove single match
result.remove(0);
result.removeLast();
// remove a single object
User user = result.get(5);
user.removeFromRealm();
// Delete all matches
result.clear();
realm.commitTransaction()