Android'de SQLite Belirli bir satırı güncelleme


138

Bir süredir belirli bir satırı güncellemeye çalışıyorum ve bunu yapmanın iki yolu var gibi görünüyor. Okuduğum ve denediğim kadarıyla şunları kullanabilirsiniz:

execSQL(String sql) yöntem

ya da:

update(String table, ContentValues values, String whereClause, String[] whereArgs) yöntem.

(Android'de yeni ve SQL'de çok yeni olduğum için bunun yanlış olup olmadığını bana bildirin.)

Şimdi gerçek koduma bakayım.

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

Bunu başarmaya çalışıyorum:

Birincil anahtarın (_id) 1'e eşit olduğu Alan1, Alan2 ve Alan3'ü güncelleyin.

Eclipse bana "güncelleme" kelimesinin hemen altında kırmızı bir çizgi veriyor ve bana şu açıklamayı veriyor:

SQLiteDatabase türündeki update (String, ContentValues, String, String []) yöntemi bağımsız değişkenler (String, String, String, null) için geçerli değil

Sanırım ContentValues'ı doğru atamıyorum. Birisi beni doğru yönde gösterebilir mi?

Yanıtlar:


289

Önce bir ContentValues ​​nesnesi oluşturun:

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

Sonra güncelleme yöntemini kullanın, şimdi çalışmalıdır:

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

Eclipse bana "Field1", "Field2" ve "Field3" üzerinde kırmızı alt çizgiler veriyor. Öneriler?
EGHDK

1
üzgünüm, kodunuzda bildirilen değişkenler olduklarını düşündüm. Onları çift tırnak içine alın.
Akhil

Doğru cevabı veren ilk kişi olduğunuz için teşekkürler. Beni çok kurtardı. Çok takdir etmek.
EGHDK

2
kontrol etmek istersem, o satır tabloda olup olmadığını kontrol eder ve ardından bir satırın güncellenip güncellenmemesine karar veririm?
Akash Raghav

11
Aslında etrafta dolaşmak. Db.update () öğesinin üçüncü parametresi yalnızca where yan tümcesi olmalı ve dördüncü gerçek durum değerleri olmalıdır. Bu durumda, satır olmalıdır: myDB.update(TableName, cv, "_id=?", new String[]{id}). SQLite dördüncü parametreyi otomatik olarak "?" üçüncü paragrafta, yani WHERE yan tümcesinde. Üçüncü parametreniz n "?" S içeriyorsa, dördüncü param n uzunluğu olan bir String [] olmalıdır
CristianoYL

48

Basit yol:

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

myDataBase.execSQL(strSQL);

6
Bu kod IllegalArgumentException özel durumunu oluşturur. ContentValues ​​olmadan sorgu yürütürseniz, ikinci bağımsız değişken kullanmaktan kaçınmak çok daha iyi olur. Gibi: myDataBase.execSQL (strSQL);
Igor V Savchenko

execSQL()güncellemeler için kullanmak işe yaramaz. Okuma GÜNCELLEME ile execSQL () güncelleme değildir .
Roshana Pitigala

Bunu yaparken ciddi bir güvenlik riski vardır, çünkü birisi bir veritabanını tüm veritabanını değiştirebilecek bir SQL deyimini 'someValue' değişkenine geçirebilir. Bu nedenle her zaman herhangi bir veritabanı işlemi yaparken hazırlanmış ifadeler yapmaya çalışın.
Achintha Isuru

42

İlk önce bir ContentValues nesnesi oluşturun:

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

Ardından güncelleme yöntemini kullanın. Üçüncü argüman nerede yan tümcesidir. "?" bir yer tutucudur. Dördüncü argümanla değiştirilecek (id)

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

Bu, belirli bir satırı güncellemek için en temiz çözümdür.


Kullanmadan bu yana en iyi yol? güvenlidir.
Akash Agarwal

1
Ve bu ne yapıyor? yapmak?
alphiii

1
? en iyi ve en güvenli yoldur. Bu kabul edilen cevap olmalı. Sql ifadeleri oluştururken asla string birleştirme kullanmayın!
Grisgram

madde iki alan içerdiğinde nasıl kullanılır?
Banee Ishaque K

24
  1. Ben şahsen kolaylık sağlamak için .update tercih ederim. Ancak execsql aynı şekilde çalışır.
  2. Sorunun içerik değerleriniz olduğunu tahmin etmekte haklısınız. Bir ContentValue Nesnesi oluşturmalı ve veritabanı satırınızın değerlerini oraya koymalısınız.

Bu kod örneğinizi düzeltmelidir:

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

12

bunu deneyebilirsiniz ...

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

6

umarım bu sana yardımcı olur:

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

Bu bir güncelleme yöntemini SQLite'de deneyin

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 `de bu kodu kullan

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

sample.java'nızda güncelleme için bu kodu kullanın

  //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

Böyle deneyebilir:

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 satırınızın benzersiz bir kimliği veya başka bir eşdeğeri varsa, nerede cümlesi kullanabilirsiniz, bunun gibi

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

Hala sorumda belirtilen hatayla aynı hatayı alıyorum. Üçüncü parametreyi (String whereClause) olarak değiştirdim "where _id = 1". Değişim de soruma da yansıyor.
EGHDK

2

Güncellemeler için, değişikliklerin şu şekilde yapılması için setTransactionSuccessfull öğesini aramanız gerekir:

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

2

// İşte güncelleme için bazı basit örnek kod

// Önce bunu beyan et

private DatabaseAppHelper dbhelper;
private SQLiteDatabase db;

// aşağıdakileri başlat

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

// güncelleme kodu

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

// 'soru işareti' yerine ur id id, paylaşılan tercihimdeki bir işlevdir.


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

sadece bu şekilde dene

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

1

SQLite'de güncelleme yöntemi:

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'da güncellenecek rowId ve veri türünü vermeniz yeterlidir.

public void updateStatus (Dize kimliği, int durumu) {

SQLiteDatabase db = this.getWritableDatabase ();

ContentValues ​​verileri = yeni ContentValues ​​();

data.put ("durum", durum);

db.update (TabloAdı, veri, "sütunAdı" + "=" + id, null);

}


0

Tam bir örnekle göstereceğim

Veritabanınızı bu şekilde oluşturun

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

Ardından CRUD'yi kolaylaştırmak için bir sınıf oluşturun -> Oluştur | Oku | Güncelle | Sil

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

Şimdi sihir geliyor

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

bir CursorAdapter döndürmesi gereken ProductsAdapter'ınızı oluşturmanız gerekir

Yani bir aktivitede sadece böyle fonksiyon

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

resim açıklamasını buraya girin

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.