【问题标题】:Room Empty Db after application restart应用程序重新启动后的 Room Empty Db
【发布时间】:2017-11-27 09:28:20
【问题描述】:

我正在尝试将 Room 用于我的新应用。但是每当我重新启动我的应用程序时,我都无法检索旧数据。看起来我的应用程序每次都在创建一个新的数据库实例,但我不知道为什么。这是我基于 MVP 模式的课程。

编辑:我刚刚再次检查,我可以看到为实体 (MyModel) 自动生成的 Id 没有重置为 1,但是当我检索数据时,我只会在该会话中插入集合。

@Dao
public interface MyDao {

      @Insert(onConflict = OnConflictStrategy.REPLACE)
      List<Long> insertModels(List<MyModel> models);

      @Query("SELECT * FROM MyModel")
      List<MyModel> getModels();
}

数据库

@Database(entities = {MyModel.class}, version = 1)
public abstract class MyDatabase extends RoomDatabase {
    public abstract MyDao myDao();
}

数据库模块

@Module
public class DatabaseModule {

    @Provides
    @Singleton
    MyDatabase provideMyDatabase(Application context) {
        return Room.databaseBuilder(context.getApplicationContext(), MyDatabase.class, "MyDB").build();
    }

    @Provides
    @Singleton
    MyDao provideMyDao(MyDatabase myDatabase) {
        return myDatabase.myDao();
    }
}

数据源

@Singleton
public class MyDataSource {

    MyDao mMyDao;

    @Inject
    public MyDataSource(@NonNull MyDao myDao) {
        mMyDao = myDao;
    }
}

存储库

@Singleton
public class MyRepository {

    private final MyDataSource mMyDataSource;

    @Inject
    MyRepository(@Local MyDataSource myDataSource) {
        mMyDataSource = myDataSource;
    }
}

应用组件

@Singleton
@Component(modules = {AndroidSupportInjectionModule.class, ApplicationModule.class, DatabaseModule.class})
public interface ApplicationComponent extends AndroidInjector<MyApp> {

    @Component.Builder
    interface Builder {

        @BindsInstance
        Builder application(Application application);

        ApplicationComponent build();
    }
}

应用程序

public class MyApp extends DaggerApplication {

    private ApplicationComponent mApplicationComponent;

    @Override
    protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
        mApplicationComponent = DaggerApplicationComponent.builder().application(this).build();
        return mApplicationComponent;
    }
}

【问题讨论】:

  • 您确定您没有以某种方式触发迁移机制吗?这是 Room 文档中对我来说最突出的一件事: 注意:如果您不提供必要的迁移,Room 会改为重建数据库,这意味着您将丢失数据库中的所有数据。 (developer.android.com/training/data-storage/room/…)
  • 不,是版本1。而且,我没有重新安装应用程序,只是重新启动它。
  • 您确定这些值已成功插入到 db 中吗?您也可以尝试编写测试用例,以确保成功插入和检索数据。
  • 是的,我可以使用另一个查询来检索它们,但只能用于同一个会话。一旦我重新启动,所有以前的数据都消失了。
  • 我建议您拔出应用程序的数据库并在重新启动应用程序后检查数据库中是否存在数据。这样你就可以确保通过代码的某个地方,它会被一些查询删除

标签: java android dagger-2 android-room dagger


【解决方案1】:

我刚刚看到了 google 示例以及他们是如何做到的,我意识到您需要修复:

@Module public class DatabaseModule {

@Provides
@Singleton
MyDatabase provideMyDatabase(Application context) {
    return Room.databaseBuilder(context.getApplicationContext(), MyDatabase.class, "MyDB").build();
}

@Provides
@Singleton
MyDao provideMyDao(MyDatabase myDatabase) {
    return myDatabase.myDao();
}

}

检查数据库是否已经存在,使用以下代码:

  /**
 * Check whether the database already exists and expose it via {@link #getDatabaseCreated()}
 */
private void updateDatabaseCreated(final Context context) {
    if (context.getDatabasePath(DATABASE_NAME).exists()) {
        setDatabaseCreated();
    }
}

private void setDatabaseCreated(){
    mIsDatabaseCreated.postValue(true);
}


public LiveData<Boolean> getDatabaseCreated() {
    return mIsDatabaseCreated;
}

无论如何,这里是 github google 示例的链接: https://github.com/googlesamples/android-architecture-components/blob/master/BasicSample/app/src/main/java/com/example/android/persistence/db/AppDatabase.java

【讨论】:

    猜你喜欢
    • 2014-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-29
    • 1970-01-01
    • 2016-09-04
    • 2011-05-15
    • 1970-01-01
    相关资源
    最近更新 更多