2012-12-23 1 views
0

에서 삭제이 나던 삭제목록보기에 항목하지만 난 내 SQLite 데이터베이스에서 항목을 삭제하려면이 방법을 사용 SQLite는

String nameString = (arg0.getItemAtPosition(arg2)).toString(); 
Log.d("itemtodelete", nameString); 
db.deleteItem(nameString); 
magicAdapter.remove(nameString); 
magicAdapter.notifyDataSetChanged(); 

문제는 내가 listview 항목을 삭제하면 항목이 사라지지만 데이터베이스를 다시 열지 않아도 항목이 계속 남아 있기 때문에 항목이 여전히 남아 있습니다. 나는 이미지와 함께이 문제를 설명하려고거야 :

I add an item

Here it is

I delete this

Bye bye Item

Re-open the list

Here it is again!

답변

1

이것은 데이터베이스에서 삭제하는 데 문제가 있음을 의미합니다. 그냥 삭제 된 행의 수있을 것입니다 여기에

int x = db.delete(TABLE_NAME, ITEMS_COLUMN + " =?", new String[] {item} 
Log.d("deletedItem", x); 

x와의 deleteItem() 2 번째 라인을 교체합니다. 삭제 후 x 값을 확인하십시오. 삭제가 성공하면 0보다 커야합니다. 그렇지 않으면 쿼리가 잘못되었다는 것을 의미하며이를 수정하기 위해 데이터베이스 스키마가 필요합니다. 귀하의 ListView 구현 코드에서 귀하의 nameString 자체가 잘못 되었음이 분명합니다. arraylist에 전체 Item을 추가하고 어댑터로 전달합니다. 당신이 onItemClick 대화 상자에서 항목을 가져올 때, 당신은 항목 객체를 반환이 코드 여기

String nameString = (arg0 
              .getItemAtPosition(arg2)) 
              .toString(); 

arg0.getItemAtPosition(arg2)을 사용하고 있습니다. 이런 식으로해야 할 것입니다. getName()이 항목의 이름을 반환

Item tempItem=(Item)items.get(arg2); 
String nameString=tempItem.getName(); 

.

+0

deletedItem 0 그래서 이것이 문제입니다! –

+0

하지만 이럴 수는 없습니다 항목 tempItem = (Item) arg0.getItemAtPosition (arg2); ClassCast 예외! –

+0

업데이트 된 답변을 확인하십시오. 이것은 확실히 작동 할 것이다! – Antrromet

-1

예. 이것이 문제입니다.

public class DatabaseHolder extends SQLiteOpenHelper { 

    private static final String DATABASE_NAME = "ItemsList"; 
    private static final String TABLE_NAME = "Items"; 
    private static final String ITEMS_COLUMN = "items_name"; 
    private static final String PRIORITY_COLUMN = "Priority"; 
    private static final String ID_COLUMN = "Items"; 

    private static int DATABASE_VERSION = 1; 

    private static String QUERY = "CREATE TABLE " + TABLE_NAME + "(" 
      + ID_COLUMN + " INTEGER PRIMARY KEY AUTOINCREMENT, " + ITEMS_COLUMN 
      + " TEXT NOT NULL, " + PRIORITY_COLUMN + " TEXT NOT NULL);"; 

    public DatabaseHolder(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 

     db.execSQL(QUERY); 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

     db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); 
     this.onCreate(db); 

    } 

    // Sharer! 

    public void addItem(String item_name, String priority) { 

     if (!duplicate(item_name)) { 
      SQLiteDatabase db = this.getWritableDatabase(); 

      ContentValues values = new ContentValues(); 
      values.put(ITEMS_COLUMN, item_name); 
      values.put(PRIORITY_COLUMN, priority); 

      db.beginTransaction(); 
      db.insert(TABLE_NAME, null, values); 
      db.setTransactionSuccessful(); 
      db.endTransaction(); 
      db.close(); 
     } 
    } 

    public boolean duplicate(String name) { 

     SQLiteDatabase db = this.getReadableDatabase(); 

     Cursor c = db.query(TABLE_NAME, null, ITEMS_COLUMN + " =?", 
       new String[] { name }, null, null, null); 
     int temp = c.getCount(); 
     c.close(); 
     db.close(); 
     if (temp > 0) 
      return true; 
     else 
      return false; 
    } 

    public ArrayList<Item> getAllItems() { 

     SQLiteDatabase db = this.getWritableDatabase(); 

     ArrayList<Item> item = new ArrayList<Item>(); 

     db.beginTransaction(); 

     Cursor cursor = db.query(TABLE_NAME, new String[] { this.ITEMS_COLUMN, 
       this.PRIORITY_COLUMN }, null, null, null, null, PRIORITY_COLUMN 
       + " DESC"); 

     while (cursor.moveToNext()) { 

      Item itemTemp = new Item(cursor.getString(cursor 
        .getColumnIndexOrThrow(ITEMS_COLUMN)), new Level(
        Integer.parseInt(cursor.getString(cursor 
          .getColumnIndexOrThrow(PRIORITY_COLUMN))))); 
      item.add(itemTemp); 

     } 

     cursor.close(); 
     db.endTransaction(); 
     db.close(); 
     return item; 

    } 

    public void deleteItem(String item){ 

     SQLiteDatabase db = this.getWritableDatabase(); 
     int x = db.delete(TABLE_NAME, ITEMS_COLUMN + " =?", new String[] {item}); 
     Log.d("deletedItem", String.valueOf(x)); 
     db.beginTransaction(); 

     db.delete(TABLE_NAME, ITEMS_COLUMN + " =?", new String[] {item}); 

     db.setTransactionSuccessful(); 

     db.endTransaction(); 

     db.close(); 


    } 

} 
+0

우선, 메소드에서 다음 삭제 행을 삭제하십시오.하나의 삭제 만 필요합니다. 두 번째로'itemtobedeleted'의 값을 확인하고 삭제 직전에 데이터베이스를 확인하십시오. 해당 항목이있는 데이터베이스의 행을 확인하십시오. 귀하의 DB를 확인하려면 http://stackoverflow.com/questions/8321246/how-can-i-read-my-database-from-ddms에서보십시오 – Antrromet

+0

쿼리가 올바른 것, 바보 같은 실수가 있어야합니다. 보내는 문자열과 문자열이 완벽하게 동일해야합니다 (대소 문자 구분). – Antrromet

+0

내 데이터베이스를 확인하는 방법을 알고 있지만 링크에 감사드립니다! 이 문제는 내 데이터베이스에 확실하도록이 항목을 만들기 전에 확인합니다. –

0

내가 한 변화 : 그건 내 데이터베이스 그래서

deletedItem = 0 로그 캣에

public void onClick(DialogInterface dialog, int which) { 
    String nameString = (arg0.getItemAtPosition(arg2)).toString(); 

    Log.d("itemtodelete", nameString); 

    db.deleteItem(nameString); 

    magicAdapter.remove(nameString); 
    magicAdapter.notifyDataSetChanged(); 

public void onClick(DialogInterface dialog, int which) { 
    String nameString = (arg0.getItemAtPosition(arg2)).toString(); 
    String nameStringData = nameString.substring(6, 
    nameString.indexOf("Priority Level:") - 1); 
    Log.d("itemtodelete", nameStringData); 
    db.deleteItem(nameStringData); 
    magicAdapter.remove(nameString); 

    magicAdapter.notifyDataSetChanged(); 

에 더 나은 제안이있는 경우 게시하시기 바랍니다 답변.

관련 문제