我正在尝试将Room用于我的新应用。但是,无论何时重新启动应用程序,我都无法检索旧数据。看来我的应用每次都在创建数据库的新实例,但是我不确定为什么。这是我基于MVP模式的类(class)。
编辑:我只是再次检查,我可以看到实体(MyModel)的自动生成的ID不会重置为1,但是当我检索数据时,我只会在该 session 中插入集合。
道@Dao
public interface MyDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
List insertModels(List models);
@Query("SELECT * FROM MyModel")
List 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 {
@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;
}
}
最佳答案
我刚刚看到了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 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