如何重新填充我的Android Room数据库?

时间:2018-06-19 22:53:53

标签: java android android-sqlite android-room

这是我的AppDatabase代码。我刚开始使用ChatUserChatMessage作为可以正常工作的实体,但是后来我想添加Well。我整理了所有内容,并将它们与回调中的两行预初始化数据库一起添加到了此类中。问题是这将无法正常工作。即使我更改版本号或卸载应用程序,数据库也不会预先初始化。它是第一个运行的版本,因此我无法在数据库上成功进行迭代。请帮忙!

@Database(entities = {ChatUser.class, ChatMessage.class, Well.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {

    private static AppDatabase INSTANCE;

    public abstract UserDao userDao();

    public abstract MessageDao messageDao();

    public abstract WellDao wellDao();

    public static AppDatabase getAppDatabase(final Context context) {
        Log.d("AppDatabase", "getting app database");
        if (INSTANCE == null) {
            INSTANCE =
                    Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class, "curadite-database")
                            .fallbackToDestructiveMigration()
                            .addCallback(new Callback() {
                                @Override
                                public void onCreate(@NonNull SupportSQLiteDatabase db) {
                                    super.onCreate(db);
                                    Log.d("AppDatabase", "OnCreate");
                                    Executors.newSingleThreadExecutor().execute(new Runnable() {
                                        @Override
                                        public void run() {
                                            ChatUser user = new ChatUser("Me", true);
                                            ChatMessage message = new ChatMessage("Hello!", 1, System.currentTimeMillis());
                                            AppDatabase db = getAppDatabase(context);
                                            db.userDao().insertAll(user);
                                            db.messageDao().insertAll(message);
                                            Well[] wells = new Curapac(7, 2).flatWells();
                                            db.wellDao().insertAll(wells);
                                        }
                                    });
                                }
                            })
                            .build();
        }
        return INSTANCE;
    }

1 个答案:

答案 0 :(得分:0)

您的Callback方法(使用线程使您的初始化发生在将来的某个未知时间)并不是很可靠。不需要getAppDatabase()的调用者使用它之前完成您的初始化工作。

要么:

  • SupportSQLiteDatabase内部同步使用提供的onCreate()来填充数据库,或者

  • 在调用build()之后和退出if方法中的getAppDatabase()块之前填充数据库,检查当前数据库内容以查看是否需要执行初始化

此外,您管理此单例的整体方法将无法很好地处理对getAppDatabase()的同时调用。请将INSTANCE标记为volatile,并将getAppDatabase()标记为synchronized