您的位置:首页 > 移动开发 > Android开发

Android ORM DB使用心得

2015-09-01 05:15 405 查看


Android ORM DB使用心得


前言

ORM
( Object Relational Mapping ),透過直接操作物件的方式就能夠對DB執行新增、修改、刪除、搜尋的功能,大大簡化RD在開發過程中繁瑣的工作。


使用心得

目前使用過下列幾種Github上熱門的專案

– greenDAO 過程太過繁瑣我就不介紹了

– sugar Github上雖然一直有更新,但都沒有真正釋出,文件也是…

– LitePal 推薦!非常簡單,步驟不超過五步

– realm-java 推薦!官網支援非常完整,文件也算相當清楚

結論:小資料、單筆資料,建議用LitePal,大量資料再用realm-java


LitePal

Github
連結

由於官網已經有相當完整的介紹,就不在贅述,這專案的好處是就算資料結構有所變動也不需要去作所謂的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()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: