ListView id位置和行ID之间的混淆

时间:2012-01-30 23:55:59

标签: android sql listview

更新

当然,在我发布这篇文章之后,我想出了办法。几乎每次都会发生。

所以我将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;
    }

   }

谢谢!

0 个答案:

没有答案