Android में SQLite एक विशिष्ट पंक्ति को कैसे अपडेट करें


138

मैं कुछ समय के लिए एक विशिष्ट पंक्ति को अपडेट करने की कोशिश कर रहा हूं, और ऐसा लगता है कि ऐसा करने के दो तरीके हैं। मैंने जो कुछ पढ़ा और आजमाया है, उससे आप बस इसका उपयोग कर सकते हैं:

execSQL(String sql) तरीका

या:

update(String table, ContentValues values, String whereClause, String[] whereArgs) तरीका।

(मुझे बताएं कि क्या यह गलत है क्योंकि मैं एंड्रॉइड के लिए नया हूं और एसक्यूएल के लिए बहुत नया हूं।)

तो मुझे मेरे वास्तविक कोड में आने दो।

myDB.update(TableName, "(Field1, Field2, Field3)" + " VALUES ('Bob', 19, 'Male')", "where _id = 1", null);

मैं इसे पूरा करने की कोशिश कर रहा हूं:

फ़ील्ड 1, फ़ील्ड 2 और फ़ील्ड 3 को अपडेट करें जहां प्राथमिक कुंजी (_id) 1 के बराबर है।

ग्रहण मुझे "अद्यतन" शब्द के नीचे एक लाल रेखा देता है और मुझे यह स्पष्टीकरण देता है:

प्रकार SQLiteDatabase में विधि अद्यतन (स्ट्रिंग, ContentValues, स्ट्रिंग, स्ट्रिंग []) तर्क के लिए लागू नहीं है (स्ट्रिंग, स्ट्रिंग, स्ट्रिंग, अशक्त)

मैं अनुमान लगा रहा हूं कि मैं ContentValues ​​को सही ढंग से असाइन नहीं कर रहा हूं। क्या कोई मुझे सही दिशा दिखा सकता है?

जवाबों:


289

पहले एक ContentValues ​​ऑब्जेक्ट बनाएं:

ContentValues cv = new ContentValues();
cv.put("Field1","Bob"); //These Fields should be your String values of actual column names
cv.put("Field2","19");
cv.put("Field2","Male");

फिर अपडेट विधि का उपयोग करें, यह अब काम करना चाहिए:

myDB.update(TableName, cv, "_id="+id, null);

ग्रहण मुझे "फ़ील्ड 1", "फ़ील्ड 2" और "फ़ील्ड 3" पर लाल रेखांकन दे रहा है। सुझाव?
ईजीएचडीके

1
क्षमा करें, मुझे लगा कि वे आपके कोड में घोषित चर हैं। उन्हें दोहरे उद्धरणों में रखें।
अखिल

सही उत्तर के साथ पहला होने के लिए धन्यवाद। मुझे बहुत समय बचाया। बहुत सराहना की।
ईजीएचडीके

2
क्या होगा अगर मैं जांचना चाहता हूं, अगर वह पंक्ति तालिका में मौजूद है या नहीं और फिर यह तय करें कि क्या पंक्ति को अद्यतन करना या सम्मिलित करना है?
आकाश राघव

11
यह वास्तव में एक चलना है। Db.update () का तीसरा पैराग्राफ केवल क्लॉज होना चाहिए, और चौथा वास्तविक स्थिति मान है। इस मामले में, रेखा होनी चाहिए myDB.update(TableName, cv, "_id=?", new String[]{id}):। SQLite स्वचालित रूप से चौथे परम को "" में भर देगा? तीसरे परम में, यानी जहां खंड। अगर आपके तीसरे परम में n "?" S है, तो चौथा परम एक स्ट्रिंग होना चाहिए [] लंबाई n का
क्रिस्टियानो

48

सरल तरीका:

String strSQL = "UPDATE myTable SET Column1 = someValue WHERE columnId = "+ someValue;

myDataBase.execSQL(strSQL);

6
यह कोड IllegalArgumentException को फेंक देगा। यदि आप ContentValues ​​के बिना क्वेरी निष्पादित करते हैं, तो दूसरे तर्क का उपयोग करने से बचना बेहतर होगा। जैसे: myDataBase.execSQL (strSQL);
इगोर वी सवेंको

