Android의 SQLite 특정 행을 업데이트하는 방법


138

한동안 특정 행을 업데이트하려고했지만 두 가지 방법이 있습니다. 내가 읽고 시도한 것에서 다음을 사용할 수 있습니다.

execSQL(String sql) 방법

아니면 그:

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

(안드로이드를 처음 사용하고 SQL을 처음 접했을 때 이것이 잘못된 지 알려주세요.)

실제 코드를 보도록하겠습니다.

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

나는 이것을 달성하려고 노력하고있다 :

기본 키 (_id)가 1 인 Field1, Field2 및 Field3을 업데이트하십시오.

Eclipse는 "update"라는 단어 바로 아래에 빨간색 선을 표시하고 다음 설명을 제공합니다.

SQLiteDatabase 유형의 update (String, ContentValues, String, String []) 메소드는 인수 (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 ()의 세 번째 매개 변수는 where 절이어야하며 네 번째 매개 변수는 실제 조건 값입니다. 이 경우 줄은 다음과 같아야합니다 myDB.update(TableName, cv, "_id=?", new String[]{id}). SQLite는 자동으로 네 번째 매개 변수를 "?" 세 번째 매개 변수, 즉 WHERE 절에서. 세 번째 매개 변수에 n "?"가 포함 된 경우 네 번째 매개 변수는 길이 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

누군가가 'someValue'변수에 SQL 문을 전달하여 전체 데이터베이스를 변경할 수 있기 때문에이 작업을 수행 할 때 심각한 보안 위험이 있습니다. 따라서 데이터베이스 작업을 수행 할 때는 항상 준비된 명령문을 수행하십시오.
Achintha Isuru

42

먼저 ContentValues 객체를 만듭니다.

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

그런 다음 업데이트 방법을 사용하십시오. 세 번째 인수는 where 절입니다. "?" 자리 표시 자입니다. 네 번째 인수 (id)로 대체됩니다.

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

특정 행을 업데이트하는 가장 깨끗한 솔루션입니다.


사용 후 가장 좋은 방법은? 는 안전하다.
Akash Agarwal

1
그리고 그것은 무엇입니까? 하다?
alphiii

1
?로 매개 변수 접근 가장 안전하고 안전한 방법입니다. 이것이 정답입니다. SQL 문을 작성할 때 문자열 연결을 사용하지 마십시오!
Grisgram

where 절에 두 개의 필드가 포함되어 있으면 어떻게 사용합니까?
Banee Ishaque K

24
  1. 개인적으로 편의를 위해 .update를 선호합니다. 그러나 execsql은 동일하게 작동합니다.
  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;
     }

샘플에서 업데이트하려면 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();

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 행에 고유 ID 또는 다른 동등성이있는 경우 다음과 같이 where 절을 사용할 수 있습니다

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

// 업데이트 코드

 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

ContentValues에서 업데이트 될 rowId 및 데이터 유형을 제공하십시오.

공공 무효 업데이트 상태 (문자열 id, int 상태) {

SQLiteDatabase db = this.getWritableDatabase ();

ContentValues ​​데이터 = 새로운 ContentValues ​​();

data.put ( "상태", 상태);

db.update (테이블 이름, 데이터, "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
        }
    }

CursorAdapter를 리턴해야하는 ProductsAdapter를 작성해야합니다.

따라서 활동에서 다음과 같이 함수를 호출하십시오.

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.