Как использовать внешнюю базу данных в моем приложении без рут-доступа? - PullRequest
0 голосов
/ 23 августа 2011

мы все знаем, что база данных системы Android должна храниться в каталоге / data / data / package name /, существует база данных, которую я хочу использовать в моем приложении.

некоторые люди могут сказать мне, что просто поместите оригинальную базу данных в каталог / res / raw /, а затем используйте FileInputStream, чтобы прочитать ее, прочитать вещи FileOutStream, чтобы записать в этот каталог. это хорошая идея,

Но проблема в том, что не все телефоны имеют root-доступ для вас, чтобы вы могли получить доступ к системному каталогу, а также я не могу просто поместить файл db в sdcard и прочитать данные оттуда, потому что вы не знали если в телефоне есть sdcard. Я действительно понятия не имею, кто-нибудь может мне помочь? я ценю это.

1 Ответ

0 голосов
/ 29 ноября 2011

У меня есть 80-мегабайтная база данных SQLite, которую я преобразовал из Microsoft Access 10. Я загружаю ее в 1) sdcard телефона, 2) sdcard-ext или 3) внутреннее хранилище в зависимости от доступного пространства.База данных SQLite была создана на ПК с использованием SQLite 3.7.4.Он отлично работает на Android от версии 2.2 (8) и выше.Для обработки я создал класс DatabaseAdapter, который не использует open helper.

Вот база данных, открытая из моего класса DatabaseAdapter:

public DatabaseAdapter open() {
    MyLog.d(TAG, "open");
    try {
        String databaseFile = databasePath + File.separator
                + GC.DATABASE_NAME;
        theDB = SQLiteDatabase.openDatabase(databaseFile, null,
                SQLiteDatabase.OPEN_READONLY
                        | SQLiteDatabase.NO_LOCALIZED_COLLATORS);
    } catch (SQLiteException e) {
        MyLog.d(TAG, "open error: " + e.getMessage());
        theDB = null;
    }
    if (theDB == null) {
        return null;
    }
    return this;
}

Конструктор проходит путь.Последовательность использования:

    DatabaseAdapter dbAdapter = new DatabaseAdapter(databasePath);

    if (dbAdapter.open() == null) {
        // ooops. no database open...
        return;
    }

    Cursor cursor = dbAdapter.someQuery(arg1, where, limit);
    if (cursor != null)
        while (cursor.moveToNext()) {
           field1 = cursor.getString(0);
           // etc.
        }
        cursor.close();
    }

    dbAdapter.close();

Ключом к открытию внешней базы данных является флаг NO_LOCALIZED_COLLATORS.Без этого open попытается получить доступ к таблице локализации Android.При создании внешних баз данных таблица не создается, и при запуске на телефоне происходит разрыв таблицы, не найденной.

Чтобы определить путь, который вы хотите использовать для базы данных, используйте Environment.getExternalStorageState () и соответственно используйте sdcard или внутреннее хранилище.

Используйте getExternalStorageDirectory (), чтобы получить каталог sdcard.Используйте this.getApplicationContext (). GetFilesDir () .getPath (), чтобы получить внутренний путь к хранилищу.Предполагая, что вы используете локальный или внешний путь в databasePath, вы можете загрузить базу данных в выходной файл, созданный как

File downloadOutput = новый файл (databasePath, "mysqlite.db");

После загрузки вы можете использовать функцию open (), показанную выше, чтобы подготовить базу данных для доступа.(Примечание: базу данных можно открыть как доступную для записи, а не только для чтения, как показано на рисунке.)

Надеюсь, я не слишком объяснил ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...