Android'de SQLite'de Satır Silme


102

Bu aptalca bir soru olabilir, ancak SQLite'de yeniyim ve bunu çözemiyorum. Ben sütunları olan 1 tablo var KEY_ROWID, KEY_NAME, KAY_LATITUDEve KEY_LONGITUDE. Kullanıcının birini seçip silebilmesini istiyorum; Biri bana başlamam için bir yön verebilir mi? Sorum, sadece adı verilen satırın fiilen silinmesidir.

İlgili kod:

public class BeaconDatabase {

    public static final String KEY_ROWID = "_id";
    public static final String KEY_NAME = "beacon_name";
    public static final String KEY_LATITUDE = "beacon_lat";
    public static final String KEY_LONGITUDE = "beacon_lon";

    private static final String DATABASE_NAME ="BeaconDatabase";
    private static final String DATABASE_TABLE ="beaconTable";
    private static final int DATABASE_VERSION = 1;

    private DbHelper helper;
    private final Context context;
    private SQLiteDatabase db;

    public BeaconDatabase(Context context) {
        this.context = context;
    }

    public BeaconDatabase open() {
        helper = new DbHelper(this.context);
        db = helper.getWritableDatabase();
        return this;
    }

    public void close() {
        helper.close();
    }

    public long createEntry(String name, Double lat, Double lon) {
        ContentValues cv = new ContentValues();
        cv.put(KEY_NAME, name);
        cv.put(KEY_LATITUDE, lat);
        cv.put(KEY_LONGITUDE, lon);
        return db.insert(DATABASE_TABLE, null, cv);
    }

    public void deleteEntry(long row) {

              // Deletes a row given its rowId, but I want to be able to pass
              // in the name of the KEY_NAME and have it delete that row.
              //db.delete(DATABASE_TABLE, KEY_ROWID + "=" + row, null);
    }

    public String getData() {
        String[] columns = { KEY_ROWID, KEY_NAME, KEY_LATITUDE, KEY_LONGITUDE };
        Cursor cursor = db.query(DATABASE_TABLE, columns, null, null, null, null, null);
        String result = "";

        int iRow = cursor.getColumnIndex(KEY_ROWID);
        int iName = cursor.getColumnIndex(KEY_NAME);
        int iLat = cursor.getColumnIndex(KEY_LATITUDE);
        int iLon = cursor.getColumnIndex(KEY_LONGITUDE);

        for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
            result += cursor.getString(iRow) + ": " + cursor.getString(iName) + " - " + cursor.getDouble(iLat) + " latitude " + cursor.getDouble(iLon) + " longitude\n";
        }

        return result;

    }

    private static class DbHelper extends SQLiteOpenHelper {

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

        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL("CREATE TABLE " +  DATABASE_TABLE + " (" + 
                    KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                    KEY_NAME + " TEXT NOT NULL, " +
                    KEY_LATITUDE + " DOUBLE, " +
                    KEY_LONGITUDE + " DOUBLE);"
            );
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
            onCreate(db);
        }
    }
}

@iDroid cevabıyla gidin ... benim için çalışacağı için. Teşekkürler iDroid.

Yanıtlar:


183

Şöyle deneyebilirsiniz:

 //---deletes a particular title---
public boolean deleteTitle(String name) 
{
    return db.delete(DATABASE_TABLE, KEY_NAME + "=" + name, null) > 0;
}

veya

public boolean deleteTitle(String name) 
{
    return db.delete(DATABASE_TABLE, KEY_NAME + "=?", new String[]{name}) > 0;
}

61
Vijay'in cevabı doğru çünkü bu çözüm bir güvenlik sızıntısı olan SQL enjeksiyonu yapmaya izin veriyor. Örneğin: isim bağımsız değişkeninin değerini kullanın: name = "TRUE; <any SQL command>;"=> 'herhangi bir SQL komutu' çalıştırılacaktır. Elbette bu özellik için GUI yoksa sorun olmaz.
bdevay

@bdevay Cevabım sorgu ile yaptığımız arka plan göreviyle ilgili. Yani kullanıcı arayüzüyle ilgili değil. Bilgiyi dinamik olarak vermeniz yeterlidir, böylece güvenliğe gerek kalmaz. Eğer vijay'in cevabını takip ederseniz ve bazıları tersine mühendislik uygularsa, o zaman derlemekte olduğunuz veri tabanı ve alandaki tablo hakkında bilgi edinebilirsiniz. Bunu doğrudan sorguda yapıyorum, bu yüzden pırasa şansı yok.
Shreyash Mahajan

@iDroid Explorer: Tabii ki, kullanıcı girişi veya başka bir tür harici sorgu işleme olasılığı yoksa, güvenlik riski diğer çözümden daha yüksek değildir. Sonraki yoruma devam et ...
bdevay

