2012-12-07 2 views
1

나는 연극을 연습하면서 노트를 만들 수있는 앱을 만들고 있습니다. 사용자는 작성한 메모를 목록보기에서보고 원하는 경우 편집하고 삭제할 수 있습니다.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"))); 

      . 
      . 
      . 
} 

는 더 이상 코드를 보여 나를 좋아하면 알려주세요. 그렇게 간단한 것처럼 보이지만 해결책을 찾을 수 없습니다.

감사합니다.

수정

문제가 해결되었습니다. 나는 아래 질문에 답했다.

+0

주문한 ID를 1, 2, 3으로 유지하지 마십시오. 참고 1이 삭제되면 주문을 유지하기 위해 전체 데이터베이스를 다시 작성하지 마십시오. CursorAdapter를 사용하고 있습니까? 왜'viewNote()'에서'id ++'를 사용합니까, 왜'mNDbAdapter.fetchNote (id)'가 아닌가요? – Sam

+0

필요한 경우 1을 빼거나 더하십시오! – Pavlos

+0

스택 추적을 추가 할 수 있습니까? 또한, 왜 deleteNote (info.id + 1)를 사용하여 증가합니까? –

답변

0

그래, 문제를 해결했습니다 (적어도 일시적으로).

문제는 제가 만든 어댑터 클래스를 사용하고 있다는 것이 었습니다. 목록의 어떤 항목이 데이터베이스의 항목과 일치하는지 추적하지 못했습니다. 이제 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); 
} 

이는 SimpleCursorAdapter로 rewitten 같은 클래스 : 나는 내 자신의 어댑터 클래스를 만든 이유였다

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를 사용할 때 다중 삭제를 결정할 때 각 체크 박스의 상태 (체크 여부와 상관없이)를 얻을 수 있습니까?

감사합니다.

+0

체크 박스가 작동하려면 맞춤 어댑터가 필요합니다. 그냥 배열 어댑터 대신 커스텀 커서 어댑터를 만드십시오. – mango

관련 문제