Unrecoverable error. Permission denied in /Users/cm/Realm/realm-java/realm/realm-library/src/main/cpp/io_realm_internal_SharedRealm.cpp

这是一个在使用realm-java数据库时出现的问题,常见于华为的部分手机,以下是官方项目下的issue
realm-issues

如何复现

官方的演示
总结下来就是在部分手机不删除数据情况下恢复出厂设置或者进行OTA升级之后,系统会对安装的app重新分配uid,但是这时候有些文件却没有分配成功,用的还是老的uid,这里realm使用的fifo文件在这些手机中就会出现。uid不同就会导致我们在访问这个文件的时候缺少权限,官方开发人员也给出了fifo文件的操作示例:
https://github.com/beeender/HuaweiFifoTest
这里我们可以自己去操作,手动修改自己项目中uid,触发这个bug,当然前提需要root,并且装了RE管理器,然后找到项目的realm文件->更改所有者(所有者 UID,用户组 GID),把UID改成其他的之后,需要覆盖安装一次App,然后在第一次调用Realm.getDefaultInstance()时候会触发。

Unrecoverable error. Permission denied in /Users/cm/Realm/realm-java/realm/realm-library/src/main/cpp/io_realm_internal_SharedRealm.cpp_第1张图片
411511955890_.pic.jpg

解决方法

我们可以在初始化完realm之后,主动去调用一次Realm.getDefaultInstance(),通过捕获这两个异常来重建realm数据库。

Unrecoverable error. Permission denied in /Users/cm/Realm/realm-java/realm/realm-library/src/main/cpp/io_realm_internal_SharedRealm.cpp_第2张图片
image.png

在issue下,官方其实并没有给出最合适的解决方法,有开发人员使用了
((ActivityManager)context.getSystemService(ACTIVITY_SERVICE)) .clearApplicationUserData();
但对于我们某些业务繁重的App来说,这样直接清空用户所有数据的操作显然不妥,但也有人员提出Realm.deleteRealm(configuration),其实没有权限去删除出问题的数据库,但经过我这边的测试并没有发现问题。。。后续再看bug率有没有下滑吧。

你可能感兴趣的:(Unrecoverable error. Permission denied in /Users/cm/Realm/realm-java/realm/realm-library/src/main/cpp/io_realm_internal_SharedRealm.cpp)