【问题标题】:Using a Context Menu to delete from a SQLite database in Android在 Android 中使用上下文菜单从 SQLite 数据库中删除
【发布时间】:2010-03-26 19:17:20
【问题描述】:

我创建了一个列表视图,显示存储在 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到列表视图中已选择的项目?

【问题讨论】:

    标签: java android sqlite contextmenu


    【解决方案1】:

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

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        AdapterView.AdapterContextMenuInfo info = 
            (AdapterView.AdapterContextMenuInfo)item.getMenuInfo();
    
                Track track = (Track)mAdapter.getItem(info.position);
    

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

    【讨论】:

    【解决方案2】:

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

    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方法的类或Fragment中,声明如下:

     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)

    【讨论】:

      【解决方案3】:

      我无法对@synic 的答案添加评论,但它完全适合我。下面的代码可以获取Listview的item:

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

      然后你可以对项目做你想做的事情,比如 getId()、getName()、getDate() 或其他东西。祝你开心。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多