如何将现有的SQLite表导入到Android Room?

6

我正在开发一个问答应用,已经在应用中实现了Room持久化,但是我遇到了问题,无法找到从一个SQLite数据库文件导入现有表的信息。这个SQLite数据库文件将会随着应用程序一起打包。


1
你所说的“将数据库文件导入应用程序”具体是什么意思? - CommonsWare
资产文件----? - EpicPandaForce
我的意思是将数据导入到Room表中。 - vimerate
5
Room 的所有文档都展示了如何使用它来创建数据库。但是假设我们已经有一个现有的 SQLite 数据库位于 custom/path/database.db,我们该如何将内存中的类映射到该位置呢? - Matt
1个回答

2

看起来有点晚了,但我通过以下解决方法解决了这个问题。 在初始化房间数据库之前,您需要将现有的sqlite db文件复制到/data/data/{your package name}/databases目录中。

您可以使用此方法复制文件。

   public static void copyDataBase(Context context, String dbName) throws IOException {

    InputStream myInput = context.getAssets().open(dbName); 
    String outFileName =  "/data/data/"
            +context.getApplicationContext().getPackageName()
            + "/databases/" + dbName;
    File file=new File(outFileName);
    if (file.exists())
        return; 
    OutputStream myOutput = new FileOutputStream(outFileName); 
    byte[] buffer = new byte[1024];
    int length;
    while ((length = myInput.read(buffer)) > 0) {
        myOutput.write(buffer, 0, length);

    } 
    myOutput.flush();
    myOutput.close();
    myInput.close();
}

在您的应用程序类中执行以下操作:
public class ErrorReporterInit extends Application  {

public static ApplicationComponent applicationComponent;

@Inject
DispatchingAndroidInjector<Activity> activityDispatchingAndroidInjector; 

@Override
public void onCreate() {
    super.onCreate();

    try {
        GeneralUtil.copyDataBase(this,"{your existing db file in asset}");
    } catch (IOException e) {
        e.printStackTrace();
    }

    applicationComponent = DaggerApplicationComponent.builder()
            .application(this).build();
    applicationComponent.inject(this);

}



@Override
public void onTerminate() {
    super.onTerminate();
}

}

在我的情况下,我使用Dagger将房间初始化为依赖项。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接