首页 > 解决方案 > 加入表格时,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>> quotesquoteDao.getAll()改组了结果。有了这个,当我尝试更新任何Quote对象时,它工作得很好。

但是当我用 初始化LiveData<List<Quote>> quotesquoteDao.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...");
    }

预期行为 用例:用户可以添加/删除任何来自的书签。应该为两个列表更新,即和。QuoteLiveData<List<Quote>> quotesQuotequoteDao.getAll()quoteDao.getPreferred()

当前行为 它适用于quoteDao.getAll(). 但是当用户尝试从中添加书签时QuotequoteDao.getPreferred()它的行为如下:

我如何管理书签? 我在quotes表中有一个名为的列bookmark,它存储1为真,0为假

当前流程: Activity/Fragment > QuoteViewModel > QuoteRepository > QuoteDao

标签: androidmvvmandroid-room

解决方案


问题出在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();

推荐阅读