Android, Ormlite, расположение БД - PullRequest
7 голосов
/ 08 июля 2011

Я использую Ormlite для сохранения некоторых данных из моего приложения для Android (работает на Motorola Xoom).По умолчанию база данных sql сохраняется в / data / data / [имя пакета] / database / [имя_базы] .db.Проблема в том, что Xoom не имеет root-прав и, следовательно, пользователи не имеют доступа к каталогу, в котором сохранена БД (невозможно копировать / резервировать / редактировать содержимое БД).

Я добавил некоторые дополнительныекод в один из классов, чтобы скопировать базу данных из / данных на карту SD, которая работает нормально, но реально я думаю, что можно установить путь для хранения базы данных.Я что-то упустил, или это невозможно с Ormlite?

Заранее спасибо, C

Ответы [ 3 ]

6 голосов
/ 28 октября 2012

Вы можете создать базу данных на SDCard, если используете что-то вроде

public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
[...]
public DatabaseHelper(final Context context) {
    super(context, Environment.getExternalStorageDirectory().getAbsolutePath()
    + File.separator + DATABASE_NAME, null, DATABASE_VERSION);
}

. Это создает файл базы данных, например, в /mnt/sdcard/Android/data/com.your.app/files/myData.sqlite Pro: экономит внутреннюю память Con: DB недоступна, когда SDCard недоступна (например, когда она подключена к ПК). Кроме того, ее может прочитать любой, кто может быть за или против.

При использовании context.getExternalFilesDir () вместо Environment.getExternalStorageDirectory () будет использоваться местоположение, специфичное для вашего приложения, которое будет автоматически очищаться после удаления (и оно появляется в 2.2 также при обновлении приложения).

PS Я где-то читал, что этот подход может не работать на версиях Android до 2.2 (?)

2 голосов
/ 19 марта 2012

Вы можете сделать что-то вроде того, что сделал парень из https://stackoverflow.com/a/3911641.

Когда вы создаете свой объект, который будет выполнять ваши транзакции БД, переопределите getReadableDatabase и getWriteableDatabase, чтобы использовать ваш пользовательский путь. Что-то вроде этого:

@Override
public synchronized SQLiteDatabase getWritableDatabase (){
  return SQLiteDatabase.openDatabase("/sdcard/mydatabase.db", null, SQLiteDatabase.OPEN_READWRITE);
}

@Override
public synchronized SQLiteDatabase getReadableDatabase (){
  return SQLiteDatabase.openDatabase("/sdcard/mydatabase.db", null, SQLiteDatabase.OPEN_READONLY);
}

Если бы я писал ваше приложение, я бы не поместил БД на SD-карту. Если пользователь копирует данные из него, приложение не сможет получить к нему доступ. Я бы предоставил функцию «резервного копирования», которая бы создавала файл на SD-карте в формате XML, JSON или CSV. Тогда пользователь может сделать резервную копию на удаленном хранилище, и вы знаете, что вы всегда сможете получить доступ к своей базе данных. Если вы не хотите создать временное хранилище и объединить все данные на SD-карту, когда она станет доступной ... Но это звучит как гораздо больше работы, чем оно того стоит. Я надеюсь, что это ответило на ваш вопрос!

0 голосов
/ 17 марта 2012

Нет, вы не можете получить доступ к базе данных напрямую.Вы можете использовать от adb shell до cd для этого каталога.Вот несколько советов на эту тему: http://developer.android.com/guide/developing/tools/adb.html#sqlite

И я не понимаю, что это с Ormlite.

...