SQLite dans Android Comment mettre à jour une ligne spécifique

138

J'essaie de mettre à jour une ligne spécifique depuis un certain temps maintenant, et il semble qu'il existe deux façons de le faire. D'après ce que j'ai lu et essayé, vous pouvez simplement utiliser le:

execSQL(String sql) méthode

ou la:

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

(Faites-moi savoir si cela est incorrect car je suis nouveau sur Android et très nouveau sur SQL.)

Alors laissez-moi accéder à mon code réel.

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

J'essaye d'accomplir ceci:

Mettez à jour Field1, Field2 et Field3 où la clé primaire (_id) est égale à 1.

Eclipse me donne une ligne rouge juste sous le mot «mise à jour» et me donne cette explication:

La méthode update (String, ContentValues, String, String []) dans le type SQLiteDatabase n'est pas applicable pour les arguments (String, String, String, null)

Je suppose que je n'attribue pas correctement les ContentValues. Est-ce que quelqu'un peut-il me montrer la bonne direction?

EGHDK
la source

Réponses:

289

Créez d'abord un objet 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");

Ensuite, utilisez la méthode de mise à jour, cela devrait fonctionner maintenant:

myDB.update(TableName, cv, "_id="+id, null);
Akhil
la source
Eclipse me donne des soulignements rouges sur "Field1", "Field2" et "Field3". Suggestions?
EGHDK
1
désolé, je pensais que ce sont des variables déclarées dans votre code. Mettez-les entre guillemets.
Akhil
Merci d'être le premier avec la bonne réponse. Cela m'a fait gagner beaucoup de temps. Très appréciée.
EGHDK
2
Que faire si je veux vérifier si cette ligne existe dans le tableau ou non, puis décider de mettre à jour ou d'insérer une ligne?
Akash Raghav
11
C'est en fait une promenade. Le troisième paramètre de db.update () doit être la clause where uniquement, et le quatrième est les valeurs de condition réelles. Dans ce cas, la ligne devrait être: myDB.update(TableName, cv, "_id=?", new String[]{id}). SQLite remplira automatiquement le quatrième paramètre dans le "?" dans le troisième paramètre, c'est-à-dire la clause WHERE. Si votre troisième paramètre contient n "?", Le quatrième paramètre doit être une chaîne [] de longueur n
CristianoYL
48

Manière simple:

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

myDataBase.execSQL(strSQL);
Yaqub Ahmad
la source
6
Ce code lèvera IllegalArgumentException. Si vous exécutez une requête sans ContentValues, il vaudrait mieux éviter d'utiliser le deuxième argument du tout. Comme: myDataBase.execSQL (strSQL);
Igor V Savchenko
l'utilisation execSQL()des mises à jour ne fonctionnera pas. Lire execSQL () avec UPDATE ne se met pas à jour .
Roshana Pitigala
Il y a un risque de sécurité sérieux à faire cela car quelqu'un peut passer une instruction SQL à la variable 'someValue', ce qui pourrait altérer toute la base de données. Par conséquent, essayez toujours de faire des instructions préparées lorsque vous effectuez des opérations sur la base de données.
Achintha Isuru
42

Dans un premier temps, créez un objet ContentValues :

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

Ensuite, utilisez la méthode de mise à jour. Notez que le troisième argument est la clause where. Le "?" est un espace réservé. Il sera remplacé par le quatrième argument (id)

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

C'est la solution la plus propre pour mettre à jour une ligne spécifique.

funcoder
la source
Le meilleur moyen depuis l'utilisation? est sécurisé.
Akash Agarwal
1
Et qu'est-ce que ça fait? faire?
alphiii
1
L'approche des paramètres avec? est le moyen le meilleur et le plus sûr. Cela devrait être la réponse acceptée. N'utilisez jamais de concaténation de chaînes lors de la composition d'instructions SQL!
Grisgram
comment utiliser quand la clause where contient deux champs?
Banee Ishaque K
24
  1. Personnellement, je préfère .update pour sa commodité. Mais execsql fonctionnera de la même manière.
  2. Vous avez raison de penser que le problème réside dans vos valeurs de contenu. Vous devez créer un objet ContentValue et y placer les valeurs de votre ligne de base de données.

Ce code devrait corriger votre exemple:

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

vous pouvez essayer ceci ...

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

j'espère que cela vous aidera:

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
la source
5

Vous essayez cette méthode de mise à jour dans 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
la source
5

utilisez ce code dans votre 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;
     }

pour la mise à jour dans votre sample.java utilisez ce code

  //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
la source
3

Peut essayer comme ceci:

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
la source
2

si votre ligne sqlite a un identifiant unique ou un autre équivalent, vous pouvez utiliser la clause where, comme ceci

update .... where id = {here is your unique row id}
Mcxiaoke
la source
Toujours obtenir la même erreur que celle indiquée dans ma question. J'ai changé le troisième paramètre (String whereClause) en "where _id = 1". Le changement se reflète également dans ma question.
EGHDK
2

Pour les mises à jour, vous devez appeler setTransactionSuccessfull pour que les modifications soient validées comme suit:

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

// Voici un exemple de code simple pour la mise à jour

// Déclarez d'abord ceci

private DatabaseAppHelper dbhelper;
private SQLiteDatabase db;

// initialise ce qui suit

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

// code de mise à jour

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

// mettre votre id au lieu du "point d'interrogation" est une fonction dans ma préférence partagée.

Mainak Mukherjee
la source
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
la source
1

essayez juste de cette façon

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

Méthode de mise à jour dans 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
la source
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
la source
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
la source
0

donnez simplement rowId et le type de données qui seront mises à jour dans ContentValues.

public void updateStatus (String id, int status) {

SQLiteDatabase db = this.getWritableDatabase ();

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

data.put ("statut", statut);

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

}

Sanjay Goswami
la source
0

Je vais démontrer avec un exemple complet

Créez votre base de données de cette façon

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

Ensuite, créez une classe pour faciliter CRUD -> Créer | Lire | Mettre à jour | Supprimer

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

Maintenant vient la magie

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

vous devez créer votre ProductsAdapter qui doit renvoyer un CursorAdapter

Donc, dans une activité, appelez simplement la fonction comme ceci

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

entrez la description de l'image ici

AllanRibas
la source