execSQL()अपडेट के लिए उपयोग करने से काम नहीं चलेगा। अद्यतन पढ़ें () अद्यतन के साथ अद्यतन नहीं करता है
रोशना पिटिगला

ऐसा करने में एक गंभीर सुरक्षा जोखिम है क्योंकि कोई 'कुछValue' चर के लिए एक एसक्यूएल बयान पारित कर सकता है, जो पूरे डेटाबेस को बदल सकता है। इसलिए किसी भी डेटाबेस ऑपरेशंस को करते समय हमेशा तैयार स्टेटमेंट्स को करने की कोशिश करें।
अचिन्ता ईसरू

42

पहले एक ContentValues ऑब्जेक्ट बनाएं :

ContentValues cv = new ContentValues();
cv.put("Field1","Bob");
cv.put("Field2","19");

फिर अपडेट विधि का उपयोग करें। ध्यान दें, तीसरा तर्क वह है जहां खंड। "?" एक प्लेसहोल्डर है। इसे चौथे तर्क (आईडी) से बदल दिया जाएगा

myDB.update(MY_TABLE_NAME, cv, "_id = ?", new String[]{id});

यह एक विशिष्ट पंक्ति को अद्यतन करने के लिए सबसे साफ समाधान है।


उपयोग करने के बाद से सबसे अच्छा तरीका है? सुरक्षित है।
आकाश अग्रवाल

1
और वह क्या करता है? करना?
अल्फी

1
के साथ पैरामीटर दृष्टिकोण? सबसे अच्छा और सबसे सुरक्षित तरीका है। यह स्वीकृत उत्तर होना चाहिए। एसक्यूएल कथनों की रचना करते समय कभी भी स्ट्रिंग कॉन्सेप्टन का उपयोग न करें!
ग्रिसग्राम

कैसे उपयोग करें जब क्लॉज़ में दो फ़ील्ड होते हैं?
बन्नी इशाक के

24
  1. मैं अपनी सुविधा के लिए व्यक्तिगत रूप से पूर्ववर्ती .update करता हूं। लेकिन निष्कासन ही काम करेगा।
  2. आप अपने अनुमान के साथ सही हैं कि समस्या आपकी सामग्री मूल्य है। आपको एक ContentValue ऑब्जेक्ट बनाना चाहिए और वहां अपनी डेटाबेस पंक्ति के लिए मानों को रखना चाहिए।

इस कोड को आपके उदाहरण को ठीक करना चाहिए:

 ContentValues data=new ContentValues();
 data.put("Field1","bob");
 data.put("Field2",19);
 data.put("Field3","male");
 DB.update(Tablename, data, "_id=" + id, null);

12

आप यह कोशिश कर सकते हैं ...

db.execSQL("UPDATE DB_TABLE SET YOUR_COLUMN='newValue' WHERE id=6 ");

6

उम्मीद है कि यह आपकी मदद करेगा:

public boolean updatedetails(long rowId, String address)
  {
     SQLiteDatabase mDb= this.getWritableDatabase();
   ContentValues args = new ContentValues();
   args.put(KEY_ROWID, rowId);          
   args.put(KEY_ADDRESS, address);
  return mDb.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null)>0;   
 }

5

आप SQLite में इस एक अद्यतन विधि का प्रयास करें

int id;
ContentValues con = new ContentValues();
con.put(TITLE, title);
con.put(AREA, area);
con.put(DESCR, desc);
con.put(TAG, tag);
myDataBase.update(TABLE, con, KEY_ID + "=" + id,null);

5

