subtitle: "讓你的應(yīng)用迅速帶上存儲的翅膀
-
簡介
Realm是一個可以替代SQLite以及ORMlibraries的輕量級數(shù)據(jù)庫痹屹。相比SQLite老赤,Realm更快并且具有很多現(xiàn)代數(shù)據(jù)庫的特性轮洋,比如支持JSON,流式api抬旺,數(shù)據(jù)變更通知弊予,以及加密支持,這些都為安卓開發(fā)者帶來了方便开财。
準(zhǔn)確來說块促,它是專門為移動應(yīng)用所設(shè)計的數(shù)據(jù)持久化解決方案之一荣堰。
Realm 可以輕松地移植到您的項目當(dāng)中,并且絕大部分常用的功能(比如說插入竭翠、查詢等等)都可以用一行簡單的代碼輕松完成振坚!
Realm 并不是對 Core Data 的簡單封裝,相反地斋扰, Realm 并不是基于 Core Data 渡八,也不是基于 SQLite 所構(gòu)建的。它擁有自己的數(shù)據(jù)庫存儲引擎传货,可以高效且快速地完成數(shù)據(jù)庫的構(gòu)建操作屎鳍。
-
優(yōu)點
跨平臺 :現(xiàn)在絕大多數(shù)的應(yīng)用開發(fā)并不僅僅只在 iOS 平臺上進行開發(fā),還要兼顧到 Android 平臺的開發(fā)问裕。為兩個平臺設(shè)計不同的數(shù)據(jù)庫是愚蠢的逮壁,而使用 Realm 數(shù)據(jù)庫, iOS 和 Android 無需考慮內(nèi)部數(shù)據(jù)的架構(gòu)粮宛,調(diào)用 Realm 提供的 API 就可以完成數(shù)據(jù)的交換窥淆,實現(xiàn) “ 一個數(shù)據(jù)庫,兩個平臺無縫銜接 ” 巍杈。
簡單易用 : Core Data 和 SQLite 冗余忧饭、繁雜的知識和代碼足以嚇退絕大多數(shù)剛?cè)腴T的開發(fā)者,而換用 Realm 筷畦,則可以極大地減少學(xué)習(xí)代價和學(xué)習(xí)時間词裤,讓應(yīng)用及早用上數(shù)據(jù)存儲功能。
可視化 : Realm 還提供了一個輕量級的數(shù)據(jù)庫查看工具鳖宾,借助這個工具吼砂,開發(fā)者可以查看數(shù)據(jù)庫當(dāng)中的內(nèi)容,執(zhí)行簡單的插入和刪除數(shù)據(jù)的操作鼎文。畢竟渔肩,很多時候,開發(fā)者使用數(shù)據(jù)庫的理由是因為要提供一些所謂的 “ 知識庫 ” 漂问。
-
使用
CURD操作
Realm規(guī)定所有改動操作必須在事務(wù)中進行, 即改動操作必須在Realm的beginTransaction()和commitTransaction()方法之間進行 或者在executeTransaction方法的參數(shù)的回調(diào)中執(zhí)行. 改動操作有: createObject/copyXxx/insert/deleteXxx 等
引入
dependencies {
compile 'io.realm:realm-android:0.87.0'
}
-
初始化
/*初始化*/
RealmConfiguration realmConfiguration = new RealmConfiguration.Builder(this)
.name("test1.realm")// 存儲文件名稱赖瞒,類似db文件名
.migration(new RealmMigration() { // 當(dāng)本地已經(jīng)存在的數(shù)據(jù)版本跟當(dāng)前運行的不一致會調(diào)用此方法
@Override
public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {
newVersion = oldVersion + 1;
}
})
.build();
final Realm myRealm = Realm.getInstance(realmConfiguration);// 設(shè)置配置
-
類的定義
我們定義的類,必須繼承于RealmObject蚤假±敢看下我們定義的Person類
加了@PrimaryKey 的為主鍵,當(dāng)然磷仰,我們也可以不加
public class Person extends RealmObject {
@PrimaryKey
private int id;
private String name;
private int age;
public Person() {
}
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 getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
-
清空表
//清空表
myRealm.beginTransaction();
myRealm.clear(Person.class);
myRealm.commitTransaction();
-
增
//兩種添加方式
myRealm.beginTransaction();
Person person = myRealm.createObject(Person.class);
person.setId(10);
person.setAge(10);
person.setName("xiamin");
myRealm.commitTransaction(); //有主鍵的表袍嬉,這種操作要是主鍵重復(fù)了可是會報異常的
person = new Person();
person.setId(13);
person.setAge(13);
person.setName("xiamin");
myRealm.beginTransaction();
myRealm.copyToRealmOrUpdate(person); // 若是沒有主鍵的表,則不能執(zhí)行該操作哦 通過主鍵查詢它的對象,如果查詢到了伺通,則更新它箍土,否則新建一個對象來代替。
myRealm.commitTransaction();
-
刪
//刪
Log.i("xiamin", "刪除第一個");
final RealmResults<Person> list= myRealm.where(Person.class).findAll();
myRealm.beginTransaction();
list.get(0).removeFromRealm();
myRealm.commitTransaction();
-
改
//改
Log.i("xiamin", "修改age = 7的名字為xiamin2");
myRealm.beginTransaction();
person = myRealm.where(Person.class).equalTo("age",7).findFirst();
person.setName("xiamin2");
myRealm.commitTransaction();
-
查
//查 + 排序
Log.i("xiamin", "查詢結(jié)果");
RealmResults<Person> results =
myRealm.where(Person.class).findAllSorted("age");
for (Person s: results) {
Log.i("xiamin", "id:" + s.getId() + " name:" + s.getName() + " age:" + s.getAge());
}
常見的條件如下(詳細資料請查官方文檔):
between(), greaterThan(), lessThan(), greaterThanOrEqualTo() & lessThanOrEqualTo()
equalTo() & notEqualTo()
contains(), beginsWith() & endsWith()
isNull() & isNotNull()
isEmpty() & isNotEmpty()
常見問題
A RealmObject with no @PrimaryKey cannot be updated: class com.jerey.realmdemo.Person
一個沒有主鍵的類是不使用copyToRealmOrUpdate的Android Realm: Primary key constraint broken. Value already exists: 0
有主鍵的類罐监,主鍵重復(fù)了the xxx RealmMigration must be provided
出現(xiàn)這個問題的時候是因為吴藻,沒有初始化時沒有提供migration沒有在beginTransaction();與commitTransaction(); 就進行了事物修改等
謝謝大家閱讀,如有幫助弓柱,來個喜歡或者關(guān)注吧沟堡!
本文作者:Anderson/Jerey_Jobs
博客地址 : 夏敏的博客/Anderson大碼渣/Jerey_Jobs
簡書地址 : Anderson大碼渣
CSDN地址 : Jerey_Jobs的專欄
github地址 : Jerey_Jobs