SQLite en Android Cómo actualizar una fila específica

138

He estado tratando de actualizar una fila específica durante un tiempo, y parece que hay dos formas de hacerlo. Por lo que he leído y probado, puedes usar:

execSQL(String sql) método

o el:

update(String table, ContentValues values, String whereClause, String[] whereArgs) método.

(Avíseme si esto es incorrecto, ya que soy nuevo en Android y muy nuevo en SQL).

Así que déjame llegar a mi código real.

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

Estoy tratando de lograr esto:

Actualice Field1, Field2 y Field3 donde la clave primaria (_id) es igual a 1.

Eclipse me da una línea roja justo debajo de la palabra "actualizar" y me da esta explicación:

La actualización del método (String, ContentValues, String, String []) en el tipo SQLiteDatabase no es aplicable para los argumentos (String, String, String, null)

Supongo que no estoy asignando los ContentValues ​​correctamente. ¿Alguien puede señalarme en la dirección correcta?

EGHDK
fuente

Respuestas:

289

Primero haga un objeto 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");

Luego use el método de actualización, debería funcionar ahora:

myDB.update(TableName, cv, "_id="+id, null);
Akhil
fuente
Eclipse me da subrayados rojos en "Campo1", "Campo2" y "Campo3". Sugerencias?
EGHDK
1
lo siento, pensé que son variables declaradas en su código. Póngalos entre comillas dobles.
Akhil
Gracias por ser el primero con la respuesta correcta. Me ahorro mucho tiempo. Muy apreciado.
EGHDK
2
¿Qué sucede si quiero verificar, si esa fila existe en la tabla o no y luego decidir si actualizar o insertar una fila?
Akash Raghav
11
En realidad es un paseo. El tercer parámetro de db.update () debería ser solo la cláusula where, y el cuarto son los valores de condición reales. En este caso, la línea debe ser: myDB.update(TableName, cv, "_id=?", new String[]{id}). SQLite completará automáticamente el cuarto parámetro en el "?" en el tercer parámetro, es decir, la cláusula WHERE. Si su tercer parámetro contiene n "?" S, el cuarto parámetro debe ser una Cadena [] de longitud n
CristianoYL
48

Manera simple:

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

myDataBase.execSQL(strSQL);
Yaqub Ahmad
fuente
66
Este código arrojará IllegalArgumentException. Si ejecuta una consulta sin ContentValues, sería mucho mejor evitar usar el segundo argumento. Me gusta: myDataBase.execSQL (strSQL);
Igor V Savchenko
usar execSQL()para actualizaciones no funcionará. Leer execSQL () con ACTUALIZACIÓN no se actualiza .
Roshana Pitigala
Al hacer esto, existe un grave riesgo de seguridad porque alguien puede pasar una declaración SQL a la variable 'someValue', lo que podría alterar toda la base de datos. Por lo tanto, siempre trate de hacer declaraciones preparadas cuando realice operaciones de base de datos.
Achintha Isuru
42

Al principio, cree un objeto ContentValues :

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

Luego usa el método de actualización. Tenga en cuenta que el tercer argumento es la cláusula where. Los "?" Es un marcador de posición. Será reemplazado por el cuarto argumento (id)

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

Esta es la solución más limpia para actualizar una fila específica.

Funcoder
fuente
¿La mejor manera desde usar? es seguro.
Akash Agarwal
1
Y que hace eso? ¿hacer?
Alphiii
1
El enfoque del parámetro con? Es la mejor y más segura manera. Esta debería ser la respuesta aceptada. ¡Nunca use la concatenación de cadenas al componer sentencias sql!
Grisgram
¿Cómo usar cuándo la cláusula where contiene dos campos?
Banee Ishaque K
24
  1. Personalmente prefiero .update para su conveniencia. Pero execsql funcionará igual.
  2. Tiene razón al suponer que el problema son sus valores de contenido. Debe crear un objeto ContentValue y colocar los valores para la fila de su base de datos allí.

Este código debería arreglar su ejemplo:

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

puedes probar esto ...

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

Espero que esto te ayude:

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
fuente
5

Intenta este método de actualización en 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);
Androide
fuente
5

usa este código en tu base de datos `

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

para actualizar en su sample.java use este código

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

Puede intentarlo así:

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
fuente
2

si su fila sqlite tiene una identificación única u otro equivalente, puede usar la cláusula where, como esta

update .... where id = {here is your unique row id}
mcxiaoke
fuente
Todavía obtengo el mismo error que el indicado en mi pregunta. Cambié el tercer parámetro (String whereClause) a "where _id = 1". El cambio también se refleja en mi pregunta también.
EGHDK
2

Para actualizaciones, debe llamar a setTransactionSuccessfull para que los cambios se confirmen de la siguiente manera:

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

// Aquí hay un código de muestra simple para actualizar

// Primero declara esto

private DatabaseAppHelper dbhelper;
private SQLiteDatabase db;

// inicializa lo siguiente

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

// código de actualización

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

// poner su id en lugar del 'signo de interrogación' es una función en mi preferencia compartida.

Mainak Mukherjee
fuente
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
fuente
1

solo intenta de esta manera

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

Método para la actualización en 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
fuente
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
fuente
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
fuente
0

solo proporcione rowId y el tipo de datos que se actualizarán en ContentValues.

public void updateStatus (ID de cadena, estado int) {

SQLiteDatabase db = this.getWritableDatabase ();

ContentValues ​​data = new ContentValues ​​();

data.put ("estado", estado);

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

}

Sanjay Goswami
fuente
0

Demostraré con un ejemplo completo

Crea tu base de datos de esta manera

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

Luego cree una clase para facilitar CRUD -> Crear | Leer | Actualizar | Eliminar

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

Ahora viene la magia

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

debe crear su ProductsAdapter que debe devolver un CursorAdapter

Entonces, en una actividad, simplemente llame a la función de esta manera

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

ingrese la descripción de la imagen aquí

AllanRibas
fuente