SQLite di Android Cara memperbarui baris tertentu

143

Saya sudah mencoba memperbarui baris tertentu untuk sementara waktu sekarang, dan tampaknya ada dua cara untuk melakukan ini. Dari apa yang saya baca dan coba, Anda bisa menggunakan:

execSQL(String sql) metode

atau:

update(String table, ContentValues values, String whereClause, String[] whereArgs) metode.

(Beri tahu saya jika ini salah karena saya baru mengenal android dan sangat baru mengenal SQL.)

Jadi biarkan saya mendapatkan kode saya yang sebenarnya.

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

Saya mencoba untuk mencapai ini:

Perbarui Bidang1, Bidang2, dan Bidang3 di mana kunci utama (_id) sama dengan 1.

Eclipse memberi saya garis merah tepat di bawah kata "update" dan memberi saya penjelasan ini:

Pembaruan metode (String, ContentValues, String, String []) dalam tipe SQLiteDatabase tidak berlaku untuk argumen (String, String, String, null)

Saya rasa saya tidak menetapkan ContentValues ​​dengan benar. Adakah yang bisa mengarahkan saya ke arah yang benar?

EGHDK
sumber

Jawaban:

295

Pertama buat objek 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");

Kemudian gunakan metode pembaruan, itu seharusnya berfungsi sekarang:

myDB.update(TableName, cv, "_id="+id, null);
Akhil
sumber
Eclipse memberi saya garis bawah merah di "Field1", "Field2", dan "Field3". Saran?
EGHDK
1
maaf, saya pikir mereka adalah variabel yang dideklarasikan dalam kode Anda. Beri tanda kutip ganda.
Akhil
Terima kasih telah menjadi yang pertama dengan jawaban yang benar. Menyelamatkan saya banyak waktu. Sangat dihargai.
EGHDK
3
bagaimana jika saya ingin memeriksa, apakah baris itu ada di tabel atau tidak dan kemudian memutuskan apakah akan memperbarui atau menyisipkan baris?
Akash Raghav
12
Ini sebenarnya jalan-jalan. Parameter ketiga db.update () harus klausa where saja, dan parameter keempat adalah nilai kondisi aktual. Dalam hal ini, garis harus: myDB.update(TableName, cv, "_id=?", new String[]{id}). SQLite akan secara otomatis mengisi parameter keempat ke dalam "?" di parameter ketiga, yaitu klausa WHERE. Jika parameter ketiga Anda berisi n "?" S, parameter keempat harus berupa String [] dengan panjang n
CristianoYL
50

Cara sederhana:

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

myDataBase.execSQL(strSQL);
Yaqub Ahmad
sumber
7
Kode ini akan memunculkan IllegalArgumentException. Jika Anda menjalankan kueri tanpa ContentValues, akan lebih baik jika Anda menghindari penggunaan argumen kedua sama sekali. Seperti: myDataBase.execSQL (strSQL);
Igor V Savchenko
menggunakan execSQL()untuk pembaruan tidak akan berfungsi. Baca execSQL () dengan UPDATE tidak diperbarui .
Roshana Pitigala
Ada risiko keamanan yang serius dalam melakukan hal ini karena seseorang dapat meneruskan pernyataan SQL ke variabel 'someValue', yang dapat mengubah seluruh database. Oleh karena itu, selalu coba lakukan pernyataan yang disiapkan saat melakukan operasi database apa pun.
Achintha Isuru
43

Pertama-tama buat objek ContentValues :

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

Kemudian gunakan metode pembaruan. Catatan, argumen ketiga adalah klausa where. The "?" adalah placeholder. Ini akan diganti dengan argumen keempat (id)

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

Ini adalah solusi terbersih untuk memperbarui baris tertentu.

funcoder
sumber
Cara terbaik sejak menggunakan? aman.
Akash Agarwal
2
Dan apakah itu? melakukan?
alphiii
1
Pendekatan parameter dengan? adalah cara terbaik dan teraman. Ini harus menjadi jawaban yang diterima. Jangan pernah menggunakan penggabungan string saat membuat pernyataan sql!
Grisgram
bagaimana cara menggunakan ketika klausa berisi dua bidang?
Banee Ishaque K
25
  1. Saya pribadi lebih memilih .update karena kenyamanannya. Tapi execsql akan bekerja sama.
  2. Anda benar dengan tebakan Anda bahwa masalahnya adalah nilai konten Anda. Anda harus membuat Objek ContentValue dan meletakkan nilai untuk baris database Anda di sana.

Kode ini harus memperbaiki contoh Anda:

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

kamu bisa mencoba ini ...

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

semoga ini membantu Anda:

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;   
 }
sachi
sumber
5

Anda mencoba metode pembaruan yang satu ini di 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);
Android
sumber
5

gunakan kode ini di DB Anda `

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

untuk memperbarui di sample.java Anda menggunakan kode ini

  //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();
Rahul Baradia
sumber
3

Bisa coba seperti ini:

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);
Amir john
sumber
2

jika baris sqlite Anda memiliki id unik atau ekuivalen lainnya, Anda dapat menggunakan klausa where, seperti ini

update .... where id = {here is your unique row id}
mcxiaoke.dll
sumber
Masih mendapatkan kesalahan yang sama seperti yang dinyatakan dalam pertanyaan saya. Saya mengubah parameter ketiga (String whereClause) menjadi "where _id = 1". Perubahan juga tercermin dalam pertanyaan saya juga.
EGHDK
2

Untuk pembaruan, perlu memanggil setTransactionSuccessfull agar perubahan dapat dilakukan seperti:

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

// Berikut ini beberapa contoh kode sederhana untuk pembaruan

// Pertama-tama nyatakan ini

private DatabaseAppHelper dbhelper;
private SQLiteDatabase db;

// inisialisasi berikut ini

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

// kode pembaruan

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

// letakkan id ur alih-alih 'tanda tanya' adalah fungsi dalam preferensi bersama saya.

Mainak Mukherjee
sumber
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();
}
sumit mehra
sumber
1

coba saja cara ini

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

Metode pembaruan di 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);
}
Muhammad Raza Saeed
sumber
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
Rafi
sumber
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);
}
João Rosa
sumber
0

berikan saja rowId dan jenis data yang akan diperbarui di ContentValues.

public void updateStatus (String id, int status) {

SQLiteDatabase db = this.getWritableDatabase ();

Data ContentValues ​​= new ContentValues ​​();

data.put ("status", status);

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

}

Sanjay Goswami
sumber
0

Saya akan mendemonstrasikan dengan contoh lengkap

Buat database Anda dengan cara ini

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

Kemudian buat kelas untuk memfasilitasi CRUD -> Create | Read | Update | Hapus

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

Sekarang datang keajaiban

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

Anda harus membuat ProductsAdapter yang harus mengembalikan CursorAdapter

Jadi dalam suatu aktivitas panggil saja fungsinya seperti ini

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

masukkan deskripsi gambar di sini

AllanRibas
sumber