Android Sqlite - 获取正确的数据库行ID

时间:2012-12-07 22:09:19

标签: java android sqlite android-listview

我正在开发一款应用,允许用户在排练游戏时创建笔记。用户可以在列表视图中查看他们创建的注释,并根据需要编辑和删除它们。

以用户创建3个音符为例。在数据库中,row_id将是1,2和3.因此,当用户查看列表视图中的注释时,它们也将按顺序1,2,3(在我增加值之前的前提0,1,2) 。因此,用户可以从数据库中查看和删除正确的行。

当用户决定删除笔记时出现问题。假设用户删除位置2中的注释。因此我们的数据库将具有row_id的1和3.但是在列表视图中,它们将位于位置1和2.因此,如果用户单击列表视图中位置2处的注释,则应该使用row_id 3返回数据库中的行。但是它会尝试查找不存在的row_id 2,因此会崩溃。

我需要知道如何获取相应的row_id,给定用户在listview中的选择。以下是执行此操作的代码:

// When the user selects "Delete" in context menu
public boolean onContextItemSelected(MenuItem item) {
    AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
            .getMenuInfo();
    switch (item.getItemId()) {
    case DELETE_ID:
        deleteNote(info.id + 1);
        return true;
    }
    return super.onContextItemSelected(item);
}

// This method actually deletes the selected note
private void deleteNote(long id) {
    Log.d(TAG, "Deleting row: " + id);
    mNDbAdapter.deleteNote(id);
    mCursor = mNDbAdapter.fetchAllNotes();
    startManagingCursor(mCursor);
    fillData();
    // TODO: Update play database if there are no notes left for a line.
}

// When the user clicks on an item, display the selected note
protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);
    viewNote(id, "", "", true);

}

// This is where we display the note in a custom alert dialog. I've ommited
// the rest of the code in this method because the problem lies in this line:
// "mCursor = mNDbAdapter.fetchNote(newId);"
// I need to replace "newId" with the row_id in the database.
private void viewNote(long id, String defaultTitle, String defaultNote,
        boolean fresh) {

    final int lineNumber;
    String title;
    String note;

    id++;

    final long newId = id;

    Log.d(TAG, "Returning row: " + newId);

    mCursor = mNDbAdapter.fetchNote(newId);

    lineNumber = (mCursor.getInt(mCursor.getColumnIndex("number")));
    title = (mCursor.getString(mCursor.getColumnIndex("title")));
    note = (mCursor.getString(mCursor.getColumnIndex("note")));

            .
            .
            .
}

如果您希望我再显示代码,请与我们联系。这似乎很简单,但我找不到解决方案。

谢谢!

修改

我解决了这个问题。我回答了下面的问题。

1 个答案:

答案 0 :(得分:0)

好的,我已经解决了问题(至少是暂时的)。

问题是我使用自己创建的适配器类。它没有跟踪列表中的哪个项目与数据库中的项目相对应。我现在使用SimpleCursorAdapter重写了“fillData()”方法。

这是OLD实现,使用我自己的自定义适配器:

private void fillData() {
    String note;
    notes = new ArrayList<String>();

    // Populate arraylist with database data
    if (mCursor.moveToFirst()) {
        do {
            // Get current row's character and line
            note = mCursor.getString(mCursor.getColumnIndex("title"));
            Log.d(TAG, "Adding note: " + note);
            notes.add(note);
        } while (mCursor.moveToNext());
    }

    // Fill list with our custom adapter
    NoteAdapter adapter = new NoteAdapter(this, R.layout.note_row_layout,
            notes);
    setListAdapter(adapter);
}

这是使用SimpleCursorAdapter重新编写的类:

private void fillData() {
    mFrom = new String[] { NoteDbAdapter.KEY_TITLE };
    mTo = new int[] { R.id.textNote };

    // Now create an array adapter and set it to display using our row
    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
            R.layout.note_row_layout, mCursor, mFrom, mTo);

    setListAdapter(adapter);
}

我创建自己的适配器类的原因是因为我在列表的每一行中都有一个复选框(用于多次删除)。

我现在的问题是,当用户决定在使用SimpleCursorAdapter时进行多次删除时,我是否能够获取每个复选框的状态(无论是否已选中)?

感谢。