Я пытаюсь использовать предварительно заполненную базу данных в своем проекте Android. Мой конвейер такой:
- Я создаю новую базу данных и обрабатываю большой файл JSON для его заполнения (на Android). Это занимает много времени (~ 15 минут или около того), поэтому я хотел бы упаковать созданную базу данных и распространить ее вместе с приложением.
- Я загружаю базу данных в Firebase Storage и загружаю ее вручную на свой ПК. Этот файл базы данных при проверке в браузере с https://sqlitebrowser.org/, выглядит правильно.
- Я добавляю загруженную базу данных в папку Assets и копирую ее в исходный путь к базе данных.
- База данных должна работать на этом этапе, но это не так. Там нет сообщения об ошибке. Он выглядит пустым, но скопированный файл имеет правильный размер и все. Перезапуск приложения не помогает, и вызов нового 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();
}
}
Я что-то упустил?