База данных SQLite на SD-карте - PullRequest
12 голосов
/ 26 января 2011

Я хочу создать базу данных 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);

Но что такое«фабричный» аргумент: какая фабрика должна использоваться?

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

Спасибо

Ответы [ 6 ]

9 голосов
/ 14 июня 2012

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

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

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

У меня есть приложение, у меня большая база данных, и оно в большинстве случаев не подходит для старых телефонов.внутренняя память, например HTC Desire.Он отлично работает на SDCard, и большинство приложений в любом случае сами «перемещаются на SDCard», поэтому не беспокойтесь о недоступности базы данных, потому что приложение само по себе не будет доступно.

9 голосов
/ 26 января 2011

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

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

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

3 голосов
/ 09 февраля 2011

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

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

2 голосов
/ 26 января 2011

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

1 голос
/ 11 марта 2015
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" />
1 голос
/ 26 января 2011

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

...