Android में SQLite में पंक्ति को हटाने


102

यह एक गूंगा प्रश्न हो सकता है, लेकिन मैं SQLite के लिए नया हूं और मुझे यह पता नहीं लग सकता है। मैं 1 तालिका स्तंभ है KEY_ROWID, KEY_NAME, KAY_LATITUDE, और KEY_LONGITUDE। मैं चाहता हूं कि उपयोगकर्ता एक का चयन करने और उसे हटाने में सक्षम हो; क्या कोई मुझे शुरू करने के लिए एक दिशा दे सकता है? मेरा प्रश्न पंक्ति के वास्तविक विलोपन में है, केवल उसका नाम दिया गया है।

प्रासंगिक कोड:

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 जवाब के साथ जाओ ... क्योंकि यह मेरे लिए काम करने जा रहा है। धन्यवाद iDroid

जवाबों:


183

आप इस तरह की कोशिश कर सकते हैं:

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

या

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

61
विजय का उत्तर सही है क्योंकि यह समाधान एक SQL इंजेक्शन करने की अनुमति देता है जो एक सुरक्षा रिसाव है। उदाहरण के लिए: नाम तर्क के मूल्य का उपयोग करें: name = "TRUE; <any SQL command>;"=> 'किसी भी SQL कमांड' को निष्पादित किया जाएगा। बेशक यह एक समस्या नहीं है अगर उस सुविधा के लिए कोई जीयूआई नहीं है।
बोवडे

@bdevay मेरा उत्तर उस पृष्ठभूमि कार्य के बारे में है जिसे हमने क्वेरी के साथ किया था। तो यह UI से संबंधित नहीं है। आपको बस गतिशील रूप से जानकारी देनी होगी ताकि सुरक्षा की आवश्यकता न हो। यदि आप वीजाय के उत्तर का पालन करते हैं और कोई रिवर्स इंजीनियरिंग करता है तो आपको डेटाबेस और फ़ील्ड के बारे में जानकारी मिल सकती है जिसका आप अनुपालन कर रहे हैं। जो मैं सीधे क्वेरी में कर रहा हूं, इसलिए इसे लीक होने का कोई मौका नहीं है।
श्रेयांश महाजन

@ डायराइड एक्सप्लोरर: यदि कोई उपयोगकर्ता इनपुट या अन्य प्रकार की बाह्य क्वेरी मैनिपलेशन संभावना नहीं है, तो सुरक्षा जोखिम अन्य समाधान से अधिक नहीं है। अगली टिप्पणी में जारी ...
bdevay

1
... लेकिन मैं आपकी टिप्पणी के विपरीत इंजीनियरिंग भाग से सहमत नहीं हूँ। आपको कहीं न कहीं किसी न किसी तरह से अपनी क्वेरी को परिभाषित करना होगा जिसका अर्थ है कि रिवर्स इंजीनियरिंग हमेशा एक संभावित सुरक्षा रिसाव है (यहां तक ​​कि आपके समाधान के मामले में), विशेष रूप से जावा में, भले ही स्रोत को बाधित किया गया हो। यह केवल हैकिंग समय को अधिक बढ़ा सकता है। दूसरी ओर, Google की सिफारिशें चयन तर्कों का उपयोग कर रही हैं, कृपया इस लेख को देखें: लिंक
bdevay

मेरा मतलब किसी भी विधि या किसी भी चर को स्थिर मूल्य नहीं देने की अवधारणा से है। यह डायनेमिक की अधिकतम होनी चाहिए। ताकि यह अधिक सुरक्षित हो और फिर स्थैतिक मूल्य दे। वैसे भी यह उपयोगकर्ता के लिए है कि वह अपना ऐप कितना सुरक्षित बनाना चाहता है।
श्रेयांश महाजन

157

कोशिश करें कि आप अपना समाधान प्राप्त कर सकें

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

58

व्हिअरग्स का उपयोग करना भी बेहतर है;

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

यह इस आदेश का उपयोग करने जैसा है:

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

और इस तरह से डिलीट फंक्शन का उपयोग करना अच्छा है क्योंकि यह एसक्यूएल इंजेक्शन को हटा देता है।


