Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.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
尝试写入只读数据库,在使用SqlCipher时在android 5.0v设备上崩溃_Android_Database_Sqlite_Readonly_Sqlcipher - Fatal编程技术网

尝试写入只读数据库,在使用SqlCipher时在android 5.0v设备上崩溃

尝试写入只读数据库,在使用SqlCipher时在android 5.0v设备上崩溃,android,database,sqlite,readonly,sqlcipher,Android,Database,Sqlite,Readonly,Sqlcipher,在我的应用程序中,我使用的是从这里下载的SqlCipher for Android。它在安卓版本高达4.4v的设备上运行良好。但android 5.0v设备上的应用程序崩溃了。下面是代码片段 public DBHelperCipher(Context context) { super(context, DB_PATH, null, DB_VERSION); db = getWritableDatabase("password");// crash occurs at this l

在我的应用程序中,我使用的是从这里下载的SqlCipher for Android。它在安卓版本高达4.4v的设备上运行良好。但android 5.0v设备上的应用程序崩溃了。下面是代码片段

public DBHelperCipher(Context context) {
    super(context, DB_PATH, null, DB_VERSION);
    db = getWritableDatabase("password");// crash occurs at this line
}
我调用这个DbHelperClipher类,如下所示

public class ProcessDBCipherInitTask extends AsyncTask <Void, Void, Boolean>{

    private Context ctx;
    public ProcessDBCipherInitTask(Context ctx){
        this.ctx=ctx;
    }

    @Override
    protected Boolean doInBackground(Void... arg0) {
        SQLiteDatabase.loadLibs(ctx);
        dbHelper = new DBHelperCipher(ctx);
        return true;
    }
}
公共类ProcessDBCipherInitTask扩展异步任务{
私有上下文ctx;
公共进程加密任务(上下文ctx){
这个.ctx=ctx;
}
@凌驾
受保护的布尔doInBackground(无效…arg0){
loadLibs(ctx);
dbHelper=新的DBHelperCipher(ctx);
返回true;
}
}
事故日志是

java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:300)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
Caused by: net.sqlcipher.database.SQLiteException: attempt to write a readonly database
at net.sqlcipher.database.SQLiteDatabase.native_setLocale(Native Method)
at net.sqlcipher.database.SQLiteDatabase.setLocale(SQLiteDatabase.java:2096)
at net.sqlcipher.database.SQLiteDatabase.<init>(SQLiteDatabase.java:1962)
at net.sqlcipher.database.SQLiteDatabase.openDatabase(SQLiteDatabase.java:881)
at net.sqlcipher.database.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:913)
at net.sqlcipher.database.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:132)
at net.sqlcipher.database.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:99)
at PackageName.DBHelperCipher.<init>(DBHelperCipher.java:93)
at PackageName.ProcessDBCipherInitTask.doInBackground(ProcessDBCipherInitTask.java:20)
at PackageName.ProcessDBCipherInitTask.doInBackground(ProcessDBCipherInitTask.java:1)
at android.os.AsyncTask$2.call(AsyncTask.java:288)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
... 4 more
net.sqlcipher.database.SQLiteException: attempt to write a readonly database
at net.sqlcipher.database.SQLiteDatabase.native_setLocale(Native Method)
at net.sqlcipher.database.SQLiteDatabase.setLocale(SQLiteDatabase.java:2096)
at net.sqlcipher.database.SQLiteDatabase.<init>(SQLiteDatabase.java:1962)
at net.sqlcipher.database.SQLiteDatabase.openDatabase(SQLiteDatabase.java:881)
at net.sqlcipher.database.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:913)
at net.sqlcipher.database.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:132)
at net.sqlcipher.database.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:99)
at PackageName.DBHelperCipher.<init>(DBHelperCipher.java:93)
at PackageName.ProcessDBCipherInitTask.doInBackground(ProcessDBCipherInitTask.java:20)
at PackageName.ProcessDBCipherInitTask.doInBackground(ProcessDBCipherInitTask.java:1)
at android.os.AsyncTask$2.call(AsyncTask.java:288)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
java.lang.RuntimeException:执行doInBackground()时出错
在android.os.AsyncTask$3.done(AsyncTask.java:300)
位于java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
位于java.util.concurrent.FutureTask.setException(FutureTask.java:222)
位于java.util.concurrent.FutureTask.run(FutureTask.java:242)
在android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
运行(Thread.java:818)
原因:net.sqlcipher.database.SQLiteException:尝试写入只读数据库
位于net.sqlcipher.database.SQLiteDatabase.native_setLocale(本机方法)
位于net.sqlcipher.database.SQLiteDatabase.setLocale(SQLiteDatabase.java:2096)
在net.sqlcipher.database.SQLiteDatabase.(SQLiteDatabase.java:1962)
位于net.sqlcipher.database.SQLiteDatabase.openDatabase(SQLiteDatabase.java:881)
位于net.sqlcipher.database.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:913)
位于net.sqlcipher.database.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:132)
位于net.sqlcipher.database.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:99)
在PackageName.DBHelperCipher上。(DBHelperCipher.java:93)
在PackageName.ProcessDBCipherInitTask.doInBackground(ProcessDBCipherInitTask.java:20)
在PackageName.ProcessDBCipherInitTask.doInBackground(ProcessDBCipherInitTask.java:1)
在android.os.AsyncTask$2.call(AsyncTask.java:288)
位于java.util.concurrent.FutureTask.run(FutureTask.java:237)
... 4更多
net.sqlcipher.database.SQLiteException:尝试写入只读数据库
位于net.sqlcipher.database.SQLiteDatabase.native_setLocale(本机方法)
位于net.sqlcipher.database.SQLiteDatabase.setLocale(SQLiteDatabase.java:2096)
在net.sqlcipher.database.SQLiteDatabase.(SQLiteDatabase.java:1962)
位于net.sqlcipher.database.SQLiteDatabase.openDatabase(SQLiteDatabase.java:881)
位于net.sqlcipher.database.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:913)
位于net.sqlcipher.database.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:132)
位于net.sqlcipher.database.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:99)
在PackageName.DBHelperCipher上。(DBHelperCipher.java:93)
在PackageName.ProcessDBCipherInitTask.doInBackground(ProcessDBCipherInitTask.java:20)
在PackageName.ProcessDBCipherInitTask.doInBackground(ProcessDBCipherInitTask.java:1)
在android.os.AsyncTask$2.call(AsyncTask.java:288)
位于java.util.concurrent.FutureTask.run(FutureTask.java:237)
在android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
运行(Thread.java:818)
我在下图所示的项目中添加了jar文件

我为它寻找了一个解决方案,但没有找到一个有效的解决方案。请有人帮忙


谢谢。

使用LogCat检查与崩溃相关的Java堆栈跟踪:@commonware,已编辑的问题,请查看。。。谢谢。请尝试卸载并重新安装您的应用程序,或使用“设置”中应用程序页面上的“清除数据”按钮。感觉像是文件权限被搞乱了,SQLCipher无法获得对数据库文件的写入权限。@Commonware,请查看此线程