0

我有一个 SQLite 数据库,我将用户选择的数据保存到其中。此数据将在列表视图中可见,如果您长按数据,它将删除该项目。当我看到该项目从列表视图中消失时,这是有效的,但是当我重新启动应用程序并且所有列表视图项目都从数据库中恢复时,被删除的所有内容都会回来。我正在使用这个语句:

public void deleteAlarmEntry(int pos){
        Log.i("Deleting item from pos: ", String.valueOf(pos));
        db.delete(MySQLHelper.TABLE_NAME, MySQLHelper.ID_COL + "='" + pos + "'", null);
    }

我可以在日志中看到正在调用的语句。有没有更好的方法来确保语句正确执行?这里有什么问题吗?

这是我在长按列表视图项时在 MainActivity 中调用的 removeItem 方法:

public void removeItem(int position) {
    alarmItemArray.remove(position);
    dataSource.deleteAlarmEntry(position);
    alarmAdapter.notifyDataSetChanged();
}

dataSource.deleteAlarmEntry() 调用上述数据库删除。

此外,在应用程序启动时,我将条目带入临时数组列表,然后解析时间以获取适配器数组列表,如下所示:

dataSource = new WeatherDataSource(this);
    dataSource.open();

    ArrayList<AlarmEntry> alarmEntries = (ArrayList<AlarmEntry>) dataSource.getAllWeatherEntries();

    alarmItemArray = getTimeFromEntries(alarmEntries);

    alarmAdapter = new ArrayAdapter<String>(this, 
            R.layout.activity_alarm_item, R.id.time, alarmItemArray);

    lv = (MyListView) findViewById(R.id.listview);
    lv.setAdapter(alarmAdapter);

这是数据库的 getAllWeatherEntries:

public List<AlarmEntry> getAllWeatherEntries(){
    List<AlarmEntry> weatherEntry = new ArrayList<AlarmEntry>();

    Cursor cursor = db.query(MySQLHelper.TABLE_NAME, cols, null, null, null, null, null);

    cursor.moveToFirst();
    while (!cursor.isAfterLast()) {
        AlarmEntry m = cursorToEntry(cursor);
        weatherEntry.add(m);
        Log.i("Get all weather entries", m.getTime());
        cursor.moveToNext();
    }
    cursor.close();


    return weatherEntry;
}
4

2 回答 2

0

您只是将该项目中的所有内容传递给您的查询。

OnContextMenuItemSelected你将需要做类似下面的事情; 您将需要更改您的参数deleteAlarmEntry以接收字符串而不是 int。

@Override
public boolean onContextItemSelected(MenuItem item) {
    AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
String selectedID;
// adapter is the Adapter from creating the listview
    selectedID = String.valueOf(adapter.getItemId(info.position));
    deleteAlarmEntry(selectedID);
    }

您还需要修改 db.delete 以返回一个数字,即int result = db.delete()每个函数。http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html

编辑:

您可能想要使用OnItemLongClickListener而不是OnLongClickListener

http://developer.android.com/reference/android/widget/AdapterView.OnItemLongClickListener.html

lv.setOnItemLongClickListener(new OnItemLongClickListener() {
        public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
            String id = String.valueOf(alarmAdapter.getItemId(position);
removeItem(id);
            }
    });

第二次编辑:试试这个光标适配器,我建议使用一个简单的光标适配器:http: //developer.android.com/reference/android/widget/SimpleCursorAdapter.html

String[] from = new String[]{"time"}; //enter your time column name here
int[] to = new int[]{R.id.time};
Cursor cursor = db.query(MySQLHelper.TABLE_NAME, cols, null, null, null, null, null);
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,R.layout.activity_alarm_item, cursor, from, to);
lv.setAdapter(adapter);
于 2013-07-22T18:36:26.360 回答
0

利用,

public void deleteAlarmEntry(int pos) {
    db.delete(MySQLHelper.TABLE_NAME, MySQLHelper.ID_COL + "=?", new String[]{pos + ""});
}
于 2013-07-22T18:57:27.733 回答