一、简单介绍Realm
在我们开发App时,有些时候需要我们本地保存数据,而我们保存本地数据的方式有文件保存(file)、Sqilite轻量级数据库、SharedPreferences(XML文件形式)等选择,虽说都能用于保存本地数据,但他们有各自的适应性,在某些方面各有差异。对于有大量复杂查询的数据保存,我们一般会选用Sqlite的方式,但其原始的使用略复杂,代码量较大,因此有一些基于Sqlite的优秀开源关系数据库框架可用,如GreenDao,ActivieAndroid等。
那Realm是什么呢?Realm是一种不同于Sqlite的轻量级关系数据库,具有很多现在数据库的特性,基本满足功能开发的需要,而且在速度上要优于Sqlite,是一个不错的选择。有新的东西,当然要试着用用。
二、导入Realm框架
框架的导入这一部分就不写了,github框架首页或百度都能找到。
三、遇到的问题
大部分手机正常初始化,部分手机提示出现闪退现象,提示 librealm-jni.so 该文件 is 32-bit instead of 64-bit 的错误,导致Realm在Application 文件中初始化时异常导致应用闪退。
看到是so文件的字样,以及后面的32位和64位的错误xi信息字样,基本就可以定位到jniLibs文件夹中的文件导入有问题,可是Realm的导入操作中,根本不需要复制添加文件啊,都是自动导入的。以前遇到过类似问题,armeabi、armeabi、armeabi64-v8a等文件,由于相应的文件夹存在,导致xian相应的CPU架构的APK会在相应的文件夹中加载so文件。
查了查文件夹对应的架构,删掉了armeabi64-v8a尝试,然而还是失败。随后通过百度,找到了一个解决方案,就是在打包默认配置里加上(app.gradle文件中)
android {
//…
packagingOptions {
exclude “lib/arm64-v8a/librealm-jni.so” 即过滤掉arm64-v8a中的librealm-jni.so文件
}
//…
}
然后运行成功了,当我以为问题解决时,原来可以运行的64位手机又不能运行了,返回的还是librealm-jni.so文件的错误,但错误信息确反过来了is 64-bit instead of 32-bit ,这真是折腾。。。。
最后查看了关于so导入的相关资料,可以知道,64位的可以兼容32位的,因此我们只要保持32位的架构支持就OK了,虽然这样会对一些64位的手机产生性能影响,但为了兼容性,实在是没办法,毕竟性能的追求应该基于没毛病。
所以最终的解决方案是:
defalutConfig{
ndk{ abiFilters("armeabi", "armeabi-v7a") //除了armeabi、armeabi-v7a的文件,其它都过滤掉 }
}
希望对遇到同样问题的朋友有帮助。