অ্যান্ড্রয়েডে এসকিউএলাইটে সারি মুছে ফেলা হচ্ছে


102

এটি বোবা প্রশ্ন হতে পারে, তবে আমি এসকিউএলাইটে নতুন এবং আমি এটিকে বের করে আনতে পারি না। আমি 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);
        }
    }
}

@ আইড্রয়েড উত্তর সহ যান ... এটি আমার পক্ষে কাজ করে চলেছে। ধন্যবাদ আইড্রয়েড।

উত্তর:


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
বিজয়ের উত্তর সঠিক কারণ এই সমাধানটি একটি এসকিউএল ইঞ্জেকশন করতে দেয় যা একটি সুরক্ষা লিক। উদাহরণস্বরূপ: নামের যুক্তিটির মানটি ব্যবহার করুন: name = "TRUE; <any SQL command>;"=> 'যে কোনও এসকিউএল কমান্ড' কার্যকর হবে। অবশ্যই সেই বৈশিষ্ট্যটির জন্য কোনও জিইউআই না থাকলে সমস্যা নেই।
দেবদেব

@ বিদেবায় আমার উত্তরটি আমরা কোয়েরি নিয়ে যে ব্যাকগ্রাউন্ড টাস্কটি করেছি তা সম্পর্কে। সুতরাং এটি ইউআইয়ের সাথে সম্পর্কিত নয়। আপনাকে কেবল গতিশীল হিসাবে তথ্য দিতে হবে সুতরাং সুরক্ষার কোনও প্রয়োজন নেই। আপনি যদি বিজয়ের উত্তরটি অনুসরণ করেন এবং কেউ বিপরীত প্রকৌশল করেন তবে আপনি যে ডাটাবেসটি এবং ক্ষেত্রটি তুলনা করছেন তাতে টেবিলের তথ্য পেতে পারেন। যা আমি সরাসরি ক্যোয়ারীতে করছি তাই এটি ফাঁস হওয়ার কোনও সুযোগ নেই।
শ্রেয়াশ মহাজন

@ আইড্রয়েড এক্সপ্লোরার: অবশ্যই যদি কোনও ব্যবহারকারী ইনপুট বা অন্য ধরণের বাহ্যিক ক্যোয়ারী হেরফের সম্ভাবনা না থাকে তবে অন্যান্য সমাধানের চেয়ে সুরক্ষা ঝুঁকি বেশি নয়। পরবর্তী মন্তব্যে চালিয়ে যান ...
দেবদেব

1
... তবে আমি আপনার মন্তব্যের বিপরীত প্রকৌশল অংশের সাথে একমত নই। আপনাকে কোথাও সংজ্ঞায়িত করতে হবে এবং কোনওভাবে আপনার কোয়েরিটির অর্থ হ'ল বিপরীত প্রকৌশল সর্বদা একটি সম্ভাব্য সুরক্ষা লিক (এমনকি আপনার সমাধানের ক্ষেত্রেও), বিশেষত জাভাতে এমনকি উত্সটি অবরুদ্ধ থাকলেও। এটি কেবল হ্যাকিংয়ের সময় আরও বাড়িয়ে তুলতে পারে। অন্যদিকে গুগলের সুপারিশটি নির্বাচন আর্গুমেন্ট ব্যবহার করছে, দয়া করে এই নিবন্ধটি দেখুন: লিঙ্ক
দেবদেব

আমি বলতে চাই যে কোনও পদ্ধতি বা কোনও পরিবর্তনশীলকে স্থিতিশীল মান না দেওয়ার ধারণার সাথে। এটি সর্বোচ্চ গতিশীল হওয়া উচিত। যাতে এটি আরও সুরক্ষিত হয় তবে স্থির মান দেওয়া হয়। যাইহোক এটি ব্যবহারকারীর উপর নির্ভর করে যে সে / সে তাদের অ্যাপ্লিকেশনটি কতটা সুরক্ষিত করতে চায়।
শ্রেয়াশ মহাজন

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
এমএসমিলু

@ এনকাহি এটি কি এসকিউএলাইটে প্রস্তুত বিবৃতিগুলির মতো? আমি id=?পিএইচপি এর সাথে এই কিন্ডা সিনট্যাক্সটি আগে ব্যবহার করেছি এবং এটি এর সাথে খুব মিল বলে মনে হচ্ছে।
গীকবিথগ্লাস

17

যতক্ষণ না আমি আপনার প্রশ্নটি বুঝতে পারি ততক্ষণ আপনি মুছে ফেলার জন্য একটি সারি নির্বাচন করতে দুটি শর্ত রাখতে চান for এজন্য আপনাকে যা করতে হবে:

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;
}

আপনি এই উদাহরণ উল্লেখ করতে পারেন ।


সংশ্লিষ্ট লিংক এখনই একটি .correct মৃত হয় web.archive.org/web/20110309080938/http://blog.sptechnolab.com/...
Navoneel তালুকদার

3

আপনি যদি এসকিউএলডিটি ডাটাবেস ব্যবহার করছেন তবে একটি মুছার পদ্ধতি রয়েছে

মোছার সংজ্ঞা

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);
}

স্ট্রিং.ভ্যালুওফ (কীভ্যালু) => আপনি কি এই লাইনটি ব্যাখ্যা করতে পারেন?
আনিস

1
স্ট্রিং.ভ্যালুওফের (কীভ্যালু) দরকার নেই, কারণ কীভ্যালু ইতিমধ্যে স্ট্রিং রয়েছে। অন্যান্য ক্ষেত্রে আমরা কলামের নামটি সনাক্ত করতে আরগস অ্যারেটি এটি ব্যবহার করছি।
নাভিদ আহমেদ

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"
         )
 }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.