1
... Ama yorumunuzun tersine mühendislik kısmına katılmıyorum. Bir yerde ve bir şekilde sorgunuzu tanımlamanız gerekir, bu da tersine mühendisliğin her zaman olası bir güvenlik sızıntısı olduğu anlamına gelir (çözümünüz söz konusu olduğunda bile), özellikle de kaynak gizlenmiş olsa bile Java'da. Sadece hackleme süresini daha fazla artırabilir. Öte yandan, Google'ın önerisi seçim bağımsız değişkenlerini kullanmaktır, lütfen şu makaleyi kontrol edin: link
bdevay

Herhangi bir yönteme veya herhangi bir değişkene statik değer vermeme kavramı ile kastediyorum. Bu maksimum dinamik olmalıdır. Böylece statik değer vermekten daha güvenlidir. Her neyse, uygulamasını ne kadar güvenli hale getirmek istediği kullanıcıya kalmış.
Shreyash Mahajan

157

Böyle dene, çözümünü bulabilir misin?

String table = "beaconTable";
String whereClause = "_id=?";
String[] whereArgs = new String[] { String.valueOf(row) };
db.delete(table, whereClause, whereArgs);

58

whereargs kullanmak daha iyidir;

db.delete("tablename","id=? and name=?",new String[]{"1","jack"});

bu, bu komutu kullanmak gibidir:

delete from tablename where id='1' and name ='jack'

ve silme işlevini bu şekilde kullanmak iyidir çünkü sql enjeksiyonlarını kaldırır.


2
Sağladığınız çözüm hakkında biraz daha açıklama ekleyerek yanıtınızı biraz daha detaylandırır mısınız?
abarisone

1
Kullanmaya değer olduğunu düşünüyorum whereargs.
msysmilu

@Enkahi Bu SQLite'de hazırlanmış ifadeler gibi mi? Bu id=?tür bir sözdizimini daha önce PHP ile kullandım ve buna çok benziyor.
GeekWithGlasses

17

Sorunuzu anlayana kadar, silinecek bir satırı seçmek için iki koşul koymak istiyorsunuz. Bunun için yapmanız gereken:

public void deleteEntry(long row,String key_name) {

      db.delete(DATABASE_TABLE, KEY_ROWID + "=" + row + " and " + KEY_NAME + "=" + key_name, null);

      /*if you just have key_name to select a row,you can ignore passing rowid(here-row) and use:

      db.delete(DATABASE_TABLE, KEY_NAME + "=" + key_name, null);
      */  

}

13

Bu kodu dene

public void deleteRow(String value)
{
SQLiteDatabase db = this.getWritableDatabase();       
db.execSQL("DELETE FROM " + TABLE_NAME+ " WHERE "+COlUMN_NAME+"='"+value+"'");
db.close();
}

Silmek istediğimde bunu nasıl çağırırım? db.deleteRow ();
Phares

Silmek istediğiniz değeri parametre olarak ileterek çağırabiliriz. Db.deleteRow ("ad") olarak arayın;
Harman Khera

8

Bu kodu deneyin ...

private static final String mname = "'USERNAME'";
public void deleteContact()
{
    db.delete(TABLE_CONTACTS, KEY_NAME + "=" + mname, null);
}


3

SQLiteDatabase kullanıyorsanız , bir silme yöntemi vardır

Silme Tanımı

int delete (String table, String whereClause, String[] whereArgs)

Örnek Uygulama

Şimdi , argüman olarak isim olarak silme adında bir yöntem yazabiliriz

public void delete(String value) {
    db.delete(DATABASE_TABLE, KEY_NAME + "=?", new String[]{String.valueOf(value)});
}

tüm kayıtları silmek istiyorsanız , yukarıdaki yönteme null değerini iletin,

public void delete() {
    db.delete(DATABASE_TABLE, null, null);
}

Bilgi kaynağı


String değeri yabancı anahtarla eklenirse, o zaman ??
Harsh Bhavsar

2

Arkadaşlar bu, tüm tablolarınız için kullanabileceğiniz genel bir yöntemdir, Benim durumumda mükemmel çalıştı.

public void deleteRowFromTable(String tableName, String columnName, String keyValue) {
    String whereClause = columnName + "=?";
    String[] whereArgs = new String[]{String.valueOf(keyValue)};
    yourDatabase.delete(tableName, whereClause, whereArgs);
}

String.ValueOf (keyValue) => Lütfen bu satırı açıklar mısınız?
Anis

1
String.ValueOf (keyValue) 'e gerek yok çünkü keyValue zaten string. diğer durumlarda, sütun adı değerini belirlemek için bu whereArgs Array öğesini kullanıyoruz.
Naveed Ahmad

2

