更新
当然,在我发布这篇文章之后,我想出了办法。几乎每次都会发生。
所以我将CursorAdapter放在刷新数据库函数之外,这样我就可以在刷新函数之外访问它了。然后我实现了
mDbHelper.deleteTask(tasks.getItemId(pos));
以便根据位置找到正确的ID。刚给了这几个测试,似乎与我的轻扫手势完美配合!如果这是令人不悦的话,请分享!
在完成使用SQLite和ListView的教程后,我感到非常困惑。我填写了列表,我理解添加到数据库并刷新视图的概念,但我似乎无法理解如何正确删除。
我知道你将一个rowId传递给SQL数据库,我已经将其分配给我添加的所有内容,自动递增,然后基于该自动增量rowId删除,但是如何获取正确的rowId?
我可以通过以下方式实现从ListView获取位置的相同效果:
ListView lv = getListView();
int pos = lv.pointToPosition((int)e.getX(), (int)e.getY());
然后我可以把它扔进我的删除功能
mDbHelper.deleteTask(pos);
这将正常工作,但最终列表位置ID和SQL rowID的位置不会在一次或两次删除时正确同步。我非常觉得自己错了。
与此问题相似:ListView row id and position index confusion
答案说,我一直在努力做我想做的事情,这是不好的做法。我在网上看到的所有示例都使用了onContextMenu选项,但我想将它用于手势或使用一系列复选框。
这是我的DataBaseHelper文件或适配器我非常确定它被称为:
package com.warner.taskswipe;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class TaskDatabaseHelper {
private static final String DATABASE_NAME = "data";
private static final String DATABASE_TABLE = "tasks";
private static final int DATABASE_VERSION = 1;
public static final String KEY_TITLE = "task";
public static final String KEY_BODY = "description";
public static final String KEY_ROWID = "_id";
private DatabaseHelper mDbHelper;
private SQLiteDatabase mDb;
//Creating our table with the setup for id, task, description
private static final String DATABASE_CREATE =
"create table " + DATABASE_TABLE + " ("
+ KEY_ROWID + " integer primary key autoincrement, "
+ KEY_TITLE + " text not null, "
+ KEY_BODY + " text not null);";
private final Context mCtx;
//Constructor for our DatabaseHelper class to set the context object
public TaskDatabaseHelper (Context ctx) {
this.mCtx = ctx;
}
public static class DatabaseHelper extends SQLiteOpenHelper{
DatabaseHelper(Context context){
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(DATABASE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//Not used
}
}
//Open the database
public TaskDatabaseHelper open() throws android.database.SQLException {
mDbHelper = new DatabaseHelper(mCtx);
mDb = mDbHelper.getWritableDatabase();
return this;
}
//Close the database
public void close() {
mDbHelper.close();
}
//Create a task
public long createTask(String title, String description) {
ContentValues initialValues = new ContentValues();
initialValues.put(KEY_TITLE, title);
initialValues.put(KEY_BODY, description);
return mDb.insert(DATABASE_TABLE, null, initialValues);
}
//Delete a task
public boolean deleteTask(long rowId){
return mDb.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0;
}
public Cursor fetchAllTasks() {
return mDb.query(DATABASE_TABLE, new String[] { KEY_ROWID, KEY_TITLE, KEY_BODY},
null, null, null, null, null);
}
public Cursor fetchTask(long rowId) throws SQLException {
Cursor mCursor = mDb.query(true, DATABASE_TABLE, new String[] {KEY_ROWID, KEY_TITLE, KEY_BODY}, KEY_ROWID + "=" + rowId,
null, null, null, null, null);
if(mCursor != null)
mCursor.moveToFirst();
return mCursor;
}
public boolean updateTask(long rowId, String title, String description){
ContentValues args = new ContentValues();
args.put(KEY_TITLE, title);
args.put(KEY_BODY, description);
return mDb.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0;
}
}
谢谢!