2015-07-01 16 views
5

I sqlite auf einem ListView durch eine CustomListAdapter .Auf dargestellten Daten müssen gelöscht werden eine Reihe eine alert dialogue knallt, klicken auf die den Benutzer auffordert, die einzelne Zeile von sqlite in meiner Tätigkeit zu löschen:Wie eine einzelne Zeile in Android SQLite

private void deleteDialog() { 
     AlertDialog.Builder alertDialog = new AlertDialog.Builder(MyCart.this); 
     alertDialog.setCancelable(false); 
     alertDialog.setMessage("Delete item?"); 
     alertDialog.setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       myDb.deleteSingleContact(toString()); 
      } 
     }); 
     alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       dialog.cancel(); 

      } 
     }); 
     alertDialog.show(); 
    } 

Auf meinem DBHelper.java:

public void deleteSingleContact(String title){ 

     SQLiteDatabase db = this.getWritableDatabase(); 
     db.delete(CONTACTS_TABLE_NAME, CONTACTS_COLUMN_TITLE + "=?", new String[]{title}); 
//KEY_NAME is a column name 
    } 

jedoch der obige Code nicht gelöscht anything.I seine Funktion denke, ich correctly.Any Vorschläge haben getan?

Voll DBHelper.java

public class DBHelper extends SQLiteOpenHelper { 

    public static final String DATABASE_NAME = "MyDBName.db"; 
    public static final String CONTACTS_TABLE_NAME = "contacts"; 
    public static final String CONTACTS_COLUMN_ID = "id"; 
    public static final String CONTACTS_COLUMN_TITLE = "title"; 
    public static final String CONTACTS_COLUMN_AMOUNT = "amount"; 
    public static final String CONTACTS_COLUMN_DESC = "description"; 

    private HashMap hp; 

    public DBHelper(Context context) { 
     super(context, DATABASE_NAME, null, 1); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     // TODO Auto-generated method stub 
     db.execSQL(
       "create table contacts " + 
         "(id integer primary key, title text,amount float,description text)" 
     ); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // TODO Auto-generated method stub 
     db.execSQL("DROP TABLE IF EXISTS contacts"); 
     onCreate(db); 
    } 

    public boolean insertContact(String title, float amount, String description) { 
     SQLiteDatabase db = this.getWritableDatabase(); 
     ContentValues contentValues = new ContentValues(); 

     contentValues.put("title", title); 
     contentValues.put("amount", amount); 
     contentValues.put("description", description); 


     db.insert("contacts", null, contentValues); 
     return true; 
    } 

    public Cursor getData(int id) { 
     SQLiteDatabase db = this.getReadableDatabase(); 
     Cursor res = db.rawQuery("select * from contacts where id=" + id + "", null); 
     return res; 
    } 

    public int numberOfRows() { 
     String countQuery = "SELECT * FROM " + CONTACTS_TABLE_NAME; 
     SQLiteDatabase db = this.getReadableDatabase(); 
     Cursor cursor = db.rawQuery(countQuery, null); 
     int cnt = cursor.getCount(); 
     cursor.close(); 
     return cnt; 
    } 

    public boolean updateContact(Integer id, String title, float amount, String description) { 
     SQLiteDatabase db = this.getWritableDatabase(); 
     ContentValues contentValues = new ContentValues(); 
     contentValues.put("title", title); 
     contentValues.put("amount", amount); 
     contentValues.put("description", description); 

     db.update("contacts", contentValues, "id = ? ", new String[]{Integer.toString(id)}); 
     return true; 
    } 

    public void deleteContact() { 
     SQLiteDatabase db = this.getWritableDatabase(); 
     db.delete("contacts", null, null); 
     db.close(); 
    } 

    public void deleteSingleContact(String title){ 

     SQLiteDatabase db = this.getWritableDatabase(); 
     db.delete(CONTACTS_TABLE_NAME, CONTACTS_COLUMN_TITLE + "=?", new String[]{title}); 
//KEY_NAME is a column name 
    } 

