База данных SQLite, созданная на Android и отредактированная с помощью Firefox SQlite manager - PullRequest
1 голос
/ 13 сентября 2011

Сначала я создал базу данных SQLite в Windows, а затем возникли проблемы с доступом к ней в Android.

Впоследствии я создал базу данных на Android, а затем скопировал ее. В этот момент в нем была только таблица android_metadata.

Затем я импортировал некоторые данные через CSV и добавил их обратно в свой проект. Класс DbHelper в моем проекте копирует базу данных в /data/data/my.project/databases/.

Теперь, когда я запускаю необработанный запрос из этой базы данных, если я пытаюсь получить доступ к таблице, импортированной CSV, я получаю сообщение об ошибке, в котором говорится, что таблица не существует. Если я пытаюсь получить доступ к таблице android_metadata, которую я создал для Android, ошибка не возникает.

В базе данных в моих ресурсах определенно есть таблица, которую я хочу скопировать в папку /data/data/example.project/databases, и определенно вызывается подпрограмма копирования - я проверил вывод журнала.

Теперь, если я закомментирую код копии, автоматически создается база данных, которая содержит таблицу android_metadata и составляет ~ 3 КБ.

Когда код копирования активен, база данных создается как ~ 8 КБ. Это размер базы данных в активах, поэтому кажется, что она была успешно скопирована. Однако, когда я извлекаю эту базу данных обратно на рабочий стол из DDMS, она составляет ~ 8 КБ, но в ней нет таблицы, которая находится в папке в папке ресурсов. Если я вручную скопирую прямо с рабочего стола в /data/data ..., тогда база данных будет работать (но это будет невозможно при использовании рыночного приложения).

Вот мой код для копирования базы данных:

public void createDatabase() throws IOException {
    Log.i(TAG, "createDatabase called");

    InputStream assetsDB = mContext.getAssets().open(DATABASE_NAME);
    OutputStream dbOut = new FileOutputStream(DATABASE_PATH);

    Log.i(TAG, DATABASE_PATH);
    Log.i(TAG, assetsDB.toString());

    byte[] buffer = new byte[1024];
    int length;
    while ((length = assetsDB.read(buffer))>0) {
        Log.i(TAG, "WritingDB block" + length);
        dbOut.write(buffer, 0, length);
    }

    dbOut.flush();
    dbOut.close();
    assetsDB.close();
}

Как я могу решить эту проблему?

Я исправил это, используя другой пример, который не переопределяет onCreate кодом копирования базы данных и обрабатывает копирование базы данных самостоятельно. Я не очень понимаю, почему это не работает при вызове метода onCreate.

Ответы [ 2 ]

0 голосов
/ 14 сентября 2011

Вы видели Использование собственной базы данных SQLite в приложениях для Android ?

Эта страница является хорошим источником для темы.Но есть небольшая проблема.На самом деле, это не проблема, и объяснил, как исправить на странице.Посмотрите на комментарии.

Если ваша база данных довольно большая или небольшая (> 1 МБ, <100 КБ (я не уверен насчет этих значений)).Кажется, что он сжат, и это вызывает путаницу в Android, читаемом на InputStream.Хитрость заключается в том, чтобы переименовать ваш ресурс в файл, который упаковщик <strong>не попытается сжать.Переименование файла базы данных из xxx в xxx.mp3 или xxx.txt или что-то в этом роде делает свое дело.

0 голосов
/ 13 сентября 2011

Если я вас ясно понимаю, у меня возникла та же проблема с загрузкой базы данных SQLite из других источников (я тоже использовал Firefox SQLite manger).

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

Мне нужно поставить этот код перед загрузкой моей тестовой базы данных:

final SQLiteDatabase db = getReadableDatabase();
db.close();

Класс моей базы данных помощников:

public DataBaseHelper(Context context) {

    super(context,
          DataBaseHelper.DATABASE_NAME,
          null,
          DataBaseHelper.DATABASE_VERSION);
    this.context = context;

    // Temporary copy test database
    loadMockDataBase();

    dataBase = getWritableDatabase();
}

@Override
public final synchronized void close() {
    if (dataBase != null) {
        dataBase.close();
    }
    super.close();
}

private void loadMockDataBase() {
    final SQLiteDatabase db = getReadableDatabase();
    db.close();

    try {
        copyDataBase();
    }
    catch (final IOException e) {
        Log.d(SystemConfiguration.LOG_TAG, e.getMessage());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...