Tôi đang cố gắng sử dụng Phòng cho ứng dụng mới của mình. Nhưng bất cứ khi nào tôi khởi động lại ứng dụng của mình, tôi không thể truy xuất dữ liệu cũ. Dường như ứng dụng của tôi đang tạo ra một cá thể mới của cơ sở dữ liệu mỗi lần, nhưng tôi không chắc chắn tại sao. Đây là các lớp của tôi dựa trên mẫu MVP.Phòng trống Db sau khi khởi động lại ứng dụng
Chỉnh sửa: Tôi vừa kiểm tra lại và tôi có thể thấy Id được tạo tự động cho đối tượng (MyModel) không được đặt lại thành 1 nhưng khi tôi truy xuất dữ liệu, tôi chỉ nhận được bộ sưu tập được chèn vào phiên đó.
Đào
@Dao
public interface MyDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
List<Long> insertModels(List<MyModel> models);
@Query("SELECT * FROM MyModel")
List<MyModel> getModels();
}
Cơ sở dữ liệu
@Database(entities = {MyModel.class}, version = 1)
public abstract class MyDatabase extends RoomDatabase {
public abstract MyDao myDao();
}
DatabaseModule
@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();
}
}
Data Source
@Singleton
public class MyDataSource {
MyDao mMyDao;
@Inject
public MyDataSource(@NonNull MyDao myDao) {
mMyDao = myDao;
}
}
Repository
@Singleton
public class MyRepository {
private final MyDataSource mMyDataSource;
@Inject
MyRepository(@Local MyDataSource myDataSource) {
mMyDataSource = myDataSource;
}
}
ApplicationComponent
@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();
}
}
App
public class MyApp extends DaggerApplication {
private ApplicationComponent mApplicationComponent;
@Override
protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
mApplicationComponent = DaggerApplicationComponent.builder().application(this).build();
return mApplicationComponent;
}
}
Bạn có chắc chắn rằng bạn không phải bằng cách nào đó kích hoạt cơ chế di chuyển? Đó là một điều nổi bật với tôi trong tài liệu của Phòng: Thận trọng: Nếu bạn không cung cấp các di chuyển cần thiết, Phòng sẽ xây dựng lại cơ sở dữ liệu thay vào đó, nghĩa là bạn sẽ mất tất cả dữ liệu trong cơ sở dữ liệu. (https://developer.android.com/training/data-storage/room/migrating-db-versions.html) –
Không, đó là phiên bản 1. Hơn nữa, tôi không cài đặt lại ứng dụng, chỉ cần khởi động lại ứng dụng . – fR0DDY
bạn có chắc chắn các giá trị được đưa vào db thành công không? Bạn cũng có thể thử viết test case để đảm bảo rằng dữ liệu được chèn vào và lấy ra thành công. – Gautam