Java Android Sqlite-获取正确的数据库行id
我正在开发一个应用程序,允许用户在排练剧本时创建笔记。用户可以在listview中查看他们创建的注释,并根据需要编辑和删除它们 以用户创建3个注释为例。在数据库中,行id将为1、2和3。因此,当用户在listview中查看注释时,在我增加值之前,注释的顺序也将是1、2、3,即0、1、2。因此,用户可以查看并从数据库中删除正确的行 当用户决定删除注释时,会出现问题。假设用户删除位置2的注释。因此,我们的数据库将具有行id的1和3。但在listview中,它们将位于位置1和2。因此,如果用户单击listview中位置2的注释,它应该返回数据库中具有行_id 3的行。但是,它试图查找不存在的行_id 2,因此崩溃 我需要知道,如果用户在listview中进行了选择,如何获得相应的row_id。下面是执行此操作的代码:Java Android Sqlite-获取正确的数据库行id,java,android,sqlite,android-listview,Java,Android,Sqlite,Android Listview,我正在开发一个应用程序,允许用户在排练剧本时创建笔记。用户可以在listview中查看他们创建的注释,并根据需要编辑和删除它们 以用户创建3个注释为例。在数据库中,行id将为1、2和3。因此,当用户在listview中查看注释时,在我增加值之前,注释的顺序也将是1、2、3,即0、1、2。因此,用户可以查看并从数据库中删除正确的行 当用户决定删除注释时,会出现问题。假设用户删除位置2的注释。因此,我们的数据库将具有行id的1和3。但在listview中,它们将位于位置1和2。因此,如果用户单击li
// 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")));
.
.
.
}
让我知道如果你想让我显示更多的代码。这看起来很简单,但我就是找不到解决办法
谢谢
编辑
我解决了这个问题。我回答了下面的问题。好的,我至少暂时解决了这个问题 问题是我使用自己创建的适配器类。它没有跟踪列表中的哪个项目与数据库中的项目相对应。现在,我已经使用SimpleCursorAdapter重写了fillData方法 这是旧的实现,带有我自己的自定义适配器:
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);
}
我创建自己的适配器类的原因是,我在列表的每一行中都有一个复选框,用于多重删除
我现在的问题是,当用户决定在使用SimpleCorsOrAdapter时执行多次删除时,我是否能够获取每个复选框的状态,无论其是否已选中
谢谢 你不应该试图保持身份证的顺序1,2,3。。。如果删除了注释1,不要为了维护订单而修改整个数据库。你在用游标适配器吗?为什么在viewNote中使用id++呢,为什么不使用mNDbAdapter.fetchNoteid呢?需要时,只需减去或添加1即可!你能添加stacktrace吗?另外,为什么要用deleteNoteinfo.id+1递增?@Sam我无法使用id,因为listview的id值与数据库中的id值不同。如果您想查看,我已经发布了我的解决方案。对于您的复选框工作,您需要一个自定义适配器。只需制作一个自定义游标适配器而不是数组适配器
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);
}