android - 加入表格时,Android Room 无法正确更新记录
问题描述
我DAO
有以下查询方法:
@Dao
public interface QuoteDao {
@Query("SELECT * FROM quotes")
LiveData<List<Quote>> getAll();
@Query("SELECT * FROM quotes " +
"INNER JOIN categories ON categories.id = quotes.category_id " +
"WHERE categories.selected = 1")
LiveData<List<Quote>> getPreferred();
@Update
public void update(Quote quote);
}
并Repository
有以下方法:
public class QuoteRepository {
private static final String TAG = "Repo/Quote";
private final QuoteDao quoteDao;
private LiveData<List<Quote>> quotes;
private final long seed = System.currentTimeMillis();
public QuoteRepository(Application application){
quoteDao = DB.getInstance(application).quoteDao();
quotes = Transformations.map(quoteDao.getAll(), quotes -> {
List<Quote> list = new ArrayList<>(quotes);
Collections.shuffle(list, new Random(seed));
return list;
});
Log.d(TAG, "New instance created...");
}
public LiveData<List<Quote>> getQuotes(){
return quotes;
}
public void updateQuote(Quote quote, QuoteRepository.CallBackListener listener){
Future<?> future = DB.databaseWriteExecutor.submit(() -> quoteDao.update(quote));
futureCallback(future, listener);
}
private void futureCallback(Future<?> future, QuoteRepository.CallBackListener listener){
try {
future.get();
if(future.isDone())
listener.onSuccess();
} catch (ExecutionException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public interface CallBackListener{
void onSuccess();
}
}
我已经初始化LiveData<List<Quote>> quotes
并quoteDao.getAll()
改组了结果。有了这个,当我尝试更新任何Quote
对象时,它工作得很好。
但是当我用 初始化LiveData<List<Quote>> quotes
时quoteDao.getPreferred()
,更新不能正常工作。这是我的使用方式getPreferred()
:
public QuoteRepository(Application application){
quoteDao = DB.getInstance(application).quoteDao();
quotes = Transformations.map(quoteDao.getPreferred(), quotes -> {
List<Quote> list = new ArrayList<>(quotes);
Collections.shuffle(list, new Random(seed));
return list;
});
Log.d(TAG, "New instance created...");
}
预期行为
用例:用户可以添加/删除任何来自的书签。应该为两个列表更新,即和。Quote
LiveData<List<Quote>> quotes
Quote
quoteDao.getAll()
quoteDao.getPreferred()
当前行为
它适用于quoteDao.getAll()
. 但是当用户尝试从中添加书签时Quote
,quoteDao.getPreferred()
它的行为如下:
- 在第一次更新时,它会添加
Quote
书签。(例如更新索引 0 处的对象) - 在第二次更新时,它会删除以前的书签
Quote
并将其替换为当前选定的。(例如用索引 1 替换索引 0 处的对象) - 有时它根本不更新,有时它会自动反转更新。
我如何管理书签?
我在quotes
表中有一个名为的列bookmark
,它存储1为真,0为假
当前流程: Activity/Fragment > QuoteViewModel > QuoteRepository > QuoteDao
- 我做错什么了吗?
- 我需要任何额外的代码来管理
LiveData
结果Join Query
吗? - 我该如何解决?
解决方案
问题出在Query
,我所有实体的主键列都被命名为。id
父母(类别)的 id 被分配给孩子(报价)。
我已经替换了这个:
@Query("SELECT * FROM quotes " +
"INNER JOIN categories ON categories.id = quotes.category_id " +
"WHERE categories.selected = 1")
LiveData<List<Quote>> getPreferred();
有了这个:
@Query("SELECT quotes.* FROM quotes " +
"INNER JOIN categories ON categories.id = quotes.category_id " +
"WHERE categories.selected = 1")
LiveData<List<Quote>> getPreferred();
推荐阅读
- scala - 如何创建通用方法来解析嵌套的 json?
- node.js - 如何更新MongoDB上其他数组中的数组值?
- scala - 使用 Scala 为 spark 编写 Parquet 文件,而不需要 spark 作为依赖项
- xamarin - 如何更改 ListView 选定项的背景颜色?
- c# - 不可调用的成员“System.Web.UI.Page.ClientScript”不能像方法一样使用
- php - 简单的 OOP 数组参数不返回值,而是说为 foreach() 提供的参数无效
- matlab - Matlab条形图中的XTicks未与其条形对齐
- android - 带 web 套接字的推送服务器
- javascript - 是否可以创建查询以在 javascript 中的一个查询中执行多个查询?
- r - 在R中的直方图顶部添加标签