Как хранить базу данных sqlite непосредственно на SD-карте с Android 28 (Pie)

#android #sqlite

Вопрос:

Я использую следующий код: https://github.com/devendrachavan/SQLiteExample

DatabaseHelperClass.java в комплекте с кодом используется:

 import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
 

Я хотел бы изменить текущий конструктор, позволяющий хранить базу данных sqlite на моей SD-карте или в другом каталоге на устройстве, доступ к которому можно получить из file explore без укоренения.

 //Constructor included in DatabaseHelperClass.java
public DatabaseHelperClass (Context context){
    super(context,DATABASE_NAME,null,DATABASE_VERSION);
}
 

Я попробовал эту вспомогательную функцию базы данных и не получил результатов:
https://titanwolf.org/Network/Articles/Article?AID=d70ad5f8-153a-48a6-951b-6be5ac3a7589

Я попытался указать жесткий путь перед ИМЕНЕМ базы данных и не получил результатов

Мой AndroidManifest.xml в настоящее время содержит:

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
 

Код будет скомпилирован, однако приложение закроется при доступе к базе данных. Я не уверен, как заставить все работать с помощью Android OS 28 Pie.

Используя следующий конструктор:

общедоступный класс базы данных (контекстный контекст) { супер(контекст, среда.getExternalStorageDirectory() Файл.разделитель ИМЯ базы ДАННЫХ, null, база данных SQLiteDatabase.OPEN_READWRITE); }

получает следующую ошибку:

Logcat(отладка):

 2021-11-03 04:02:58.992 6200-6200/com.example.sqliteexample E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.sqliteexample, PID: 6200
    java.lang.IllegalArgumentException: Version must be >= 1, was 0
        at android.database.sqlite.SQLiteOpenHelper.<init>(SQLiteOpenHelper.java:160)
        at android.database.sqlite.SQLiteOpenHelper.<init>(SQLiteOpenHelper.java:150)
        at android.database.sqlite.SQLiteOpenHelper.<init>(SQLiteOpenHelper.java:101)
        at android.database.sqlite.SQLiteOpenHelper.<init>(SQLiteOpenHelper.java:78)
        at com.example.sqliteexample.DatabaseHelperClass.<init>(DatabaseHelperClass.java:59)
        at com.example.sqliteexample.MainActivity$1.onClick(MainActivity.java:36)
        at android.view.View.performClick(View.java:7357)
        at android.widget.TextView.performClick(TextView.java:14210)
        at android.view.View.performClickInternal(View.java:7323)
        at android.view.View.access$3200(View.java:849)
        at android.view.View$PerformClick.run(View.java:27895)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:216)
        at android.app.ActivityThread.main(ActivityThread.java:7266)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:975)
2021-11-03 04:02:59.038 6200-6200/com.example.sqliteexample I/Process: Sending signal. PID: 6200 SIG: 9
 

Комментарии:

1. have tried this database helper function and didn't get results: Что пошло не так?

2. Код будет скомпилирован, однако приложение закроется при доступе к базе данных.

3. Хотел бы я, чтобы у меня было решение. Я хотел бы изменить текущий конструктор для кода, который я использую, позволяя хранить базу данных sqlite на моей SD-карте или в другом каталоге на устройстве, доступ к которому можно получить из file explore без укоренения.

4. Ты уже говорил это раньше. Зачем повторять? И разве не более важно решить проблему аварии?

5. Logcat (отладка) показывает: 2021-11-03 04:02:58.992 6200-6200/com.пример.sqliteexample E/AndroidRuntime: ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: основной процесс: com.пример.sqliteexample, PID: 6200 java.lang. Исключение IllegalArgumentException: Версия должна быть >= 1, в android.database.sqlite было 0. SQLiteOpenHelper.<init> в com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494) в com.android.internal.os.ZygoteInit.main(ZygoteInit.java:975) 2021-11-03 04:02:59.038 6200-6200/com.пример.Пример ввода-вывода sqliteexample: Отправка сигнала. PID: 6200 SIG: 9