从资产复制后,Room数据库无法正常工作

时间:2018-09-09 16:06:33

标签: android database android-sqlite storage android-room

我正在尝试在Android项目中使用预先填充的数据库。我的管道是这样的:

  1. 我正在创建一个新的数据库并处理一个大的JSON文件以填充它(在Android上)。这会花费很多时间(约15分钟左右),所以我想打包此创建的数据库并与应用程序一起分发。
  2. 我将数据库上传到Firebase Storage并在PC上手动下载。使用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解决。

0 个答案:

没有答案