2013-06-28 82 views
0

我有一個列表視圖,當用戶單擊特定項目時,只顯示一個項目(應該刪除它)的上下文操作模式。但是,當我單擊它時,數據庫不會更新(該項目仍在列表中)。任何人都可以幫我嗎?從SQL數據庫中刪除android

在MainActivity:

final Context context = this; 
ArrayAdapter<String> arrayAdapter; 
ArrayList<String> listItems = new ArrayList<String>(); 
ListView lv; 
protected Object mActionMode; 
int catPos; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    CategoryDatabase entry = new CategoryDatabase(MainActivity.this); 
    entry.open(); 

    List<String> all = entry.getAllCategory(); 
    if(all.size()> 0){  
     lv = (ListView)findViewById(R.id.listView1); 
     arrayAdapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1, all); 
     lv.setAdapter(arrayAdapter); 
    }else{ 
     Toast.makeText(MainActivity.this,"No items to display",Toast.LENGTH_LONG).show(); 
    } 
    entry.close(); 

    lv.setOnItemLongClickListener(new OnItemLongClickListener() { 

     @Override 
     public boolean onItemLongClick(AdapterView<?> parent, View view, 
      int position, long id) { 

      catPos = position; 

      if (mActionMode != null) { 
      return false; 
      } 

      // Start the CAB using the ActionMode.Callback defined above 
      mActionMode = MainActivity.this 
       .startActionMode(mActionModeCallback); 
      view.setSelected(true); 
      return true; 
     } 
     }); 


} 

public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 
     switch (item.getItemId()) { 
      case R.id.menu_delete_cat: 
       // shareCurrentItem(); 
       CategoryDatabase entry = new CategoryDatabase(MainActivity.this); 
       entry.open(); 
       entry.deleteCat(catPos); 

       List<String> all = entry.getAllCategory(); 
       lv = (ListView)findViewById(R.id.listView1); 
       arrayAdapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1, all); 
       lv.setAdapter(arrayAdapter); 
       entry.close(); 
       mode.finish(); // Action picked, so close the CAB 
       return true; 
      default: 
       return false; 
     } 
    } 

在實際的數據庫:

public class CategoryDatabase { 

public static final String KEY_ROWID = "_id"; 
public static final String KEY_CATEGORY = "category"; 

private static final String DATABASE_NAME = "DBCategory"; 
private static final String DATABASE_TABLE = "categoryTable"; 
private static final int DATABASE_VERSION = 1; 

private DbHelper ourHelper; 
private final Context ourContext; 
private SQLiteDatabase ourDatabase; 

public CategoryDatabase(Context c){ 
    ourContext = c; 
} 

public CategoryDatabase open() throws SQLException{ 
    ourHelper = new DbHelper(ourContext); 
    ourDatabase = ourHelper.getWritableDatabase(); 
    return this; 
} 

public void close(){ 
    ourHelper.close(); 
} 

private static class DbHelper extends SQLiteOpenHelper{ 

    public DbHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" + 
       KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 
       KEY_CATEGORY + " TEXT NOT NULL);" 
     ); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE); 
     onCreate(db); 
    } 

} 

public long createEntry(String category) { 
    ContentValues cv = new ContentValues(); 
    cv.put(KEY_CATEGORY, category); 
    return ourDatabase.insert(DATABASE_TABLE, null, cv); 
} 

public List<String> getAllCategory() { 
    List<String> List = new ArrayList<String>(); 
    // Select All Query 
    String selectQuery = "SELECT * FROM " + DATABASE_TABLE; 

    Cursor cursor = ourDatabase.rawQuery(selectQuery, null); 

    // looping through all rows and adding to list 
    if (cursor.moveToFirst()) { 
     do { 
      List.add(cursor.getString(1)); 
     } while (cursor.moveToNext()); 
    } 
    return List; 
    } 

public void deleteCat(int catPos) { 
    ourDatabase.delete(DATABASE_TABLE, KEY_ROWID + "=" + catPos, null);  
} 

}

+1

這裏的問題是,該位置是不同的rowID。所以如果你通過entry.deleteCat(catPos),它和數據庫中的id不一樣。 – Opiatefuchs

回答

1

刪除爲 「entry.deleteCat(catPos);」是不正確的。如果您使用您的catPos,它是listView中的位置,它不會從數據庫中刪除條目。你在你的數據庫中創建了一個INTEGER_PRIMARY_KEY_AUTOINCREMENT,所以這個Integer將自動生成,並且可以與你的位置Integer不同。你需要做的是,在你的數據庫中創建一個查詢方法,你甚至可以從你的DB-Entry獲得ID。那麼你可以打電話

entry.deleteCat(databaseId); 
+0

你的意思是KEY_ROWID? – Dodi

+0

是的,就是這樣...... – Opiatefuchs