#android #sqlite #sqlcipher-android
#Android #sqlite #sqlcipher-android
Вопрос:
У меня есть база данных sqllite cipher, которая хранится в папке Downloads файловой системы внутренней памяти Android. Я могу прочитать его, указав пароль с помощью «DB browser for sqllite» обычным способом на моем рабочем столе из любого места на жестком диске. Теперь я хочу импортировать эти данные БД в мое приложение Android Studio из стандартной команды sqllite openDatabase (). Пожалуйста, предложите мне.
Я реализовал следующий код, но он выдает ошибку-
package com.example.k1.sqlliteload;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.database.Cursor;
import android.os.Environment;
import android.widget.TextView;
import net.sqlcipher.database.SQLiteDatabase;
import java.io.File;
public class MainActivity extends AppCompatActivity {
TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);`enter code here`
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.textView1);
SQLiteDatabase.loadLibs(this);
openDB();
}
void openDB() {
String fileLoc = Environment.getExternalStorageDirectory() "/Download/" "b.db";
SQLiteDatabase mydatabase = SQLiteDatabase.openDatabase(fileLoc, "123", null, SQLiteDatabase.OPEN_READWRITE);
//--------------Select all rows--------------------------------------------
Cursor cursor1 = mydatabase.rawQuery("select * from conmast", null);
if (cursor1.moveToFirst()) {
while (cursor1.isAfterLast() == false) {
String c11 = String.valueOf(cursor1.getInt(0));
String c22 = cursor1.getString(1);
tv.append(c11 " " c22 " " "n");
cursor1.moveToNext();
}
}
cursor1.close();
tv.append("//////////////////////////////////////////////////n");
}
}
Добавлено в build.gradle
compile 'net.zetetic:android-database-sqlcipher:3.5.4@aar'
Сообщение об ошибке:
10-07 12:20:36.224 12237-12237/com.example.k1.sqlliteload E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.k1.sqlliteload, PID: 12237
java.lang.RuntimeException: Unable to start activity
ComponentInfo{com.example.k1.sqlliteload/com.example.k1.sqlliteload.MainActivity}:
net.sqlcipher.database.SQLiteException: error code 14: Could not open database
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2434)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2494)
at android.app.ActivityThread.access$900(ActivityThread.java:153)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1347)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5451)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: 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:2353)
at net.sqlcipher.database.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1116)
at net.sqlcipher.database.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1083)
at net.sqlcipher.database.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1032)
at net.sqlcipher.database.SQLiteDatabase.openDatabase(SQLiteDatabase.java:986)
at com.example.k1.sqlliteload.MainActivity.openDB(MainActivity.java:32)
at com.example.k1.sqlliteload.MainActivity.onCreate(MainActivity.java:23)
at android.app.Activity.performCreate(Activity.java:6323)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2387)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2494)
at android.app.ActivityThread.access$900(ActivityThread.java:153)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1347)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5451)
at java.lang.reflect.Method.invoke(Native Method)
Комментарии:
1. Насколько я знаю, вы не можете открыть базу данных непосредственно с SD-карты по любому пути, вам нужно скопировать ее в каталог данных приложения
2. Я использовал описанный выше метод для успешного импорта базы данных sqlite с sdcard. Но то же самое не работает в SQLCipher.
3. Разве вам не нужно убедиться, что вы mkdirs() папки перед?
Ответ №1:
Я получил исключение после копирования файла базы database
данных в каталог Android. После копирования database
файла я снова попытался скопировать базу данных в какой-либо каталог
val src = getDatabasePath(srcName)
if (src.exists()){
src.parent?.run {
src.copyTo(File(File(this), destName))
}
}
Произошла очень удивительная вещь, этот фрагмент кода выдает исключение
FileNotFound (отказано в разрешении)
Это потому, что android studio передала не разрешение пользователя устройства Android
Решение
Скопируйте файл базы данных через assets
folder runtime
copyFile(assets.open("src.db"), FileOutputStream(getDatabasePath("dest.db")))
Теперь у вас должно быть точное permission