Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android net.sqlcipher.database.SQLiteException在恢复应用程序后打开数据库时发生异常_Android_Sqlite_Sqlcipher - Fatal编程技术网

Android net.sqlcipher.database.SQLiteException在恢复应用程序后打开数据库时发生异常

Android net.sqlcipher.database.SQLiteException在恢复应用程序后打开数据库时发生异常,android,sqlite,sqlcipher,Android,Sqlite,Sqlcipher,在我的Android应用程序中使用加密数据库时,我遇到以下错误,但只能断断续续: net.sqlcipher.database.SQLiteException: not an error at net.sqlcipher.database.SQLiteDatabase.dbopen(Native Method) at net.sqlcipher.database.SQLiteDatabase.<init>(SQLiteDatabase.java:1950) a

在我的Android应用程序中使用加密数据库时,我遇到以下错误,但只能断断续续:

net.sqlcipher.database.SQLiteException: not an error
    at net.sqlcipher.database.SQLiteDatabase.dbopen(Native Method)
    at net.sqlcipher.database.SQLiteDatabase.<init>(SQLiteDatabase.java:1950)
    at net.sqlcipher.database.SQLiteDatabase.openDatabase(SQLiteDatabase.java:900)
    at net.sqlcipher.database.SQLiteDatabase.openDatabase(SQLiteDatabase.java:947)
    at net.sqlcipher.database.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:195)
    at com.android.storage.DatabaseHelper.getReadable(DatabaseHelper.java:99)
    ...
net.sqlcipher.database.SQLiteException:不是错误
在net.sqlcipher.database.SQLiteDatabase.dbopen(本机方法)
位于net.sqlcipher.database.SQLiteDatabase.(SQLiteDatabase.java:1950)
位于net.sqlcipher.database.SQLiteDatabase.openDatabase(SQLiteDatabase.java:900)
位于net.sqlcipher.database.SQLiteDatabase.openDatabase(SQLiteDatabase.java:947)
位于net.sqlcipher.database.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:195)
位于com.android.storage.DatabaseHelper.getReadable(DatabaseHelper.java:99)
...
我在
assets/
libs/
文件夹中找到了合适的文件,因为数据库大部分时间都工作正常。然而,每隔一段时间我就会看到这个错误。我已经在我的手机上看到过两次了,它总是在几个小时的不活动后恢复应用程序(如果从内存中清除了用户的oauth令牌,我会在db中检查它)


我只从Application::onCreate()方法调用“SQLiteDatabase.loadLibs(this)”,所以我的直觉是,这不会在简历中被调用,而是抛出错误这听起来可能吗?如果可能,我应该在哪里调用loadLibs?用户可以在任何活动中输入应用程序,如果令牌不在内存中,我可以访问db。我将我的选项视为在每个Activity::onCreate上调用loadLibs,或者在每次尝试打开db时调用loadLibs<如果我多次调用它,它会造成任何伤害或性能问题吗?< /强>

< p>您可以考虑移动<代码> SQLITDATABASE。code>到
net.sqlcipher.database.SQLiteOpenHelper
的应用程序子类。然后可以将
应用程序
子类的静态实例作为其参数传递。类似以下内容可能是一个示例:

public class SchemaManager extends net.sqlcipher.database.SQLiteOpenHelper {

  private static SchemaManager instance;

  public static synchronized SchemaManager getInstance() {
    if(instance == null) {
      SQLiteDatabase.loadLibs(YourApplication.getInstance());
      instance = new SchemaManager(…)
    }
    return instance;
  }
}

关于提供的异常,Java例程调用JNI层,该层调用
sqlite3\u open\u v2
,设置软堆限制并设置忙超时。我建议在本地添加日志记录,以验证在发生崩溃时尝试获取
SQLiteDatabase
实例时是否传递了有效路径和非空密码短语。调用
SQLiteDatabase.loadLibs(this)多次不应造成明显的性能影响,发生的大部分调用是对
System.loadLibrary(…)
的调用,这些调用被映射到
Runtime.getRuntime().loadLibrary(…)
,一旦加载了动态库,随后的调用将被忽略。

您正在用于SQLiteDatabase的是外部库吗?因为默认导入是android.database.sqlite.SQLiteDatabase;是的,我正在使用加密数据库。我更新了这个问题来说明这一点。真的很奇怪。我也有同样的问题。我将尝试建议的解决方案,希望不会对性能产生任何影响,因为进行此更改后,我没有看到问题。谢谢Nick。嗨Nick,即使我们尝试以静态方式加载库,我们仍然会遇到这个问题。几乎相同的错误(我可以说相同,因为堆栈跟踪也相同)。调用getReadableDatabase()或getWritableDatabase()是从多个线程进行的,我们尝试将“同步”添加到getReadableDatabase()和getWritableDatabase()函数中。