나는 연극을 연습하면서 노트를 만들 수있는 앱을 만들고 있습니다. 사용자는 작성한 메모를 목록보기에서보고 원하는 경우 편집하고 삭제할 수 있습니다.Android Sqlite - 올바른 데이터베이스 행 ID를 얻으려면
예를 들어 사용자가 3 개의 노트를 생성합니다. 데이터베이스에서 row_id의 값은 1, 2, 3이 될 것입니다. 따라서 사용자가 listview에서 노트를 볼 때, 값을 증가시키기 전에 순서 1, 2, 3 (intially 0, 1, 2) . 따라서 사용자는 데이터베이스에서 올바른 행을보고 삭제할 수 있습니다.
사용자가 메모를 삭제하기로 결정할 때 문제가 발생합니다. 사용자가 위치 2의 노트를 삭제한다고 가정 해 봅시다. 따라서 데이터베이스의 row_id가 1과 3이됩니다.하지만 listview에서는 1과 2의 위치에 있습니다. 따라서 사용자가 listview에서 2 위의 노트를 클릭하면 row_id 3을 사용하여 데이터베이스의 행을 반환해야합니다. 그러나 존재하지 않는 row_id 2를 찾으므로 충돌합니다.
목록보기에서 사용자의 선택에 따라 해당 row_id를 얻는 방법을 알아야합니다. 여기에 아래의 코드이 않습니다이다 :
// 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")));
.
.
.
}
는 더 이상 코드를 보여 나를 좋아하면 알려주세요. 그렇게 간단한 것처럼 보이지만 해결책을 찾을 수 없습니다.
감사합니다.
수정
문제가 해결되었습니다. 나는 아래 질문에 답했다.
주문한 ID를 1, 2, 3으로 유지하지 마십시오. 참고 1이 삭제되면 주문을 유지하기 위해 전체 데이터베이스를 다시 작성하지 마십시오. CursorAdapter를 사용하고 있습니까? 왜'viewNote()'에서'id ++'를 사용합니까, 왜'mNDbAdapter.fetchNote (id)'가 아닌가요? – Sam
필요한 경우 1을 빼거나 더하십시오! – Pavlos
스택 추적을 추가 할 수 있습니까? 또한, 왜 deleteNote (info.id + 1)를 사용하여 증가합니까? –