使用支持 RecyclerView 的 Cursor 时如何管理更新的 SQLite 数据

How to manage updated SQLite data when using Cursor supporting RecyclerView

这个问题是关于一种有效且适当的方法来管理对 SQLiteDatabase 的小更改。出于讨论的目的,我们可以查看 this code,我已将其总结如下:

CursorRecyclerViewAdapter.java

public abstract class CursorRecyclerViewAdapter<VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<VH> {
    public CursorRecyclerViewAdapter(Context context, Cursor cursor) {
    public Cursor getCursor() {
    public int getItemCount() {
    @Override public long getItemId(int position) {
    @Override public void setHasStableIds(boolean hasStableIds) {
    public abstract void onBindViewHolder(VH viewHolder, Cursor cursor);
    @Override public void onBindViewHolder(VH viewHolder, int position) {
    public void changeCursor(Cursor cursor) {
    public Cursor swapCursor(Cursor newCursor) {
    private class NotifyingDataSetObserver extends DataSetObserver {
        @Override public void onChanged() {
        @Override public void onInvalidated() {

MyListCursorAdapter.java

public class MyListCursorAdapter extends CursorRecyclerViewAdapter<MyListCursorAdapter.ViewHolder>{
    public MyListCursorAdapter(Context context,Cursor cursor){
    public static class ViewHolder extends RecyclerView.ViewHolder {
        public ViewHolder(View view) {
    @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    @Override public void onBindViewHolder(ViewHolder viewHolder, Cursor cursor) {

场景如下:应用程序的用户执行一些操作,需要在数据库中的一条记录上翻转一点。在该操作的侦听器中,很容易更改数据库中的一条记录,并确保视图随更改更新。但是我的光标不再同步。我遇到 "solved" 问题的方法是重新查询数据库并换入生成的新游标。但这似乎是在用锤子杀死一只苍蝇。我希望 RecyclerView.notifyDataSetChanged() 方法有一些神奇之处,但它什么也没做。

因此,给定一个加载了数据的 Cursor 和一个小的变化,再次 运行 查询是否有效且合适,获取一个新的 Cursor 并交换它,或者有没有更好的办法?

虽然运行再次完整查询的思路看起来效率不高,但是this example on github可以用来检查重新查询大量记录的影响。在主列表 activity 的 onCreate() 中,您可以在 repository.insertSome(n); 中输入大量数字。对于 1000 条记录,将 n 设置为 40 左右,等等

现在,当用户对其中一条记录执行操作(长按)时,数据库、模型和视图都会更新,并通过重新查询创建新游标。虽然数据库中有很多记录,但查询似乎并没有使用太多资源(即似乎响应很快)。