Android 資料庫-Realm
阿新 • • 發佈:2018-11-17
前言
接上一章Room,Leader說Room作為一個新框架才出來不久,坑應該不少!(無法反駁- -~!!)所以我們採用Realm,並且這玩意三端都可以用(神特麼,以為寫一套程式碼適配三端??),總之一堆理由,So,抱著對學習無比的熱愛和對知識的渴求,(受不了Leader BB被逼換庫- -!)來填一填Realm的坑。
內容
Realm
開源;效率高;跨平臺,Android、IOS、前端、後臺、PC都可以用,但是程式碼會有所不同
Git:https://github.com/realm/realm-cocoa
使用
網上有很多教程,大多是翻譯官網教程的,想詳細瞭解可以自行Google,這裡只說通常大家的用法。
因為他是作為一個外掛被引用的,所以首先新增
1 在Project build.gradle 新增ClassPath
dependencies {
...
classpath 'com.android.tools.build:gradle:2.3.3'
classpath "io.realm:realm-gradle-plugin:5.1.0"
...
}
2 在Module build.gradle 新增 plugin
apply plugin: 'realm-android'
3 初始化資料庫
寫一個NApplication 繼承Application,然後替換manifest裡面name為自己的Application。
<application
android:name=".NApplication"
...
/>
在NApplicaiotn onCreate()裡面初始化資料庫。
Realm.init(this);
RealmConfiguration config = new RealmConfiguration.Builder()
.name("realm_demo.realm")
.rxFactory(new RealmObservableFactory())
.schemaVersion(1 )
.build();
Realm.setDefaultConfiguration(config);
try {
Realm.migrateRealm(config, new Migration());
} catch (FileNotFoundException ignored) {
// If the Realm file doesn't exist, just ignore.
}
OK,編譯一下就可以用了。
CURD
1 首先看下宣告物件。有兩種選擇
- extends RealmObject
- implements RealmModel 並且新增 @RealmClass
@RealmClass
public class UserRealm implements RealmModel {
...
}
// 或者
public class UserRealm extends RealmObject {
...
}
不支援主鍵自增,需要新增主鍵的話要加@PrimaryKey
2 增刪改查的寫法
有很多種寫法,這裡只說通常用的寫法,有executeTransaction和executeTransactionAsync。支援事務的一個非同步一個不是非同步。
// 新增資料
mRealm.executeTransaction({ realm ->
val user = UserRealm("Webber", 25, Date(System.currentTimeMillis()))
realm.insert(user)
})
//查詢資料
mRealm.executeTransaction({ realm ->
val users = realm.where(UserRealm::class.java).findAll()
})
// 刪除資料 & 更新資料 (查出來之後直接操作物件即可)
資料庫升級及資料遷移
佔坑
Realm的坑
- ID 不能自增
- 實體類只能 繼承RealmObjet 或者實現RealmModel加@RealmClass註解。
- 查詢出來的資料需要copyFromRealm()
- Realm 的建立和關閉必須在同一個執行緒
- 只有Query可以與RX連用,返回Flowable
參考:Realm資料庫的那些坑
總結
大感覺上手沒Room好用,但是查詢效率確實比Room快,但是移動端有多少機會可以處理10W條以上的資料庫資料- -…