代码之家  ›  专栏  ›  技术社区  ›  CodeFusionMobile

Android SimpleCursorAdapter在数据库更改时不更新

  •  43
  • CodeFusionMobile  · 技术社区  · 15 年前

    我有安卓系统 ListActivity 由数据库支持的 Cursor 通过一 SimpleCursorAdapter .

    单击项目时,将切换数据库中对应行中的标志字段,并需要更新列表中的视图。

    问题是,当更新的视图离开屏幕并被回收时,旧值将在视图返回视图时显示在视图上。每当重新绘制THR列表(方向更改等)时,都会发生同样的事情。

    我用 notifydatasetchanged() 刷新光标适配器,但似乎无效。

    我应该如何更新数据库以便更新光标?

    6 回复  |  直到 9 年前
        1
  •  90
  •   CommonsWare    12 年前

    呼叫 requery() Cursor 当您更改数据库中要在其中反映的数据时 光标 (或事物) 光标 人口,比如 ListView 通过A CursorAdapter )

    光标 类似于一个ODBCclient-side游标——它保存查询结果所表示的所有数据。因此,仅仅因为更改了数据库中的数据, 光标 除非通过以下方式刷新,否则将不知道这些更改 请求() .


    更新 :这个问题和答案集都应该因年老而删除,但这显然是不可能的。任何寻求Android答案的人都应该记住,Android是一个快速移动的目标,而2009年的答案通常比新答案更糟糕。

    目前的解决方案是 光标 并使用任一 changeCursor() swapCursor() 游标适配器 影响数据更改。

        2
  •  38
  •   rony l    14 年前

    requery 现已弃用。从 documentation 以下内容:

    此方法已弃用。 不要用这个。只需请求一个新的光标,这样您就可以异步执行此操作,并在新光标返回后更新您的列表视图。

    获得新光标后,可以使用 adapter.changeCursor(cursor) . 这应该更新视图。

        3
  •  21
  •   siefca    13 年前

    如果使用加载程序和自动生成的光标,可以调用:

    getLoaderManager().restartLoader(0, null, this);
    

    在您的活动中,在更改了数据库上的某些内容之后,重新生成新的光标。 不要忘记还定义了事件处理程序:

    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
        CursorLoader cursorLoader =
                new CursorLoader(this,
                        YOUR_URI,
                        YOUR_PROJECTION, null, null, null);
        return cursorLoader;
    }
    
    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
        adapter.swapCursor(data);
    }
    
    @Override
    public void onLoaderReset(Loader<Cursor> loader) {
        adapter.swapCursor(null);
    }
    
        4
  •  1
  •   avpaderno    12 年前

    我不清楚你是否设置了 autoRequery CursorAdapter的属性 true .

    适配器将检查 自动驾驶仪 财产;如果是 false ,则不会更改光标。

        5
  •  0
  •   Jaroslav    10 年前

    requery()已经被弃用,只需在Cursoradapter的子类中实现这样的简单updateUI()方法,并在数据更新后调用它:

    private void updateUI(){
        swapCursor(dbHelper.getCursor());
        notifyDataSetChanged();
    }
    
        6
  •  0
  •   Shwarz Andrei    9 年前

    这很容易。

    private Db mDbAdapter;
    private Cursor mCursor;
    private SimpleCursorAdapter mCursorAd;
    
    .....................................
    //After removing the item from the DB, use this
    .....................................
    
     mCursor = mDbAdapter.getAllItems();
     mCursorAd.swapCursor(mCursor);
    

    或者使用CursorLoader…

    推荐文章