2017-06-22 65 views
7

SQLiteOpenHelper有一个onCreate(SQLiteDatabase ...)方法,我用它用一些初始数据填充数据库表。如何在首次运行时填充Android Room数据库表?

有没有办法将一些数据插入到第一个 应用程序运行的房间数据库表中?

+0

你可以提供预填充的数据库。并在那个工作。 –

回答

-3

解决方案是实现捆绑到Android中的“SharedPreferences”。

下面的代码是基于从溶液:Check if application is on its first run

public class MyActivity extends Activity { 

    SharedPreferences prefs = null; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     ... 
     prefs = getSharedPreferences("com.mycompany.myAppName", MODE_PRIVATE); 
     ... 
    } 

    @Override 
    protected void onResume() { 
     ... 
     if (prefs.getBoolean("firstrun", true)) { 
      // !DO YOUR DATABASE INSERT/POPULATION HERE! 
      prefs.edit().putBoolean("firstrun", false).commit(); 
     } 
     ... 
    } 
} 
+1

但更好的解决方案是在数据库创建后填充数据,而不是添加此标志。所以我敦促明星此功能请求https://issuetracker.google.com/issues/62699324 – Sinigami

5

我尝试了许多方法可以做到这一点,每个没有提供。

首先,我尝试使用'addMigrations'方法向Room中添加Migration实现,但发现它只在数据库升级期间运行,但不在创建时运行。

然后,我尝试使用'openHelperFactory'方法将SQLiteOpenHelper实现传递给Room。但是为了避开Room的包级访问修饰符而创建了一堆类之后,我放弃了这一努力。我也尝试了继承Room的FrameworkSQLiteOpenHelperFactory,但是,它的构造函数的包级访问修饰符不支持这一点。

最后,我创建了一个IntentService来填充数据,并从我的Application子类的onCreate方法中调用它。该方法可行,但更好的解决方案应该是即将解决此页面上其他地方Sinigami提到的跟踪问题。

达里尔

[增加了2017年7月19日]

问题看起来好像在1.0.0房解决。 Alpha 5.此版本向RoomDatabase添加了一个回调函数,使您可以在数据库第一次创建时执行代码。看一看:

https://developer.android.com/reference/android/arch/persistence/room/RoomDatabase.Callback.html

17

创建数据库后,您可以运行脚本或运行的每个数据库使用RoomDatabase.Callback打开时,这个类是在房间库的最新版本。

您需要实现RoomDatabase.Callback的onCreate和onOpen方法,并将其添加到RoomDatabase.Builder,如下所示。

yourDatabase = Room.databaseBuilder(context, 
          YourDatabase.class, "your db").addCallback(rdc).build(); 



    RoomDatabase.Callback rdc = new RoomDatabase.Callback(){ 
     public void onCreate (SupportSQLiteDatabase db){ 
     // do something after database has been created 
     } 
     public void onOpen (SupportSQLiteDatabase db){ 
     //do something every time database is open 
     } 
    }; 

参考:https://medium.com/@srinuraop/database-create-and-open-callbacks-in-room-7ca98c3286ab

+0

这一个应该被标记为正确的答案。谢谢! – Imanol

相关问题