使用上下文菜单从Android中的SQLite数据库中删除

时间:2010-03-26 19:17:20

标签: java android sqlite contextmenu

我创建了一个列表视图,显示存储在SQLite数据库中的项目的名称和日期,现在我想使用上下文菜单修改存储在数据库中的这些项目,例如编辑名称,删除和查看。

这是列表视图的代码:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.listview);

    SQLiteDatabase myDB = null; 
    myDB = this.openOrCreateDatabase(MY_DB_NAME, MODE_PRIVATE, null);

    Cursor cur = myDB.rawQuery("SELECT _id, trackname, tracktime" + " FROM " + MY_DB_TABLE, null);
    ListAdapter adapter = new SimpleCursorAdapter(this, R.layout.listview, cur,
    new String[] { Constants.TRACK_NAME, Constants.TRACK_TIME}, new int[] { R.id.text1, R.id.text2});
    ListView list = (ListView)findViewById(R.id.list);
    list.setAdapter(adapter);
    registerForContextMenu(list);
}

和上下文菜单......

public void onCreateContextMenu(ContextMenu menu, View v,
        ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    menu.setHeaderTitle("Track Options");
    menu.add(0, CHANGE_NAME, 0, "Change name");

    menu.add(0, VIEW_TRACK, 0, "View track");

    menu.add(0, SEND_TRACK, 0, "Send track");

    menu.add(0, DELETE_TRACK, 0, "Delete track");


}

我使用了Switch语句控制菜单项..

public boolean onContextItemSelected(MenuItem item) {
   switch (item.getItemId()){
   case CHANGE_NAME:
       changename();
       return true;

   case DELETE_TRACK:
       deletetrack();
       return true;

   default:
   return super.onContextItemSelected(item);
}

那么我将如何继续映射deletetrack();找到存储在数据库中的轨道的ID到列表视图中选择的项目的方法?

3 个答案:

答案 0 :(得分:3)

在您的onContextItemSelected()中,执行以下操作:

@Override
public boolean onContextItemSelected(MenuItem item) {
    AdapterView.AdapterContextMenuInfo info = 
        (AdapterView.AdapterContextMenuInfo)item.getMenuInfo();

            Track track = (Track)mAdapter.getItem(info.position);

键是“position”,它将为您提供所选项目的索引。

答案 1 :(得分:1)

我试过这种方法和许多其他方法,但没有一个对我有用。 这就是我最终得到它的方式:

1。我在我的数据库处理程序类(扩展SQLiteOpenHelper的类)中创建了一个方法,该方法检索数据库中的所有ID:

public ArrayList<HashMap<String, String>> selectAllIds() {
    try {
        ArrayList<HashMap<String, String>> idArrayList = new ArrayList<HashMap<String, String>>();
        HashMap<String, String> map;

        SQLiteDatabase database = this.getReadableDatabase();

        String query = "SELECT * FROM " + DEBTS_TABLE_NAME;

        Cursor cursor = database.rawQuery(query, null);

        if (cursor != null) {
            if (cursor.moveToFirst()) {
                do {
                    map = new HashMap<String, String>();
                    map.put("id", cursor.getString(0));
                    idArrayList.add(map);

                } while (cursor.moveToNext());
            }
        }
        if (cursor != null) {
            cursor.close();
        }
        database.close();
        return idArrayList;


    } catch (Exception e) {
        return null;
    }

}

2。在具有onContextItemSelected方法的类或片段中,声明:

 ArrayList<HashMap<String, String>> myIds;

3。然后在我的onContextItemSelected方法中:

public boolean onContextItemSelected(MenuItem item) {
    AdapterView.AdapterContextMenuInfo info =

 (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();

    myIds = debtDatabaseHandler.selectAllIds();
    int id = Integer.parseInt(myIds.get(info.position).get("id"));

我的数据库中的id是Integer类型的,这就是我必须解析它的原因。如果你的id是一个字符串,那就做:

String id = myIds.get(info.position).get("id");

4. 最后,将此ID传递给调用以删除数据库中的行:

yourDatabase.deleteMethod(id);

理念信用: Android Delete Rows Data in SQLite Database (Android SQLite)

答案 2 :(得分:0)

我无法在@synic的答案中添加评论,但它对我来说完全有效。下面的代码可以获取Listview的项目:

AdapterView.AdapterContextMenuInfo info = 
            (AdapterView.AdapterContextMenuInfo)aItem.getMenuInfo();

然后你可以对项目做你想做的事情,比如getId(),getName(),getDate()等等。祝你高兴。