Как поместить существующую базу данных в файл .apk? - PullRequest
7 голосов
/ 26 октября 2010

У меня есть готовая база данных, состоящая в основном из строковых объектов. Я хочу знать, как вставить свой apk-файл, чтобы база данных уже была создана при установке базы данных пользователем.

Ответы [ 3 ]

11 голосов
/ 26 октября 2010

Я нашел хороший пример этого: Использование собственной базы данных SQLite в приложениях Android

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

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

8 голосов
/ 12 мая 2012

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

import android.database.sqlite.SQLiteDatabase;
import kiwidrew.staticdb.StaticDatabase;

public class BlahBlah extends Activity {
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    SQLiteDatabase db = StaticDatabase.openDatabase(this, "assets/foobar.db");
    // Do normal database stuff with 'db'...
  }
}

Вы получаете стандартный объект SQLiteDatabase, единственное ограничение которого заключается в том, что он не поддерживает запись.(Очевидно!)

Обратите внимание, что это не удастся, если база данных не хранится в вашем .apk без сжатия.Добавьте базу данных sqlite с помощью команды aapt -0 или измените свой build.xml, чтобы передать флаг <nocompress extension="db" /> тегу <aapt> ...

Получить код на http://bitbucket.org/kiwidrew/android-staticdb.

Примечание: я буквально только что закончил писать это, и до сих пор проводил только очень базовое тестирование.Сообщения об ошибках будут оценены!

1 голос
/ 08 мая 2014

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

Эти шаги помогут вам:

1) Выполните эти команды в вашей базе данных, если таблица android_metadata не существует в вашей базе данных, android не может открыть вашу базу данных.

CREATE TABLE android_metadata(locale TEXT DEFAULT 'en_US')
INSERT INTO android_metadata VALUES('en_US')

2) Разделите вашу базу данных, потому что Android не поддерживает чтение файла размером более 1 МБ из ресурсов.

Этот код Python разделяет вашу базу данных:

def chunk_file(file_name):
    input_file = open(file_name, "rb")

    chunk_counter = 0;
    while True:
        chunk = input_file.read(512 * 1024) # 512 KB
        if chunk:
            output_file_name = file_name + "." + str(chunk_counter).zfill(4)

            output_file = open(output_file_name, "wb")
            output_file.write(chunk)
            output_file.close()

            chunk_counter += 1
        else:
            break

    input_file.close()
    return

# Input: database.db
# Output: database.db.0000, database.db.0001, database.db.0002, ...
chunk_file("database.db")

Затем поместите database.db.0000, database.db.0001, database.db.0002, ... в папку активов.

3) Проверьте, существует ли база данных в папке данных при запуске приложения.

public static boolean databaseExists() {

    boolean result = false;

    SQLiteDatabase checkDB = null;

    try {
        checkDB = SQLiteDatabase.openDatabase(
                getApplicationContext().getFilesDir().getPath() + "/database.db",
                null, SQLiteDatabase.OPEN_READONLY);
        result = true;
    } catch (SQLiteException exception) {
        result = false;
    }

    if (checkDB != null) {

        checkDB.close();

    }

    return result;
}

4) Если база данных не существует в папке данных, скопируйте базу данных из ресурсов в папку данных.

public static void copyDatabase() throws IOException {
    AssetManager assets = getApplicationContext().getAssets();

    // database.db.0000, database.db.0001, database.db.0002, ... --> databaseChunks.
    String[] databaseChunks = assets.list("");
    Arrays.sort(databaseChunks);

    OutputStream databaseStream = new FileOutputStream(
            getApplicationContext().getFilesDir().getPath() + "/database.db");

    for (int i = 0; i < databaseChunks.length; i++) {
        String databaseChunkName = databaseChunks[i];

        InputStream chunkStream = assets.open(databaseChunkName);

        int length;
        byte[] buffer = new byte[1024];
        while ((length = chunkStream.read(buffer)) > 0) {
            databaseStream.write(buffer, 0, length);
        }

        chunkStream.close();
    }

    databaseStream.close();

    return;
}

5) Теперь вы можете подключиться к базе данных:

SQLiteDatabase database = SQLiteDatabase.openDatabase(
            getApplicationContext().getFilesDir().getPath() + "/database.db",
            null, SQLiteDatabase.OPEN_READONLY);
// ...
database.close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...