2
क्या आप अपने समाधान प्रदान करने के बारे में थोड़ा और विवरण जोड़कर अपने जवाब को विस्तृत कर सकते हैं?
अबरिसोन

1
मुझे लगता है कि यह उपयोग करने के लायक है whereargs
मिसेजमिलु

@Enkahi यह SQLite में तैयार बयानों की तरह है? मैंने id=?पहले PHP के साथ इस थोड़े वाक्यविन्यास का उपयोग किया है और यह बहुत समान है।
GeekWithGlasses

17

जब तक मैं आपके प्रश्न को नहीं समझ लेता, तब तक आप एक पंक्ति को हटाने के लिए दो शर्तों को रखना चाहते हैं। इसके लिए, आपको करने की आवश्यकता है:

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

इस कोड को आज़माएं

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

जब मैं हटाना चाहता हूं तो मैं इसे कैसे कॉल करूं? db.deleteRow ();
चरण

हम इसे पैरामीटर मानकर कॉल कर सकते हैं जिसे आप हटाना चाहते हैं। Db.deleteRow ("नाम") के रूप में कॉल करें;
हरमन खेरा

8

इस कोड को आज़माएं ...

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

5

यह पूरी तरह से काम करता है:

public boolean deleteSingleRow(String rowId) 
{
    return db.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0;
}

आप इस उदाहरण का भी उल्लेख कर सकते हैं ।


संबंधित लिंक अब मृत है। एक सही है web.archive.org/web/20110309080938/http://blog.sptechnolab.com/…
नवोनल तालुकदार

3

यदि आप SQLiteDatabase का उपयोग कर रहे हैं तो एक डिलीट विधि है

डिलीट की परिभाषा

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

उदाहरण कार्यान्वयन

अब हम डिलीट विथ लॉजिक नाम से एक विधि लिख सकते हैं

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

यदि आप सभी रिकॉर्ड हटाना चाहते हैं, तो बस उपरोक्त विधि से अशक्त हो जाएं,

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

सूचना का स्रोत


यदि स्ट्रिंग कुंजी विदेशी कुंजी के साथ संलग्न है तो ??
हर्ष भावसार

2

दोस्तों यह एक सामान्य विधि है जिसका उपयोग आप अपने सभी तालिकाओं के लिए कर सकते हैं, मेरे मामले में पूरी तरह से काम किया है।

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) => क्या आप इस लाइन को समझा सकते हैं?
अनीस

1
String.ValueOf (keyValue) की कोई आवश्यकता नहीं है, क्योंकि keyValue पहले से ही स्ट्रिंग है। अन्य मामलों में हम इसका उपयोग कर रहे हैं जहाँ कॉलम नाम के मान की पहचान करने के लिए Arrs Array है।
नावेद अहमद

2

किसी तालिका से पंक्तियों को हटाने के लिए, आपको चयन मानदंड प्रदान करने की आवश्यकता है जो पंक्तियों को delete()विधि में पहचानते हैं । तंत्र query()विधि के चयन के तर्क के समान काम करता है । यह चयन विनिर्देश को एक चयन खंड (जहां खंड) और चयन तर्क में विभाजित करता है।

    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()विधि के लिए वापसी मान डेटाबेस से हटाए गए पंक्तियों की संख्या को इंगित करता है।


हालांकि यह कोड प्रश्न का उत्तर दे सकता है, लेकिन यह कोड इस और क्यों या कैसे का उत्तर देता है, इस संबंध में अतिरिक्त संदर्भ प्रदान करता है।
थॉमस फ्लिन्को

1

दोस्तों अगर उपरोक्त समाधान आपके लिए काम नहीं करते हैं, तो इस एक को भी आज़माएं क्योंकि यह मेरे लिए काम करता है।

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

1

बहुत अच्छा काम करता है!

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


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

0

आप ऐसा कुछ कर सकते हैं, मेरे काम करने वाले कोड स्निपेट को साझा करना

सुनिश्चित करें कि क्वेरी इस प्रकार है

तालिका से हटाएं

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

नीचे दिए गए कोड की कोशिश करें-

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

मेरे लिए काम करने का एकमात्र तरीका यही था

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"
         )
 }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.