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

删除游标适配器中的项目

  •  0
  • rgamber  · 技术社区  · 12 年前

    我实现了 CursorAdapter 我正在使用 Loader 通过 ListFragment 。除以下问题外,此操作正常。它包含以下代码。每行都包含一个复选框,用户可以在其中选择项目。有一个 删去 按钮,允许用户删除所选项目。这是通过我实现 ContentProvider .

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        //some logic
        this.cursor = cursor; //class variable assignment
    }
    
    void deleteStuff() {
    
            if (cursor == null) {
                return;
            }
    
            if (checkedItems == null || checkedItems.size()==0) { //A Sparse boolean array which saves the positions of items the user selected
                return;
            }
    
            final SparseIntArray checkedKeys = new SparseIntArray();  //positions of selected items
            final SparseLongArray checkedIds = new SparseLongArray(); //ids of the items at the resp keys
    
            for (int i = 0; i < checkedItems.size(); i++) {
                final int checkedItemKey = checkedItems.keyAt(i);
                checkedKeys.append(i, checkedItemKey);
                cursor.moveToPosition(checkedItemKey); //the line at which it fails!!!!!!!!
                checkedItemIds.append(checkedItemKey, Long.parseLong(c.getString(0)));
            }
    
            for (int i = 0; i < checkedItems.size(); i++) {
                myContentProvider.delete(uri, selection, args); //not putting the code for these 3 variables as not required
            }
    
    }
    

    下面是 内容提供者 :

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        int uriType = sURIMatcher.match(uri);
        SQLiteDatabase sqlDB = sqlitehelper.getWritableDatabase();
        int rowsDeleted = sqlDB.delete(TJItemTable.TABLE_NAME, selection, selectionArgs);
        getContext().getContentResolver().notifyChange(uri, null);
        return rowsDeleted;
    }
    

    当我选择多个项目并删除时,第一次它工作得很好,做了它应该做的事情。但是,现在如果我选择了更多的项目,然后再次单击删除,它会在第XX行失败。

    我遇到的错误 日志类别 是 java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteQuery: SELECT id as _id, name, value FROM stufftable WHERE (value=?) 。发生故障的线路为: cursor.moveToPosition(checkedItemKey)

    我确实看过 this ,并理解我将光标置于关闭状态或不一致状态。然而,我想不出什么能解决我的问题。我做错了什么?

    注:我正在打电话 getContext().getContentResolver().notifyChange(uri, null) 在我的 ContentProvider.delete() 与 装载机 我想,会通知光标。我还试着 this.notifyDataSetChanged() 最后没有任何运气。

    2 回复  |  直到 12 年前
        1
  •  0
  •   Dan Cuc    12 年前

    每次输入时,在deleteStuff()中创建一个新的游标,而不是使用newView中的游标,该游标将搜索要删除的条目。(这应该有效)

    您也可以尝试使用bindView中的光标,但我不确定这是否有效。

        2
  •  0
  •   rgamber    12 年前

    更新: 我最终以一种简单得多的方式做到了这一点。我用CheckBox.setOnCheckedChangeListener()内的位置填充checkedItems,该位置位于bindView()内。我将其更改为包含要删除的项目的id,而不是获取位置,然后使用带有位置的光标:)。所以在delete()中,我已经准备好了要删除的ID,并且我不必在这里使用光标。这是我想要的。我希望我能早点想到这一点,这样我就不必把问题贴在这里了。我希望这对某人有所帮助!