    public boolean checkForTables() { 
     boolean hasRows = false; 
     SQLiteDatabase db = getReadableDatabase(); 
     Cursor cursor = db.rawQuery("SELECT COUNT(*) FROM " + CONTACTS_TABLE_NAME, null); 
     cursor.moveToFirst(); 
     int count = cursor.getInt(0); 
     if(count > 0) 
      hasRows = true; 
     db.close(); 
     return hasRows; 
    } 
    public ArrayList<ContactListItems> getAllContacts() { 
     ArrayList<ContactListItems> contactList = new ArrayList<>(); 
     hp = new HashMap(); 
     SQLiteDatabase db = this.getReadableDatabase(); 
     Cursor res = db.rawQuery("select * from contacts", null); 
     res.moveToFirst(); 
     while (!res.isAfterLast()) { 
       ContactListItems contactListItems = new ContactListItems(); 

       contactListItems.setTitle(res.getString(res 
         .getColumnIndex("title"))); 
       contactListItems.setAmount(res.getFloat(res 
         .getColumnIndex("amount"))); 
       contactListItems.setDescription(res.getString(res 
         .getColumnIndex("description"))); 
       contactList.add(contactListItems); 
       res.moveToNext(); 
      } 
     res.close(); 
     return contactList; 
    } 
    public int getTotalOfAmount(){ 
     SQLiteDatabase db = this.getReadableDatabase(); 
     Cursor c=db.rawQuery("SELECT SUM(amount) FROM " +CONTACTS_TABLE_NAME,null); 
     c.moveToFirst(); 
     int i=c.getInt(0); 
     c.close(); 
     return i; 
    } 
} 

EDIT

obj.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 
      @Override 
      public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
       deleteDialog(); 
       return true; 
      } 
     }); 
    } 

Logcat Fehler:

android.database.sqlite.SQLiteException: near "=": syntax error (code 1): , while compiling: DELETE FROM contacts WHERE title= 
 
      at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) 
 
      at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:882) 
 
      at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:493) 
 
      at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) 
 
      at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58) 
 
      at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31) 
 
      at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1663) 
 
      at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1594) 
 
      at com.softtech.stevekamau.buyathome.DBHelper.removeSingleContact(DBHelper.java:157) 
 
      at com.softtech.stevekamau.buyathome.MyCart$6.onClick(MyCart.java:140) 
 
      at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166) 
 
      at android.os.Handler.dispatchMessage(Handler.java:99) 
 
      at android.os.Looper.loop(Looper.java:137) 
 
      at android.app.ActivityThread.main(ActivityThread.java:4745) 
 
      at java.lang.reflect.Method.invokeNative(Native Method) 
 
      at java.lang.reflect.Method.invoke(Method.java:511) 
 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
 
      at dalvik.system.NativeStart.main(Native Method)

+0

Wir machen das Debuggen nicht für Sie. Bitte fügen Sie nur die sehr relevanten Codeteile hinzu. –

+0

Ich dachte, die Spaltennamen könnten für diejenigen relevant sein, die daran interessiert sind. –

+0

Die Spalte Namen ja, aber nicht vollständige Quelldateien. –

Antwort

14

Sie SQL DELETE-Anweisung ändern müssen, wählen. Wenn Sie einen Zeichenfolgenwert als Selektor verwenden, müssen Sie den Wert in '' einschließen.

/** 
    * Remove a contact from database by title 
    * 
    * @param title to remove 
    */ 
    public void removeSingleContact(String title) { 
     //Open the database 
     SQLiteDatabase database = this.getWritableDatabase(); 

     //Execute sql query to remove from database 
     //NOTE: When removing by String in SQL, value must be enclosed with '' 
     database.execSQL("DELETE FROM " + TABLE_NAME + " WHERE " + CONTACTS_COLUMN_TITLE + "= '" + title + "'"); 

     //Close the database 
     database.close(); 
    } 

Dann, wenn Sie einen Eintrag aus der Datenbank verwenden Sie die folgende entfernen möchten:

DBHelper dbHelper = new DBHelper(context); 
dbHelper.removeSingleContact("CONTACT_TO_REMOVE_HERE"); 

UPDATE Unter der Annahme, dass Ihr ListView-Datensatz ist ein ArrayList enthält ContactListItems, können Sie ein OnItemClickListener Set für Ihre ListView und verwenden Sie es, um Ihren ausgewählten Titel zu erhalten, und entfernen Sie es dann.

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

    @Override 
    public void onItemClick(AdapterView<?> parent, View view, final int position, long id) { 

     AlertDialog.Builder alertDialog = new AlertDialog.Builder(MyCart.this); 
     alertDialog.setCancelable(false); 
     alertDialog.setMessage("Delete item?"); 
     alertDialog.setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       String title; 

       title = arrayList.get(position).getTitle(); 

       dbHelper.removeSingleContact(title); 

       //Update your ArrayList 
       arrayList = dbHelper.getAllContacts(); 

       //Notify your ListView adapter 
       adapter.notifyDataSetChanged(); 

      } 
     }); 
     alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       dialog.cancel(); 
      } 
     }); 
     alertDialog.show(); 

    } 

}); 
+0

