База данных комнат не работает после копирования из ресурсов - PullRequest
0 голосов
/ 09 сентября 2018

Я пытаюсь использовать предварительно заполненную базу данных в своем проекте Android. Мой конвейер такой:

  1. Я создаю новую базу данных и обрабатываю большой файл JSON для его заполнения (на Android). Это занимает много времени (~ 15 минут или около того), поэтому я хотел бы упаковать созданную базу данных и распространить ее вместе с приложением.
  2. Я загружаю базу данных в Firebase Storage и загружаю ее вручную на свой ПК. Этот файл базы данных при проверке в браузере с https://sqlitebrowser.org/, выглядит правильно.
  3. Я добавляю загруженную базу данных в папку Assets и копирую ее в исходный путь к базе данных.
  4. База данных должна работать на этом этапе, но это не так. Там нет сообщения об ошибке. Он выглядит пустым, но скопированный файл имеет правильный размер и все. Перезапуск приложения не помогает, и вызов нового Room.databaseBuilders тоже не помогает.

Код:

База данных:

@Database(entities = {...}, version = 1)
public abstract class MyDatabase extends RoomDatabase {
    public abstract DbDao dbDao();

private static MyDatabase instance = null;

public static MyDatabase getInstance(Context context) {
    if (instance == null){
    instance =
        Room.databaseBuilder(context, MyDatabase.class, "db")
            .build();
    }
    return instance;
}

Выгрузка:

public void uploadDB(){
    String DBPath = mContext.getDatabasePath("db").getAbsolutePath();
    File file = new File(DBPath);
    StorageReference storageRef = FirebaseStorage.getInstance().getReference().child("db/my_database.db");
    BufferedInputStream bis;

    try {
        bis = new BufferedInputStream(new FileInputStream(file));
    } catch (FileNotFoundException e){
        e.printStackTrace();
        return;
    }

    storageRef.putStream(bis);
}

Копирование:

public void loadDbFromAssets() throws IOException {
    InputStream in = mContext.getAssets().open("databases/my_database.db");
    String db_path = mContext.getDatabasePath("db").getAbsolutePath();
    File out_file = new File(db_path);

    if (out_file.exists()){
        boolean deleted = out_file.delete();
        if (!deleted) {
            DebugLog.log("Old DB not deleted!");
            return;
        }
    }
    OutputStream out = new FileOutputStream(out_file);
    copy(in, out);

    File in_file = new File(db_path);
    DebugLog.log("Copied file size: " + in_file.length() + "b");
}

public static void copy(InputStream in, OutputStream out) throws IOException{
    try {
        try {
            byte[] buff = new byte[1024];
            int len;
            while ((len = in.read(buff)) > 0){
                out.write(buff, 0, len);
            }
        } finally {
            out.flush();
            out.close();
        }
    } finally {
        in.close();
    }
}

Я что-то упустил?

РЕДАКТИРОВАТЬ: Решено с помощью https://github.com/humazed/RoomAsset.

...