天天看點

Realm資料庫架構使用

Realm資料庫有着不錯的性能,使用友善,但同時也有着惱人的缺點:

不能跨線程調用,就是說,你在A線程建立了Realm對象R,那麼你不能在B線程去使用這個R,解決方法:

1. copy出一個R的副本,以便在其他線程讀取。

2. 使用Handler切換到A線程,然後調用R執行存儲資料操作,并及時更新相關資料。

3. 在其他線程建立新的Realm對象R2,利用R2存儲資料,然後通知其他線程重新去資料庫擷取最新資料。

一些參考資料:

http://www.jianshu.com/p/52a9f84b158f

http://www.cnblogs.com/RaphetS/p/5996265.html

http://www.jianshu.com/p/fdc9492b714a

https://www.zhihu.com/question/30298585

ndk沖突:

http://blog.csdn.net/u010134293/article/details/53375137

http://blog.csdn.net/jabony/article/details/65441297

方法數量超過限制:

http://blog.csdn.net/hjz19921130/article/details/73610238

過濾掉不支援的平台,那麼打包成APK之後體積就不會那麼大了:

// We don't use these .so files of Realm, remove theme to reduce the size of APK file.
    packagingOptions {
        exclude "lib/arm64-v8a/librealm-jni.so"
        exclude "lib/mips/librealm-jni.so"
        exclude "lib/x86/librealm-jni.so"
        exclude "lib/x86_64/librealm-jni.so"
    }

    defaultConfig {
        ndk {
            abiFilters "armeabi", 'armeabi-v7a'
        }
    }
           

NDK so庫沖突(找不到)的問題:

現在場景是這樣的:Realm不支援armeabi,而我的項目隻支援armeabi,編譯的時候,報找不到so庫的錯誤。

解決方法:

1. gradle(Module:app)中增加:

defaultConfig {
        ndk {
            abiFilters "armeabi", 'armeabi-v7a'
        }
    }
           

以支援armeabi和armeabi-v7a兩種架構。

2. 在項目的app/libs路徑下,也就是armeabi檔案夾所在路徑,建立一個armeabi-v7a檔案夾,并把armeabi裡的so全部拷貝到armeabi-v7a檔案夾裡。

對于一般的項目而言,上面兩步就解決了,然後我這個項目最坑的地方就是:引用了一個aar檔案,這個aar檔案裡居然也有so庫!剛開始的時候,我一直納悶,為什麼明明沒有問題啊,原來是這個aar裡隻支援armeabi,好吧,那我就把aar解壓,取出裡面的so庫,拷貝到我們在步驟2建立的檔案夾裡。編譯,終于通過了。

Tips:如果你确定你的項目隻需要支援的armeabi-v7a的話,甚至可以把armeabi全删了,這樣體積縮減得更多。