Ich habe den Fehler oben von Ihrem Code –

+0

Hier ist meine Sorge, Sie sehen ich Laden Sie meine Aktivität von einem JSON, bei ListView Element klicken Sie können das Element zum SQLite hinzufügen.Ich habe dann eine Tätigkeit, die sqlite Einzelteile auf einen listview lädt. Ich habe Einzelteile mit verschiedenen Titeln, also kann ich hardcoding nicht, welcher Titel genau ich löschen möchte. Sie sehen mein Problem mit dieser Linie 'dbHelper.removeSingleContact (" CONTACT_TO_REMOVE_HERE "); ' –

+0

Ich habe meiner Antwort ein weiteres Snippet hinzugefügt, das Ihnen helfen kann. –

1

Ich denke, das Problem in Ihrem Code bei unterhalb der Linie ist:

myDb.deleteSingleContact(toString()); 

Es sollte der Titel als Parameter sein. Du gibst nichts weiter. Es muss einen Titel geben, den Sie aus der Datenbank entfernen möchten. etwas wie unten:

myDb.deleteSingleContact(title.toString()); 

Lassen Sie mich wissen, ob dies Ihr Problem nicht gelöst hat.

UPDATE

Für Datensatz aus der Datenbank zu löschen Sie einige Informationen wie aus der Datenbank definieren, müssen müssen, die Datensatz, den Sie löschen möchten. Es ist erforderlich, zumindest den Index dieses Datensatzes zu identifizieren. ZB: Sie haben einen Titel in der Datenbank wie Sport, Freude, Abenteuer, Spaß und Action. Jetzt, wenn Sie den Datensatz der Aktion aus der Datenbank löschen möchten. Was Sie also tun müssen, ist, dass Sie diesen Titelnamen als Parameter in der obigen Funktion übergeben müssen. (deleteSingleContact ("Action") in Ihrem Fall). Es wird also den Index finden, wo der Titel den Namen "Aktion" hat, und er wird diesen Datensatz aus der Datenbank löschen.

Hoffe, du hast den Punkt verstanden.

Lassen Sie mich noch wissen, wenn Sie irgendwelche Zweifel haben.

Mit freundlichen Grüßen, Shreyash

+0

Vielen Dank für die Antwort, aber ich kann nicht scheinen zu definieren, wie "Titel" auf meiner Aktivität zu definieren, bevor ich OnCreate aufrufen() –

+0

Ich versuchte -> String Titel; aber es funktioniert nicht –

+0

@SteveKamau überprüfen durch aktualisierte Antwort. –

1

Wenn ich in dir, so würde ich eine Unterklasse von CursorAdapter mit CursorLoader, auf diese Weise verwenden, alle Änderungen, die Sie in die Datenbank bringen wird sofort auch auf dem ui reflektiert werden (Ihr ListView), ohne zusätzliche Codezeile. Um dies zu tun, müssen Sie eine Spalte namens _id, ("_id INTEGER PRIMARY KEY AUTOINCREMENT", in Ihrer create table Abfrage) zu Ihrer Datenbank hinzufügen.

Unter der Annahme, dass Ihre ListView ‚s-Datensatz von ContactListItems gemacht wird, wenn onItemLongClick, wird aufgerufen, das Objekt abrufen können Sie lang gedrückte auf mit

ContactListItems item = (ContactListItems) arg0.getItemAtPosition(arg2); 

Wenn Sie nun die Unterschrift von deleteDialog ändern, wie

private void deleteDialog(final String title) 

in onItemLongClick, können Sie rufen

@Override 
public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
    ContactListItems item = (ContactListItems) arg0.getItemAtPosition(arg2); 
    deleteDialog(item.getTitle()); 
    return true; 
} 

Sie auch, welcher Eintrag Sie löschen möchten, verwenden können

alertDialog.setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       myDb.deleteSingleContact(toString()); 
      } 
}); 

mit

alertDialog.setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       myDb.deleteSingleContact(title); 
      } 
}); 
Verwandte Themen