SqlCipher:无法在 Android 6.0.1 上打开数据库
SqlCipher: Could not open database on Android 6.0.1
以前我只使用 SQLite,从来没有遇到过问题,我只是改用 SQLCipher,在版本 7、8、8.1、9 的设备上它工作正常,只是 Android 6.0.1 我有以下错误:
net.sqlcipher.database.SQLiteException: error code 14: Could not open database
at net.sqlcipher.database.SQLiteDatabase.dbopen(Native Method)
at net.sqlcipher.database.SQLiteDatabase.openDatabaseInternal(SQLiteDatabase.java:2575)
at net.sqlcipher.database.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1243)
at net.sqlcipher.database.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1210)
at net.sqlcipher.database.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1182)
at net.sqlcipher.database.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1131)
at net.sqlcipher.database.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:1332)
at android.xdl.dripapp_opencv.DB.DBSettings.InitializeDatabase(DBSettings.java:41)
at android.xdl.dripapp_opencv.MainActivity.onCreate(MainActivity.java:109)
at android.app.Activity.performCreate(Activity.java:6262)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1125)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2462)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2569)
at android.app.ActivityThread.access0(ActivityThread.java:150)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1399)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:168)
at android.app.ActivityThread.main(ActivityThread.java:5885)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:797)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687)
我正在使用以下方法创建数据库,它在我的 MainActivity 的 onCreate 方法上被调用:
数据库设置
public void InitializeDatabase(){
SQLiteDatabase.loadLibs(_ctx);
String databasePath = _ctx.getDatabasePath(DATABASE_FILE_NAME).getPath();
SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(databasePath, DATABASE_PASS, null);
database.execSQL(CREATE_PATIENT_RECORDS_TABLE);
database.execSQL(CREATE_SESSION_RECORDS_TABLE);
database.close();
}
我对清单有以下权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
我什至尝试过像其他答案所说的那样在运行时请求该权限,但没有成功,我得到了对话框,在我接受权限后出现了同样的错误。
我试过不使用路径而是使用文件,我得到了同样的错误:
File databaseFile = getDatabasePath(DATABASE_FILE_NAME);
SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(databaseFile, DATABASE_PASS, null);
我试过使用 mkdir
作为 SQLCipher 的文档站点所说的,但没有。
File databaseFile = getDatabasePath(DATABASE_FILE_NAME);
databaseFile.mkdirs();
我正在使用此版本的 SQLCipher:
implementation 'net.zetetic:android-database-sqlcipher:4.2.0@aar'
在我的 6.0.1 设备上 运行 所有测试成功后,深入研究 SqlCipher Tests Project,发现文档中的说法和实施方式不同。
现在正在运行的是:
databaseFile.getParentFile().mkdirs();
而不是:
databaseFile.mkdirs();
以前我只使用 SQLite,从来没有遇到过问题,我只是改用 SQLCipher,在版本 7、8、8.1、9 的设备上它工作正常,只是 Android 6.0.1 我有以下错误:
net.sqlcipher.database.SQLiteException: error code 14: Could not open database
at net.sqlcipher.database.SQLiteDatabase.dbopen(Native Method)
at net.sqlcipher.database.SQLiteDatabase.openDatabaseInternal(SQLiteDatabase.java:2575)
at net.sqlcipher.database.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1243)
at net.sqlcipher.database.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1210)
at net.sqlcipher.database.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1182)
at net.sqlcipher.database.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1131)
at net.sqlcipher.database.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:1332)
at android.xdl.dripapp_opencv.DB.DBSettings.InitializeDatabase(DBSettings.java:41)
at android.xdl.dripapp_opencv.MainActivity.onCreate(MainActivity.java:109)
at android.app.Activity.performCreate(Activity.java:6262)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1125)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2462)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2569)
at android.app.ActivityThread.access0(ActivityThread.java:150)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1399)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:168)
at android.app.ActivityThread.main(ActivityThread.java:5885)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:797)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687)
我正在使用以下方法创建数据库,它在我的 MainActivity 的 onCreate 方法上被调用:
数据库设置
public void InitializeDatabase(){
SQLiteDatabase.loadLibs(_ctx);
String databasePath = _ctx.getDatabasePath(DATABASE_FILE_NAME).getPath();
SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(databasePath, DATABASE_PASS, null);
database.execSQL(CREATE_PATIENT_RECORDS_TABLE);
database.execSQL(CREATE_SESSION_RECORDS_TABLE);
database.close();
}
我对清单有以下权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
我什至尝试过像其他答案所说的那样在运行时请求该权限,但没有成功,我得到了对话框,在我接受权限后出现了同样的错误。
我试过不使用路径而是使用文件,我得到了同样的错误:
File databaseFile = getDatabasePath(DATABASE_FILE_NAME);
SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(databaseFile, DATABASE_PASS, null);
我试过使用 mkdir
作为 SQLCipher 的文档站点所说的,但没有。
File databaseFile = getDatabasePath(DATABASE_FILE_NAME);
databaseFile.mkdirs();
我正在使用此版本的 SQLCipher:
implementation 'net.zetetic:android-database-sqlcipher:4.2.0@aar'
在我的 6.0.1 设备上 运行 所有测试成功后,深入研究 SqlCipher Tests Project,发现文档中的说法和实施方式不同。
现在正在运行的是:
databaseFile.getParentFile().mkdirs();
而不是:
databaseFile.mkdirs();