0

このメソッドを使用して、SQLite データベースのアイテムを削除します。

public void deleteItem(String item){
    SQLiteDatabase db = this.getWritableDatabase();

    db.beginTransaction();
    db.delete(TABLE_NAME, ITEMS_COLUMN + " =?",  new String[] {item});
    db.setTransactionSuccessful();
    db.endTransaction();
    db.close();
}

そしてこれを私のListViewに:

String nameString = (arg0.getItemAtPosition(arg2)).toString();
Log.d("itemtodelete", nameString);
db.deleteItem(nameString);
magicAdapter.remove(nameString);
magicAdapter.notifyDataSetChanged();

問題は、アイテムを削除するとlistviewアイテムが消えますが、再度開くと、データベースから削除されないため、アイテムがまだそこにあることです。これを画像で説明しようとします:

アイテムを追加します

ここにあります

これを削除します

バイバイアイテム

リストを再度開く

また来たよ!

4

3 に答える 3

1

これは、データベースからの削除に問題があることを意味します。deleteItem() の 2 行目を次のように置き換えるだけです。

int x = db.delete(TABLE_NAME, ITEMS_COLUMN + " =?",  new String[] {item}
Log.d("deletedItem", x);

ここxに削除された行数があります。削除後に x の値を確認してください。削除が成功した場合は、0 より大きいはずです。そうでない場合は、クエリが間違っていることを意味し、それを修正するにはデータベース スキーマが必要になります。ListView実装コードから、あなたnameString自身が間違っていることは明らかです。Itemarraylistに全体を追加し、アダプターに渡します。ダイアログでアイテムを取得するときonItemClickは、このコードを使用しています

 String nameString = (arg0
                                            .getItemAtPosition(arg2))
                                            .toString();

ここでarg0.getItemAtPosition(arg2)は Item オブジェクトを返します。あなたはこのようなことをしなければならないでしょう。

Item tempItem=(Item)items.get(arg2);
String nameString=tempItem.getName();

wheregetName()はアイテムの名前を返します。

于 2012-12-23T03:46:50.093 に答える
0

私が行った変更:

public void onClick(DialogInterface dialog, int which) {
    String nameString = (arg0.getItemAtPosition(arg2)).toString();

    Log.d("itemtodelete", nameString);

    db.deleteItem(nameString);

    magicAdapter.remove(nameString);
    magicAdapter.notifyDataSetChanged();

public void onClick(DialogInterface dialog, int which) {
    String nameString = (arg0.getItemAtPosition(arg2)).toString();
    String nameStringData = nameString.substring(6,
    nameString.indexOf("Priority Level:") - 1);
    Log.d("itemtodelete", nameStringData);
    db.deleteItem(nameStringData);
    magicAdapter.remove(nameString);

    magicAdapter.notifyDataSetChanged();

より良い提案がある場合は、回答を投稿してください。

于 2012-12-23T05:28:02.910 に答える
-1

はい、これが問題です。

deleteItem = 0 on logCat なので、それが私のデータベースです:

public class DatabaseHolder extends SQLiteOpenHelper {

    private static final String DATABASE_NAME = "ItemsList";
    private static final String TABLE_NAME = "Items";
    private static final String ITEMS_COLUMN = "items_name";
    private static final String PRIORITY_COLUMN = "Priority";
    private static final String ID_COLUMN = "Items";

    private static int DATABASE_VERSION = 1;

    private static String QUERY = "CREATE TABLE " + TABLE_NAME + "("
            + ID_COLUMN + " INTEGER PRIMARY KEY AUTOINCREMENT, " + ITEMS_COLUMN
            + " TEXT NOT NULL, " + PRIORITY_COLUMN + " TEXT NOT NULL);";

    public DatabaseHolder(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {

        db.execSQL(QUERY);

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
        this.onCreate(db);

    }

    // Sharer!

    public void addItem(String item_name, String priority) {

        if (!duplicate(item_name)) {
            SQLiteDatabase db = this.getWritableDatabase();

            ContentValues values = new ContentValues();
            values.put(ITEMS_COLUMN, item_name);
            values.put(PRIORITY_COLUMN, priority);

            db.beginTransaction();
            db.insert(TABLE_NAME, null, values);
            db.setTransactionSuccessful();
            db.endTransaction();
            db.close();
        }
    }

    public boolean duplicate(String name) {

        SQLiteDatabase db = this.getReadableDatabase();

        Cursor c = db.query(TABLE_NAME, null, ITEMS_COLUMN + " =?",
                new String[] { name }, null, null, null);
        int temp = c.getCount();
        c.close();
        db.close();
        if (temp > 0)
            return true;
        else
            return false;
    }

    public ArrayList<Item> getAllItems() {

        SQLiteDatabase db = this.getWritableDatabase();

        ArrayList<Item> item = new ArrayList<Item>();

        db.beginTransaction();

        Cursor cursor = db.query(TABLE_NAME, new String[] { this.ITEMS_COLUMN,
                this.PRIORITY_COLUMN }, null, null, null, null, PRIORITY_COLUMN
                + " DESC");

        while (cursor.moveToNext()) {

            Item itemTemp = new Item(cursor.getString(cursor
                    .getColumnIndexOrThrow(ITEMS_COLUMN)), new Level(
                    Integer.parseInt(cursor.getString(cursor
                            .getColumnIndexOrThrow(PRIORITY_COLUMN)))));
            item.add(itemTemp);

        }

        cursor.close();
        db.endTransaction();
        db.close();
        return item;

    }

    public void deleteItem(String item){

        SQLiteDatabase db = this.getWritableDatabase();
        int x = db.delete(TABLE_NAME, ITEMS_COLUMN + " =?",  new String[] {item});
        Log.d("deletedItem", String.valueOf(x) );
        db.beginTransaction();

        db.delete(TABLE_NAME, ITEMS_COLUMN + " =?",  new String[] {item});

        db.setTransactionSuccessful();

        db.endTransaction();

        db.close();


    }

}
于 2012-12-23T04:01:56.607 に答える