1. 程式人生 > >Android 資料庫-Realm

Android 資料庫-Realm

前言

接上一章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 首先看下宣告物件。有兩種選擇

  1. extends RealmObject
  2. 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的坑

  1. ID 不能自增
  2. 實體類只能 繼承RealmObjet 或者實現RealmModel加@RealmClass註解。
  3. 查詢出來的資料需要copyFromRealm()
  4. Realm 的建立和關閉必須在同一個執行緒
  5. 只有Query可以與RX連用,返回Flowable

參考:Realm資料庫的那些坑

總結

大感覺上手沒Room好用,但是查詢效率確實比Room快,但是移動端有多少機會可以處理10W條以上的資料庫資料- -…

參考:【Android】Realm詳解