0

リスト ビューでアイテムを削除しようとすると、リスト ビューから削除されますが、新しいアイテムを追加するか、アプリケーションを再度実行すると、アイテムはまだそこにあります。データベースから削除できません。

私はこのコードを使用しています:

...
SqlHandler sqlHandler;
ListView myListView;
myAdapter adapter;
ArrayList<myItems> items;
 ...
 myListView = (ListView) findViewById(R.id.myListView);
 sqlHandler = new SqlHandler(this);
 items = getItemsFromDatabase();

adapter = new myAdapter(this, items);
myListView.setAdapter(adapter);
myListView.setOnItemLongClickListener(this);
 ...
public boolean onItemLongClick(AdapterView<?> adapterView, View view,
        int position, long id) {

    final myItems selectedItem = items.get(position);

    if (selectedItem != null) {
        AlertDialog.Builder alt_bld = new AlertDialog.Builder(this);
        alt_bld.setMessage("Do you want to delete this item?")
                .setCancelable(false)
                .setPositiveButton("Yes",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,
                                    int id) {

                                sqlHandler=new SqlHandler(getApplicationContext());
                                sqlHandler.deleteRecord(id);
                                items.remove(selectedItem);
                                adapter.notifyDataSetChanged();

私が使用するデータベースの場合:

public class SqlHandler {
    public static final String DATABASE_NAME = "MY_DATABASE";
    public static final String DATABASE_TABLE = "MEM";
    public static final String KEY_ROWID = "_id";

        public static final int DATABASE_VERSION = 1;
            Context context;
            SQLiteDatabase sqlDatabase;
            SqlDbHelper dbHelper;

            public SqlHandler(Context context) {

                 dbHelper = new SqlDbHelper(context, DATABASE_NAME, null,
                   DATABASE_VERSION);
                 sqlDatabase = dbHelper.getWritableDatabase();
                }

    public void executeQuery(String query) {
     try {

      if (sqlDatabase.isOpen()) {
       sqlDatabase.close();
      }

      sqlDatabase = dbHelper.getWritableDatabase();
      sqlDatabase.execSQL(query);

     } catch (Exception e) {

      System.out.println("DATABASE ERROR " + e);
     }

}

        public Cursor selectQuery(String query) {
         Cursor c1 = null;
         try {

          if (sqlDatabase.isOpen()) {
           sqlDatabase.close();

          }
          sqlDatabase = dbHelper.getWritableDatabase();
          c1 = sqlDatabase.rawQuery(query, null);

         } catch (Exception e) {

          System.out.println("DATABASE ERROR " + e);

         }
         return c1;

}
        public SqlHandler open() throws SQLException
        {
            sqlDatabase = dbHelper.getWritableDatabase();
        return this;
        }

        public void Close(){
            dbHelper.close();

        }
        public void  deleteRecord(long rowId){
            try {
             sqlDatabase.delete(DATABASE_TABLE,KEY_ROWID + "="+rowId,null);
            }
            catch (Exception e)
            {
                Log.e("DB ERROR", e.toString());
                e.printStackTrace();
            }
        }

public class SqlDbHelper extends SQLiteOpenHelper {
public static final String DATABASE_TABLE = "MEM";



public static final String TAG="DbHandler";

 public static final String KEY_ROWID = "_id";
 ...


 private static final String SCRIPT_CREATE_DATABASE = "create table "
   + DATABASE_TABLE + " (" + KEY_ROWID
   + " integer primary key autoincrement, " + ....);";

 public SqlDbHelper(Context context, String name, CursorFactory factory,
   int version) {
  super(context, name, factory, version);
  // TODO Auto-generated constructor stub

 }

 @Override
 public void onCreate(SQLiteDatabase db) {
  // TODO Auto-generated method stub
  db.execSQL(SCRIPT_CREATE_DATABASE);

 }

 @Override
 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  // TODO Auto-generated method stub
     Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
             + newVersion + ", which will destroy all old data");
  db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
  onCreate(db);
 }

- - - - - アップデート - - - - - - - - - - -

次のようになります。

myItems theItems =(myItems)adapterView.getItemAtPosition(button_id);
String _id = theItems.getID();
String delQuery = "DELETE FROM MEM WHERE _id='"+_id+"' ";
sqlHandler.executeQuery(delQuery);

しかし、(myItems)adapterView に問題があります。これを処理する方法がわかりません。

4

2 に答える 2

1

エラーはここにあると思います:

    new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id) { //<--- rename this to buttonId
          sqlHandler=new SqlHandler(getApplicationContext());
          sqlHandler.deleteRecord(id);  //<---- This "id" is the button that was clicked, not your item ID

もう一方の 変数を使用したかったと思いますidが、それでも、それが本当に必要なものかどうかはわかりません (そうかもしれません)。あなたのコードから、実際の ID がどこにあるのかすぐにはわかりませんでした。

于 2013-04-11T13:36:58.713 に答える
1

あなたが抱えている問題は、あなたのメソッドdeleteの呼び出しです。それは次のようになるはずです:

public long deleteItem(myItems itemToDelete) {
    try {
             return sqlDatabase.delete(DATABASE_TABLE,COLUMN_ID + " = ?",new String[]{itemToDelete.getID()});
            }
            catch (Exception e)
            {
                Log.e("DB ERROR", e.toString());
                e.printStackTrace();
                return -1;
            }
}

を押して削除YES ButtonAlertDialog確認したら、データベースからアイテムを削除してから、データベースからアイテムをリロードし、リストのアダプターに通知して新しいデータで更新する必要があります。

myItems selectedItem = adapter.getItem(position);
long rows = sqlHandler.deleteItem(selectedItem);
if(rows>0) {
    //get new items from database 
    adapter.setItems(getItemsFromDatabase());
    adapter.notifyDataSetChanged();
}

アイテムはデータベースから削除されlistView、新しいデータで更新されます

于 2013-04-12T11:16:45.923 に答える