Bir tablodan satır silmek için, satırları delete()yönteme tanımlayan seçim ölçütleri sağlamanız gerekir . Mekanizma, query()yöntemin seçim argümanlarıyla aynı şekilde çalışır . Seçim belirtimini bir seçim cümlesine (burada cümle) ve seçim argümanlarına böler.

    SQLiteDatabase db  = this.getWritableDatabase();
     // Define 'where' part of query.
    String selection = Contract.COLUMN_COMPANY_ID + " =?  and "
                       + Contract.CLOUMN_TYPE +" =? ";
   // Specify arguments in placeholder order.
    String[] selectionArgs = { cid,mode };
    // Issue SQL statement.
    int deletedRows = db.delete(Contract.TABLE_NAME, 
                       selection, selectionArgs);
    return deletedRows;// no.of rows deleted.

delete()Yöntemin dönüş değeri , veritabanından silinen satırların sayısını gösterir.


Bu kod soruyu yanıtlayabilirken, bu kodun soruyu neden ve / veya nasıl yanıtladığına ilişkin ek bağlam sağlamak, uzun vadeli değerini artırır.
Thomas Flinkow

1

Çocuklar yukarıdaki çözümler sizin için işe yaramazsa, bunu da deneyin çünkü benim için çalıştı.

public boolean deleteRow(String name) 
{
    return db.delete(DATABASE_TABLE, KEY_NAME + "='" + name +"' ;", null) > 0;
}

1

Harika çalışıyor!

public void deleteNewMelk(String melkCode) {
    getWritableDatabase().delete(your_table, your_column +"=?", new String[]{melkCode});
}

0

Bunu dene:

public void deleteEntry(long rowId) {
    database.delete(DATABASE_TABLE , KEY_ROWID 
        + " = " + rowId, null);}

0
public boolean deleteRow(long l) {
    String where = "ID" + "=" + l;
    return db.delete(TABLE_COUNTRY, where, null) != 0;
}

0

Çalışma kod pasajımı paylaşarak böyle bir şey yapabilirsiniz

Sorgunun böyle olduğundan emin olun

TableName WHERE KEY__NAME = 'parameterToMatch' tablosundan SİL

public void removeSingleFeedback(InputFeedback itemToDelete) {
            //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_FEEDBACKS + " WHERE "
                    + KEY_CUSTMER_NAME + "= '" + itemToDelete.getStrCustName() + "'" +
                    " AND " + KEY_DESIGNATION + "= '" + itemToDelete.getStrCustDesignation() + "'" +
                    " AND " + KEY_EMAIL + "= '" + itemToDelete.getStrCustEmail() + "'" +
                    " AND " + KEY_CONTACT_NO + "= '" + itemToDelete.getStrCustContactNo() + "'" +
                    " AND " + KEY_MOBILE_NO + "= '" + itemToDelete.getStrCustMobile() + "'" +
                    " AND " + KEY_CLUSTER_NAME + "= '" + itemToDelete.getStrClusterName() + "'" +
                    " AND " + KEY_PRODUCT_NAME + "= '" + itemToDelete.getStrProductName() + "'" +
                    " AND " + KEY_INSTALL_VERSION + "= '" + itemToDelete.getStrInstalledVersion() + "'" +
                    " AND " + KEY_REQUIREMENTS + "= '" + itemToDelete.getStrRequirements() + "'" +
                    " AND " + KEY_CHALLENGES + "= '" + itemToDelete.getStrChallenges() + "'" +
                    " AND " + KEY_EXPANSION + "= '" + itemToDelete.getStrFutureExpansion() + "'" +
                    " AND " + KEY_COMMENTS + "= '" + itemToDelete.getStrComments() + "'"
            );

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

0

Aşağıdaki kodu deneyin-

mSQLiteDatabase = getWritableDatabase();//To delete , database should be writable.
int rowDeleted = mSQLiteDatabase.delete(TABLE_NAME,id + " =?",
                    new String[] {String.valueOf(id)});
mSQLiteDatabase.close();//This is very important once database operation is done.
if(rowDeleted != 0){
    //delete success.
} else {
    //delete failed.
}

0

Benim için işe yarayan tek yol buydu

fun removeCart(mCart: Cart) {
    val db = dbHelper.writableDatabase
    val deleteLineWithThisValue = mCart.f
    db.delete(cons.tableNames[3], Cart.KEY_f + "  LIKE  '%" + deleteLineWithThisValue + "%' ", null)
}


class Cart {
    var a: String? = null
    var b: String? = null
    var c: String? = null
    var d: String? = null
    var e: Int? = null
    var f: String? = null

companion object {
    // Labels Table Columns names
    const val rowIdKey = "_id"
    const val idKey = "id"
    const val KEY_a = "a"
    const val KEY_b = "b"
    const val KEY_c = "c"
    const val KEY_d = "d"
    const val KEY_e = "e"
    const val KEY_f = "f"
   }
}

object cons {
    val tableNames = arrayOf(
            /*0*/ "shoes",
            /*1*/ "hats",
            /*2*/ "shirt",
            /*3*/ "car"
         )
 }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.