Подтвердить что ты не робот

База данных SQLite на SD-карте

Я ищу для создания базы данных sqlite на SD-карте (не хочу использовать внутреннее хранилище пользователя). Я знаком с шаблоном OpenHelper:

public DatabaseFoo(Context context) {
    OpenHelper openHelper = new OpenHelper(context);
    mDb = openHelper.getWritableDatabase();
}

private static class OpenHelper extends SQLiteOpenHelper {
    public OpenHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    ...

поэтому, если мы хотим создать на SD-карте, я думаю, вместо этого мы должны использовать:

public static SQLiteDatabase openOrCreateDatabase (String path, 
      SQLiteDatabase.CursorFactory factory);

Но какой должен быть аргумент "factory", какой factory должен использоваться?

Также немного беспокоится о том, что произойдет, если пользователь удалит SD-карту, пока мое приложение будет использовать.

Спасибо

4b9b3361

Ответ 1

Я не пытался делать то, что вы там описали, но, возможно, это могло бы быть сделано и могло бы сработать - с несколькими оговорками. Во-первых, внешнее хранилище (SD-карта) не является безопасным, поэтому любое другое приложение или пользователь могут читать/записывать на него. Во-вторых, как вы отметили, когда он размонтируется, DB уходит.

Из-за этих недостатков вам, вероятно, было бы лучше попытаться использовать внутреннюю базу данных хранения (по умолчанию), которая небольшая и, возможно, включает указатели на внешние данные (например, изображения или файлы), которые сами могут быть включены внешнее хранилище (и которое имеет местозаполнители или другую обработку, когда внешнее хранилище недоступно).

Тем не менее, если вы хотите попробовать, вам может быть лучше переопределить метод getDatabasePath Context, например, с вашим собственным Application объектом, а затем передать это в регулярный SQLiteOpenHelper. Тогда вам не придется беспокоиться о курсоре factory (который является необязательным, по мере того, как источник подтверждает - так что просто передайте null, если вместо этого вы хотите пойти по этому маршруту).

Ответ 2

Сделайте это в своем конструкторе SQLiteOpenHelper:

DatabaseHelper(Context context) {
        super(context, context.getExternalFilesDir(null).getAbsolutePath() + "/" + DATABASE_NAME, null, DATABASE_VERSION);
    }

Он создаст базу данных в папке приложения на sdcard:/sdcard/Android/data/[your_package_name]/files. Таким образом, база данных будет рассматриваться как часть приложения для Android и автоматически удалена, если пользователь удалит приложение.

I my app У меня есть большая база данных, и в большинстве случаев она не подходит для старой памяти телефона, например. HTC Desire. Он отлично работает на SD-карте, и большинство приложений "перешли на SDCard" в любом случае, поэтому не беспокойтесь о недоступности базы данных, потому что приложение не будет доступно для него.

Ответ 3

Затем создайте свою собственную плоскую базу данных - у большинства людей очень мало внутренней памяти, и ее раздражает то, что они съедают ее с огромной базой данных.

И что касается сценария "что, если они удаляют SD" - если пользователь удаляет карту, очевидно, что она не сработает! Ясно. Просто убедитесь, что вы не получили сообщение об ошибке при попытке взаимодействия с базой, и если вы это сделали, просто скажите, что проблема пользователя решена.

Ответ 4

Курсор factory используется для возврата экземпляра вашей пользовательской реализации курсора. Обычно вы просто используете SQLiteCursor, и в этом случае null передается как аргумент factory.

Ответ 5

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

Ответ 6

public DataBaseHelper(final Context context) {
    super(context, Environment.getExternalStorageDirectory()
    + File.separator+ MYDATABASE_NAME, null, MYDATABASE_VERSION);
}

Также добавьте разрешение в манифесте android

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