java - 应用程序重启后 Room Empty Db

标签 java android dagger-2 android-room dagger

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

编辑:我刚刚再次检查,发现自动生成的实体 ID (MyModel) 没有重置为 1,但是当我检索数据时,我只在该 session 中插入了集合。

@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;
    }
}

最佳答案

我刚刚看到了谷歌的例子以及他们是如何做到的,我意识到你需要修复:

@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

关于java - 应用程序重启后 Room Empty Db,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47507583/

相关文章:

android - Dagger2 依赖组件

android - Dagger2 在 fragment 演示器中获取 Activity 演示器的实例

java - 禁止 javascript 在 javafx webview 中运行

java - 使用 spring security 登录操作之前的自定义验证?

java - @Secured 函数拒绝授权用户访问

java - 为什么 Dagger 注入(inject)不起作用但 component.getObject 可以

android - 如何检测服务和广播接收器中的关键事件

android - ScrollView React Native 上的多个 onScroll 事件?

android gradle构建: Generated class list does not exist

java - 你如何调用另一个类的开关盒?