इस कोड का उपयोग अपने DB` में करें

public boolean updatedetails(long rowId,String name, String address)
      {
       ContentValues args = new ContentValues();
       args.put(KEY_ROWID, rowId);          
       args.put(KEY_NAME, name);
       args.put(KEY_ADDRESS, address);
       int i =  mDb.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null);
    return i > 0;
     }

अपने नमूने में अद्यतन करने के लिए। जावा इस कोड का उपयोग करें

  //DB.open();

        try{
              //capture the data from UI
              String name = ((EditText)findViewById(R.id.name)).getText().toString().trim();
              String address =(EditText)findViewById(R.id.address)).getText().toString().trim();

              //open Db
              pdb.open();

              //Save into DBS
              pdb.updatedetails(RowId, name, address);
              Toast.makeText(this, "Modified Successfully", Toast.LENGTH_SHORT).show();
              pdb.close();
              startActivity(new Intent(this, sample.class));
              finish();
        }catch (Exception e) {
            Log.e(TAG_AVV, "errorrrrr !!");
            e.printStackTrace();
        }
    pdb.close();

3

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

ContentValues values=new ContentValues();
values.put("name","aaa");
values.put("publisher","ppp");
values.put("price","111");

int id=sqdb.update("table_name",values,"bookid='5' and booktype='comic'",null);

2

यदि आपकी sqlite पंक्ति में एक विशिष्ट आईडी या अन्य समतुल्य है, तो आप इस तरह से क्लॉज का उपयोग कर सकते हैं

update .... where id = {here is your unique row id}

अभी भी वही त्रुटि हो रही है जो मेरे प्रश्न में बताई गई है। मैंने तीसरा पैरामीटर बदल दिया (स्ट्रिंग जहाँ से क्लिक करें) "where _id = 1"। मेरे प्रश्न में भी परिवर्तन परिलक्षित होता है।
ईजीएचडीके

2

अद्यतनों के लिए, परिवर्तन के लिए setTransactionSuccessfull को कॉल करने की आवश्यकता है ताकि ऐसा हो सके:

db.beginTransaction();
try {
    db.update(...) 
    db.setTransactionSuccessfull(); // changes get rolled back if this not called
} finally {
   db.endTransaction(); // commit or rollback
}

2

// यहाँ अद्यतन के लिए कुछ सरल नमूना कोड है

// पहले यह घोषित करें

private DatabaseAppHelper dbhelper;
private SQLiteDatabase db;

// निम्नलिखित को प्रारंभ करें

dbhelper=new DatabaseAppHelper(this);
        db=dbhelper.getWritableDatabase();

// अपडेशन कोड

 ContentValues values= new ContentValues();
                values.put(DatabaseAppHelper.KEY_PEDNAME, ped_name);
                values.put(DatabaseAppHelper.KEY_PEDPHONE, ped_phone);
                values.put(DatabaseAppHelper.KEY_PEDLOCATION, ped_location);
                values.put(DatabaseAppHelper.KEY_PEDEMAIL, ped_emailid);
                db.update(DatabaseAppHelper.TABLE_NAME, values,  DatabaseAppHelper.KEY_ID + "=" + ?, null);

// a प्रश्न चिह्न ’के बजाय उर आईडी लगाना मेरी साझा प्राथमिकता में एक कार्य है।


2
 public void updateRecord(ContactModel contact) {
    database = this.getReadableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(COLUMN_FIRST_NAME, contact.getFirstName());
    contentValues.put(COLUMN_LAST_NAME, contact.getLastName());
    contentValues.put(COLUMN_NUMBER,contact.getNumber());
    contentValues.put(COLUMN_BALANCE,contact.getBalance());
    database.update(TABLE_NAME, contentValues, COLUMN_ID + " = ?", new String[]{contact.getID()});
    database.close();
}

1

बस इस तरह से प्रयास करें

  String strFilter = "_id=" + Id;
  ContentValues args = new ContentValues();
  args.put(KEY_TITLE, title);
  myDB.update("titles", args, strFilter, null);**

1

SQLite में अपडेशन के लिए विधि:

public void updateMethod(String name, String updatename){
    String query="update students set email = ? where name = ?";
    String[] selections={updatename, name};
    Cursor cursor=db.rawQuery(query, selections);
}

1
SQLiteDatabase myDB = this.getWritableDatabase();

ContentValues cv = new ContentValues();
cv.put(key1,value1);    
cv.put(key2,value2); /*All values are your updated values, here you are 
                       putting these values in a ContentValues object */
..................
..................

int val=myDB.update(TableName, cv, key_name +"=?", new String[]{value});

if(val>0)
 //Successfully Updated
else
 //Updation failed

0
public long fillDataTempo(String table){
    String[] table = new String[1];
    tabela[0] = table; 
    ContentValues args = new ContentValues();
    args.put(DBOpenHelper.DATA_HORA, new Date().toString());
    args.put(DBOpenHelper.NOME_TABELA, nome_tabela);
    return db.update(DATABASE_TABLE, args, STRING + " LIKE ?" ,tabela);
}

0

बस पंक्तिबद्ध करें और डेटा का प्रकार जो ContentValues ​​में अद्यतन होने जा रहा है।

सार्वजनिक शून्य अपडेटस्टैटस (स्ट्रिंग आईडी, इंट स्टेटस) {

SQLiteDatabase db = this.getWritableDatabase ();

ContentValues ​​डेटा = नए ContentValues ​​();

data.put ("स्थिति", स्थिति);

db.update (TableName, data, "columnName" + "=" + id, null);

}


0

मैं एक पूर्ण उदाहरण के साथ प्रदर्शित करूंगा

इस तरह अपना डेटाबेस बनाएं

    import android.content.Context
    import android.database.sqlite.SQLiteDatabase
    import android.database.sqlite.SQLiteOpenHelper

    class DBHelper(context: Context) : SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION) {
        override fun onCreate(db: SQLiteDatabase) {
            val createProductsTable = ("CREATE TABLE " + Business.TABLE + "("
                    + Business.idKey + " INTEGER PRIMARY KEY AUTOINCREMENT ,"
                    + Business.KEY_a + " TEXT, "
                    + Business.KEY_b + " TEXT, "
                    + Business.KEY_c + " TEXT, "
                    + Business.KEY_d + " TEXT, "
                    + Business.KEY_e + " TEXT )")
            db.execSQL(createProductsTable)
        }
        override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
            // Drop older table if existed, all data will be gone!!!
            db.execSQL("DROP TABLE IF EXISTS " + Business.TABLE)
            // Create tables again
            onCreate(db)

        }
        companion object {
            //version number to upgrade database version
            //each time if you Add, Edit table, you need to change the
            //version number.
            private val DATABASE_VERSION = 1

            // Database Name
            private val DATABASE_NAME = "business.db"
        }
    }

फिर CRUD की सुविधा के लिए एक क्लास बनाएं -> क्रिएट करें | पढ़ें | अपडेट | डिलीट करें

class Business {
    var a: String? = null
    var b: String? = null
    var c: String? = null
    var d: String? = null
    var e: String? = null

    companion object {
        // Labels table name
        const val TABLE = "Business"
        // 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"
    }
}

अब जादू आता है

import android.content.ContentValues
import android.content.Context

    class SQLiteDatabaseCrud(context: Context) {
        private val dbHelper: DBHelper = DBHelper(context)

        fun updateCart(id: Int, mBusiness: Business) {
            val db = dbHelper.writableDatabase
            val valueToChange = mBusiness.e
            val values = ContentValues().apply {
                put(Business.KEY_e, valueToChange)
            }
            db.update(Business.TABLE, values, "id=$id", null)
            db.close() // Closing database connection
        }
    }

आपको अपना ProductAdcape बनाना होगा जो CursorAdapter को वापस करना होगा

एक गतिविधि में तो बस इस तरह समारोह कहते हैं

internal var cursor: Cursor? = null
internal lateinit var mProductsAdapter: ProductsAdapter

 mSQLiteDatabaseCrud = SQLiteDatabaseCrud(this)
    try {
        val mBusiness = Business()
        mProductsAdapter = ProductsAdapter(this, c = todoCursor, flags = 0)
        lstProducts.adapter = mProductsAdapter


        lstProducts.onItemClickListener = OnItemClickListener { parent, view, position, arg3 ->
                val cur = mProductsAdapter.getItem(position) as Cursor
                cur.moveToPosition(position)
                val id = cur.getInt(cur.getColumnIndexOrThrow(Business.idKey))

                mBusiness.e = "this will replace the 0 in a specific position"
                mSQLiteDatabaseCrud?.updateCart(id ,mBusiness)

            }

        cursor = dataBaseMCRUD!!.productsList
        mProductsAdapter.swapCursor(cursor)
    } catch (e: Exception) {
        Log.d("ExceptionAdapter :",""+e)
    }

यहां छवि विवरण दर्ज करें

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