天天看点

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全删了,这样体积缩减得更多。