【发布时间】:2020-11-06 21:31:46
【问题描述】:
我已经在我的应用中实现了 MVVM 架构。我有我的活动、视图模型、存储库、DAO 和数据库类。数据库包含包含不同列表的对象,我想在这些列表之间切换,并让我的 RecyclerView 显示当前选择的列表。我的理解是 SQLite 中的行 ID 从 1 开始,但是我的存储库中的 insert 方法(它在我的 DAO 中调用 @Insert 方法)总是以行 ID 0 开始。出于测试目的,我使用 LiveData 来获取数据库中的所有对象,当我记录它们的 ID 时,它们正确地从 1 开始,一直到 n。我不想在内存中维护数据库中所有对象的列表,只维护包含当前选定列表的单个对象。 当用户创建新列表(或选择现有列表)时,我想让我的 RecyclerView 显示其内容并观察该列表的任何更改。如果没有正确的对应 ID,我无法开始观察对象。
如何将正确的 ID 传播到 MainActivity?如果需要我的 ViewModel 和 Activity 代码,请告诉我,我会编辑帖子。
当我从存储库中记录 ID 时
当我在 MainActivity 中记录 LiveData 时,会显示正确的 ID
我的数据库类
@TypeConverters({ArrayListConverter.class}) // List converter for database
@Database(entities = ListContainer.class, version = 1, exportSchema = false)
public abstract class ListContainerDatabase extends RoomDatabase {
private static ListContainerDatabase dbInstance;
private static final String DB_NAME = "list_container_db";
private static final int NUM_THREADS = 4;
final static ExecutorService executor = Executors.newFixedThreadPool(NUM_THREADS);
public abstract ListContainerDao getDao();
public static synchronized ListContainerDatabase getInstance(Context context) {
if(dbInstance == null) {
dbInstance = Room.databaseBuilder(
context.getApplicationContext(),
ListContainerDatabase.class, DB_NAME)
.fallbackToDestructiveMigration()
.build();
}
return dbInstance;
}
public static Executor getExecutor() {
return executor;
}
我的 DAO
@Dao
public interface ListContainerDao {
@Insert
long insertListContainer(ListContainer container);
... // other database queries
}
我的仓库
public class Repository {
private static final String TAG = "Repository";
private ListContainerDao listContainerDao;
private long id;
private Executor executor = ListContainerDatabase.getExecutor();
public Repository(Application application) {
ListContainerDatabase containerDb = ListContainerDatabase.getInstance(application);
listContainerDao = containerDb.getDao();
}
public long insertListContainer(ListContainer container) {
executor.execute(new Runnable() {
@Override
public void run() {
id = listContainerDao.insertListContainer(container); // this returns ID starting at 0
}
});
Log.i(TAG, "insertListContainer: from Repository id is :" + id);
return id;
}
}
【问题讨论】:
标签: java android sqlite mvvm android-room