Realm
介紹
- 什么是ORM?
- Android原生操作數據庫的方式是這樣的:首先定義一個類繼承SQLiteOpenHelper,重寫onCreate和onUpdate,后續對數據庫的增刪改查以及創建和銷毀都需要操作相對比較底層的sql語句,難以記憶又容易出錯,而且操作sql語句代碼量多,sql語句的邏輯比較繁瑣。
- 而Java是面向對象的語言,有沒有一種方式可以讓我們不去關心sql語句的編寫,直接面向對象;我們操作對象就間接操作了數據庫。那么orm數據庫框架就是幫助我們完成這個事,并且能夠將javabean和數據庫的表映射起來,javabean的字段就是表的字段。這就是為什么叫o(對象)r(關系)m(映射)的原因。
- 為什么選擇Realm?
- 目前主流的orm類庫有:Realm,greenDao,DBFlow,Ormlite,xutil,afinal等;
- Realm專為移動開發設計,并與其他主流庫完美融合使用,功能強大,性能和效率都處于領先地位,因此我們選擇學習它。
- 相關資料
- Realm庫github地址:https://github.com/realm/realm-java
- 官網文檔:https://realm.io/docs/java/latest/
1. 添加依賴
-
首先,在project目錄下的root build.gradle文件中添加如下:
buildscript { repositories { jcenter() } dependencies { classpath "io.realm:realm-gradle-plugin:3.0.0" } }
-
其次,在module目錄下的build.gradle文件中添加如下:
apply plugin: 'realm-android'
?
2. 定義model
創建model有2種方式:繼承RealmObject;實現RealmModel接口
-
方式一,繼承自RealmObject,如下:
public class User extends RealmObject { public User(String name, int age) { this.name = name; this.age = age; } //1.當自定義構造函數時,必須有一個無參數構造 public User(){} public String name; public int age; @Ignore //該字段不會被存儲到db中 public int height; //2.it can also have custom method... public void sayName(){ Log.d("tag", "sayName: "+this.name); } }
-
方式二,實現RealmModel 接口,并添加注解@RealmClass,如下:
@RealmClass public class User implements RealmModel { public User(String name, int age) { this.name = name; this.age = age; } //1.當自定義構造函數時,必須有一個無參數構造 public User(){} public String name; public int age; @Ignore //該字段不會被存儲到db中 public int height;
?
3. 增刪改查
-
增加
增加,刪除和修改操作必須在事務(transaction)控制下進行,Realm進行事務操作有2種方式,異步和同步,推薦異步模式。
-
同步創建數據到Realm數據庫,有2種寫法:
//同步操作寫法一: realm.beginTransaction(); //會創建對象和user表 User user = realm.createObject(User.class); //會自動更新表 user.name = "劉德華"; user.age = 55; //提交事務,操作就被執行 realm.commitTransaction(); //同步操作寫法二: realm.executeTransaction(new Realm.Transaction() { @Override public void execute(Realm realm) { //會創建對象和user表 User user = realm.createObject(User.class); //會自動更新表 user.name = "劉德華"; user.age = 55; } });
-
異步創建數據,推薦異步的方式:
realm.executeTransactionAsync(new Realm.Transaction() { @Override public void execute(Realm realm) { User user = realm.createObject(User.class); //會自動更新表 user.name = "劉德華"; user.age = 55; } }, new Realm.Transaction.OnSuccess() { @Override public void onSuccess() { //操作成功 Log.e(TAG, "onSuccess: " ); } }, new Realm.Transaction.OnError() { @Override public void onError(Throwable error) { //操作失敗 Log.e(TAG, "onError: "+error.getMessage()); } });
?
-
-
查詢
RealmQuery<User> query = realm.where(User.class); RealmResults<User> users = query.findAll(); if(users==null || users.size()==0){ Log.e(TAG, "query: no data!" ); }else{ Log.e(TAG, "query: size: "+users.size()); User user = users.get(0); Log.e(TAG, "query: "+user.name ); }
?
-
刪除
realm.executeTransactionAsync(new Realm.Transaction() { @Override public void execute(Realm realm) { RealmQuery<User> query = realm.where(User.class); RealmResults<User> users = query.findAll(); users.get(0).deleteFromRealm();//刪除元素 } }, new Realm.Transaction.OnSuccess() { @Override public void onSuccess() { Log.e(TAG, "onSuccess: delete success" ); } });
?
-
修改
realm.executeTransactionAsync(new Realm.Transaction() { @Override public void execute(Realm realm) { RealmQuery<User> query = realm.where(User.class); RealmResults<User> users = query.findAll(); User user = users.get(0); user.name = "張學友"; user.age = 10; } });
4. 過濾器(Filter)
Realm支持多種多樣的過濾器,讓數據操作更方便!
- 所有數據類型支持:
- equalTo和notEqualTo
- Number數據類型,包括Date支持:
- between:兩者之間
- greaterThan:大于某個值
- lessThan:小于某個值
- greaterThanOrEqualTo:大于或等于
- lessThanOrEqualTo:小于或等于
- 字符串類型支持:
- contains:包含
- beginsWith:以...開始
- endsWith:以...結尾
- like:類似于...