SQLite trong Android Cách cập nhật một hàng cụ thể


138

Tôi đã cố gắng cập nhật một hàng cụ thể trong một thời gian và dường như có hai cách để làm điều này. Từ những gì tôi đã đọc và thử, bạn chỉ có thể sử dụng:

execSQL(String sql) phương pháp

hoặc là:

update(String table, ContentValues values, String whereClause, String[] whereArgs) phương pháp.

(Hãy cho tôi biết nếu điều này không chính xác vì tôi là người mới sử dụng Android và rất mới với SQL.)

Vì vậy, hãy để tôi nhận được mã thực tế của tôi.

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

Tôi đang cố gắng để thực hiện điều này:

Cập nhật Field1, Field2 và Field3 trong đó khóa chính (_id) bằng 1.

Nhật thực cho tôi một dòng màu đỏ ngay bên dưới từ "cập nhật" và cho tôi lời giải thích này:

Cập nhật phương thức (Chuỗi, ContentValues, String, String []) trong loại SQLiteDatabase không áp dụng cho các đối số (Chuỗi, Chuỗi, Chuỗi, null)

Tôi đoán tôi không chỉ định ContentValues ​​chính xác. ai đó có thể chỉ cho tôi phương hướng đúng không?

Câu trả lời:


289

Đầu tiên tạo một đối tượng 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");

Sau đó sử dụng phương pháp cập nhật, nó sẽ hoạt động ngay bây giờ:

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

Eclipse đang cho tôi gạch chân màu đỏ trên "Field1", "Field2" và "Field3". Gợi ý?
EGHDK

1
xin lỗi, tôi nghĩ rằng chúng là các biến được khai báo trong mã của bạn. Đặt chúng trong dấu ngoặc kép.
Akhil

Cảm ơn vì đã là người đầu tiên có câu trả lời đúng. Tiết kiệm cho tôi rất nhiều thời gian. Nhiều đánh giá cao.
EGHDK

2
Điều gì xảy ra nếu tôi muốn kiểm tra, nếu hàng đó có tồn tại trong bảng hay không và sau đó quyết định có nên cập nhật hoặc chèn một hàng không?
Akash Raghav

11
Đó thực sự là một cuộc dạo chơi. Tham số thứ ba của db.update () chỉ là mệnh đề where và thứ tư là các giá trị điều kiện thực tế. Trong trường hợp này, dòng nên là : myDB.update(TableName, cv, "_id=?", new String[]{id}). SQLite sẽ tự động điền thông số thứ tư vào "?" trong param thứ ba, tức là mệnh đề WHERE. Nếu thông số thứ ba của bạn chứa n "?", Thông số thứ tư phải là Chuỗi [] có độ dài n
CristianoYL

48

Cách đơn giản:

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

myDataBase.execSQL(strSQL);

6
Mã này sẽ ném IllegalArgumentException. Nếu bạn thực hiện truy vấn mà không có ContentValues, tốt hơn hết là tránh sử dụng đối số thứ hai. Giống như: myDataBase.execSQL (strQuery);
Igor V Savigan

sử dụng execSQL()để cập nhật sẽ không hoạt động. Đọc execfox () với UPDATE không cập nhật .
Roshana Pitigala

Có một rủi ro bảo mật nghiêm trọng khi thực hiện việc này vì ai đó có thể chuyển một câu lệnh SQL sang biến 'someValue', có thể thay đổi toàn bộ cơ sở dữ liệu. Do đó, luôn cố gắng thực hiện các câu lệnh được chuẩn bị khi thực hiện bất kỳ hoạt động cơ sở dữ liệu nào.
Achintha Isuru

42

Đầu tiên tạo một đối tượng ContentValues :

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

Sau đó sử dụng phương pháp cập nhật. Lưu ý, đối số thứ ba là mệnh đề where. Các "?" là một giữ chỗ. Nó sẽ được thay thế bằng đối số thứ tư (id)

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

Đây là giải pháp sạch nhất để cập nhật một hàng cụ thể.


Cách tốt nhất kể từ khi sử dụng? là an toàn.
Akash Agarwal

1
Và đó là gì? làm gì
alphiii

1
Cách tiếp cận tham số với? là cách tốt nhất và an toàn nhất. Đây phải là câu trả lời được chấp nhận. Không bao giờ sử dụng nối chuỗi khi soạn báo cáo sql!
Chương trình

Làm thế nào để sử dụng khi mệnh đề where chứa hai trường?
Banee Ishaque K

24
  1. Cá nhân tôi đặt trước .update vì sự tiện lợi của nó. Nhưng execsql sẽ hoạt động như nhau.
  2. Bạn đúng với dự đoán của bạn rằng vấn đề là giá trị nội dung của bạn. Bạn nên tạo Đối tượng ContentValue và đặt các giá trị cho hàng cơ sở dữ liệu của bạn ở đó.

Mã này sẽ sửa ví dụ của bạn:

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

12

bạn có thể thử điều này ...

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

6

hy vọng điều này sẽ giúp bạn:

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

Bạn thử phương pháp cập nhật này trong 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

sử dụng mã này trong DB của bạn

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

để cập nhật trong sample.java của bạn, hãy sử dụng mã này

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

Có thể thử như thế này:

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

nếu hàng sqlite của bạn có id duy nhất hoặc tương đương khác, bạn có thể sử dụng mệnh đề where, như thế này

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

Vẫn nhận được lỗi tương tự như đã nêu trong câu hỏi của tôi. Tôi đã thay đổi tham số thứ ba (String whereClause) thành "where _id = 1". Sự thay đổi cũng được phản ánh trong câu hỏi của tôi là tốt.
EGHDK

2

Để cập nhật, cần gọi setTransactionSuccessfull để biết các thay đổi để được cam kết như vậy:

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

2

// Đây là một số mã mẫu đơn giản để cập nhật

// Đầu tiên khai báo này

private DatabaseAppHelper dbhelper;
private SQLiteDatabase db;

// khởi tạo như sau

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

// mã cập nhật

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

// đặt id id thay vì 'dấu hỏi' là một chức năng trong sở thích chung của tôi.


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

hãy thử cách này

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

1

Phương pháp cập nhật trong 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

chỉ cần đưa ra rowId và loại dữ liệu sẽ được cập nhật trong ContentValues.

public void updateStatus (Chuỗi id, int status) {

SQLiteDatabase db = this.getWritableDatabase ();

Dữ liệu ContentValues ​​= new ContentValues ​​();

data.put ("trạng thái", trạng thái);

db.update (Tên bảng, dữ liệu, "cộtName" + "=" + id, null);

}


0

Tôi sẽ chứng minh bằng một ví dụ hoàn chỉnh

Tạo cơ sở dữ liệu của bạn theo cách này

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

Sau đó tạo một lớp để tạo điều kiện cho CRUD -> Tạo | Đọc | Cập nhật | Xóa

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

Bây giờ đến phép thuật

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

bạn phải tạo ProductsAd CHƯƠNG của mình, nó phải trả về CthonAd CHƯƠNG

Vì vậy, trong một hoạt động chỉ cần gọi hàm như thế này

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

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.