SQLite ใน Android วิธีอัปเดตแถวเฉพาะ


138

ฉันพยายามอัปเดตแถวที่ระบุมาระยะหนึ่งแล้วและดูเหมือนว่ามีสองวิธีในการทำเช่นนี้ จากสิ่งที่ฉันอ่านและลองคุณสามารถใช้:

execSQL(String sql) วิธี

หรือ:

update(String table, ContentValues values, String whereClause, String[] whereArgs) วิธี.

(แจ้งให้เราทราบหากนี่ไม่ถูกต้องเนื่องจากฉันใหม่สำหรับ Android และใหม่มากสำหรับ SQL)

ขอผมใช้รหัสจริงนะ

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

ฉันพยายามทำสิ่งนี้ให้สำเร็จ:

อัปเดต Field1, Field2 และ Field3 โดยที่คีย์หลัก (_id) เท่ากับ 1

Eclipse ให้เส้นสีแดงแก่ฉันใต้คำว่า "update" และให้คำอธิบายนี้กับฉัน:

การปรับปรุงวิธีการ (String, ContentValues, String, String []) ในประเภท SQLiteDatabase ไม่สามารถใช้ได้กับข้อโต้แย้ง (String, String, String, null)

ฉันเดาว่าฉันไม่ได้กำหนด 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);

Eclipse ให้ขีดเส้นใต้สีแดงกับ "Field1", "Field2" และ "Field3" ข้อเสนอแนะ?
EGHDK

1
ขอโทษฉันคิดว่ามันเป็นตัวแปรที่ประกาศในรหัสของคุณ ใส่ไว้ในเครื่องหมายคำพูดคู่
Akhil

ขอบคุณที่เป็นคนแรกที่ตอบถูก ช่วยฉันได้มากเวลา ชื่นชมมาก
EGHDK

2
ถ้าฉันต้องการตรวจสอบว่าแถวนั้นมีอยู่ในตารางหรือไม่แล้วตัดสินใจว่าจะอัพเดตหรือแทรกแถว?
Akash Raghav

11
จริงๆแล้วมันเป็นการเดินเล่น พารามิเตอร์ที่สามของ db.update () ควรเป็นตำแหน่งข้อเท่านั้นและข้อที่สี่คือค่าเงื่อนไขจริง myDB.update(TableName, cv, "_id=?", new String[]{id})ในกรณีนี้เส้นที่ควรจะเป็น: SQLite จะเติมพารามิเตอร์ที่สี่ลงใน "?" โดยอัตโนมัติ ในพารามิเตอร์ที่สามคือ WHERE clause หากพารามิเตอร์ที่สามของคุณมี n "?" s พารามิเตอร์ที่สี่ควรเป็นสตริง [] ของความยาว n
CristianoYL

48

วิธีง่าย ๆ :

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

myDataBase.execSQL(strSQL);

6
รหัสนี้จะโยน IllegalArgumentException หากคุณเรียกใช้คิวรีที่ไม่มี ContentValues ​​จะดีกว่ามากหากหลีกเลี่ยงการใช้อาร์กิวเมนต์ที่สอง ไลค์: myDataBase.execSQL (strSQL);
Igor V Savchenko

ใช้execSQL()สำหรับการปรับปรุงจะไม่ทำงาน อ่านexecSQL () กับการปรับปรุงไม่ได้ปรับปรุง
Roshana Pitigala

มีความเสี่ยงด้านความปลอดภัยที่ร้ายแรงในการทำเช่นนี้เพราะบางคนสามารถส่งคำสั่ง SQL ไปยังตัวแปร 'someValue' ซึ่งสามารถเปลี่ยนแปลงฐานข้อมูลทั้งหมดได้ ดังนั้นพยายามทำคำสั่งที่เตรียมไว้เสมอเมื่อทำการดำเนินการฐานข้อมูลใด ๆ
Achintha Isuru

42

ตอนแรกสร้างวัตถุContentValues :

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

จากนั้นใช้วิธีการอัพเดต หมายเหตุอาร์กิวเมนต์ที่สามคือตำแหน่งของ clause "" เป็นตัวยึดตำแหน่ง มันจะถูกแทนที่ด้วยอาร์กิวเมนต์ที่สี่ (id)

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

นี่เป็นโซลูชันที่สะอาดที่สุดเพื่ออัปเดตแถวที่เฉพาะเจาะจง


วิธีที่ดีที่สุดตั้งแต่ใช้? มีความปลอดภัย.
Akash Agarwal

1
แล้วมันคืออะไร? ทำ?
alphiii

1
วิธีการพารามิเตอร์ด้วย? เป็นวิธีที่ดีที่สุดและปลอดภัยที่สุด นี่ควรเป็นคำตอบที่ยอมรับได้ ไม่เคยใช้การต่อสตริงเมื่อเขียนคำสั่ง sql!
Grisgram

วิธีการใช้เมื่อข้อใดมีสองฟิลด์
Banee Ishaque K

24
  1. ส่วนตัวแล้วฉันจะอัปเดตเพื่อความสะดวก แต่ execsql จะทำงานเหมือนกัน
  2. คุณเดาถูกว่าปัญหาคือค่าเนื้อหาของคุณ คุณควรสร้าง ContentValue Object และวางค่าสำหรับแถวฐานข้อมูลของคุณที่นั่น

รหัสนี้ควรแก้ไขตัวอย่างของคุณ:

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


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

ใช้รหัสนี้ในฐานข้อมูลของคุณ `

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 ของคุณใช้รหัสนี้

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


2

หากแถว sqlite ของคุณมีรหัสที่ไม่ซ้ำกันหรือ equivatent อื่น ๆ คุณสามารถใช้ส่วนคำสั่งเช่นนี้

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

ยังคงได้รับข้อผิดพลาดเดียวกับที่ระบุไว้ในคำถามของฉัน ผมก็เปลี่ยนพารามิเตอร์ที่สาม (String whereClause) "where _id = 1"เพื่อ การเปลี่ยนแปลงก็สะท้อนให้เห็นในคำถามของฉันเช่นกัน
EGHDK

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

// updation code

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

// ใส่ ur id แทน 'เครื่องหมายคำถาม' เป็นฟังก์ชั่นในการตั้งค่าที่แชร์ของฉัน


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

เพียงระบุ rowId และประเภทของข้อมูลที่จะอัปเดตใน ContentValues

โมฆะสาธารณะ updateStatus (id สตริงสถานะ int) {

SQLiteDatabase db = this.getWritableDatabase ();

ContentValues ​​data = 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
        }
    }

คุณต้องสร้าง ProductsAdapter ของคุณซึ่งจะต้องส่งคืน 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)
    }

ป้อนคำอธิบายรูปภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.