前提
Android Studio 1.5.1 或者更高版本;
JDK 版本 >=7;
較新的 Android SDK 版本;
支持 Android API 9 以上的所有版本(Android 2.3 Gingerbread 及以上)。
為什么使用Realm
Realm Java 讓你能夠高效地編寫 app 的模型層代碼,保證你的數(shù)據(jù)被安全、快速地存儲。
1、Realm基本配置
A.在module的build.gradle中添加如下代碼:
apply plugin: 'realm-android'
如圖所示:

B.在project的build.gradle中添加如下代碼:
classpath "io.realm:realm-gradle-plugin:3.5.0"
如圖所示:

現(xiàn)在基本配置已經(jīng)弄好了,可以開始操作一波了。
2、數(shù)據(jù)庫基本操作(增刪改查)
在做這些操作之前我們需要新建model類(類似sqlite的新建表),這里我們需要繼承RealmObject才能被存儲在數(shù)據(jù)庫中。
public class Person extends RealmObject{
private int id;
private String name;
private int age;
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 int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
表已經(jīng)建好了,這時候可以對它CRUD(create/read/update/delete)了。
a.新增數(shù)據(jù)
這里需要說一下,新增數(shù)據(jù)操作需要在事務(wù)進行。如下所示:
Realm mRealm = Realm.getDefaultInstance();//獲取Realm實例
mRealm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
//Add a person
Person person = realm.createObject(Person.class);
person.setId(1);
person.setName("Young Person");
person.setAge(14);
}
});
或者
Realm mRealm = Realm.getDefaultInstance();//獲取Realm實例
mRealm.beginTransaction();
//Add a person
Person person = realm.createObject(Person.class);
person.setId(1);
person.setName("Young Person");
person.setAge(14);
mRealm.commitTransaction();
b.查詢數(shù)據(jù)
Realm mRealm = Realm.getDefaultInstance();//獲取Realm實例
final Person person = mRealm.where(Person.class).findFirst();//查詢第一條數(shù)據(jù)
相關(guān)查詢API如下所示:
1?? average(String fieldName) ->返回給定字段的平均值
2?? beginGroup ->開始條件分組(“左括號”)
3?? beginsWith(String fieldName,String value) ->查詢以“value”開頭的“fieldName”
4?? between(String fieldName,float from,float to) ->查詢fieldName字段在"from"和to之間
好了,方法挺多的,這里就舉幾個例子,順便給出Realm API網(wǎng)址(https://realm.io/docs/java/3.5.0/api/)有興趣的可以去看一下。
c.更新數(shù)據(jù)
Realm mRealm = Realm.getDefaultInstance();//獲取Realm實例
final Person person = mRealm.where(Person.class).findFirst();//查詢第一條數(shù)據(jù)
//更新第一條數(shù)據(jù)
mRealm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
person.setName("Senior Person");
person.setAge(88);
}
});
d.刪除數(shù)據(jù)
Realm mRealm = Realm.getDefaultInstance();//獲取Realm實例
mRealm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
//清空Person表
realm.delete(Person.class);
}
});
3、數(shù)據(jù)庫遷移(數(shù)據(jù)庫升級)
所有數(shù)據(jù)庫都要處理模型改變的情況。Realm 的數(shù)據(jù)模型用標準 Java 對象來定義,改變數(shù)據(jù)模型只需要改變數(shù)據(jù)對象定義即可。
Application中需要如下自定義配置:
// Initialize Realm. Should only be done once when the application starts.
Realm.init(this);
RealmConfiguration myConfig=new RealmConfiguration.Builder()
.schemaVersion(REALM_VERSION)
.migration(new MyConfigMigration())
.name("myrealm.realm")
.build();
Realm.setDefaultConfiguration(myConfig);
這時候我們需要自定義Migration
public class MyConfigMigration implements RealmMigration {
public static final String TAG = "ez";
@Override
public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {
realmUpdate((int) oldVersion,realm);
//官方寫法
// if (oldVersion == 0 && newVersion == 1) {
// version1(realm);
// ++oldVersion;
// }
//
// if (oldVersion == 1 && newVersion == 2) {
// version2(realm);
// ++oldVersion;
// }
}
/**
* realm數(shù)據(jù)庫遷移(升級)
* 降級:需要使用if判斷來處理
* @param oldVersion
* @param realm
*/
private void realmUpdate(int oldVersion, DynamicRealm realm) {
switch (oldVersion) {
case 0:
version1(realm);
case 1:
version2(realm);
default:
break;
}
}
/**
* version=1時,增加fullName,刪除name。
* <p>
* 注意:添加字段時,對應(yīng)的model也要對應(yīng)添加(如果標記的不為空,那么model也必須注解不為空),刪除字段時,對應(yīng)的model也要刪除,
*
* @param realm
*/
private void version1(DynamicRealm realm) {
RealmSchema schema = realm.getSchema();
RealmObjectSchema personSchema = schema.get("Person");
personSchema.addField("fullName", String.class, FieldAttribute.REQUIRED)
.transform(new RealmObjectSchema.Function() {
@Override
public void apply(DynamicRealmObject obj) {
obj.set("fullName", obj.get("name") + "Full");
}
})
.removeField("name");
}
/**
* version=2時,增加了Pet類。
*/
private void version2(final DynamicRealm realm) {
RealmSchema schema = realm.getSchema();
//創(chuàng)建對應(yīng)表和表字段
RealmObjectSchema petSchema = schema.create("Pet")
.addField("name", String.class, FieldAttribute.REQUIRED)
.addField("type", String.class, FieldAttribute.REQUIRED);
//將創(chuàng)建的表添加到Person表中
schema.get("Person")
.addRealmListField("pets", petSchema)
.transform(new RealmObjectSchema.Function() {
@Override
public void apply(DynamicRealmObject obj) {
if (obj.getString("fullName").equals("Senior PersonFull")) {
DynamicRealmObject pet = realm.createObject("Pet");
pet.setString("name", "Jemos");
pet.setString("type", "cat");
obj.getList("pets").add(pet);
}
}
});
}
}
當我們每次增加schemaVersion的值時,數(shù)據(jù)庫就會走升級操作。
好了,上面就是Realm的基本用法。詳細用法請參考官網(wǎng):
a、中文版(版本3.1.1)https://realm.io/cn/docs/java/latest/#migrations
b、英文版(版本3.5.0)https://realm.io/docs/java/latest/
c、官方Realm使用Demo https://github.com/realm/realm-java