SQLite in Android So aktualisieren Sie eine bestimmte Zeile


138

Ich habe schon seit einiger Zeit versucht, eine bestimmte Zeile zu aktualisieren, und es scheint, dass es zwei Möglichkeiten gibt, dies zu tun. Nach dem, was ich gelesen und ausprobiert habe, können Sie einfach Folgendes verwenden:

execSQL(String sql) Methode

oder der:

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

(Lassen Sie mich wissen, wenn dies falsch ist, da ich neu in Android und sehr neu in SQL bin.)

Lassen Sie mich also zu meinem eigentlichen Code gelangen.

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

Ich versuche dies zu erreichen:

Aktualisieren Sie Feld1, Feld2 und Feld3, wobei der Primärschlüssel (_id) gleich 1 ist.

Eclipse gibt mir eine rote Linie direkt unter dem Wort "Update" und gibt mir diese Erklärung:

Die Methodenaktualisierung (String, ContentValues, String, String []) im Typ SQLiteDatabase gilt nicht für die Argumente (String, String, String, null).

Ich schätze, ich ordne die ContentValues ​​nicht richtig zu. Kann mich jemand in die richtige Richtung weisen?

Antworten:


289

Erstellen Sie zunächst ein ContentValues-Objekt:

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

Verwenden Sie dann die Update-Methode, es sollte jetzt funktionieren:

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

Eclipse unterstreicht mich rot bei "Field1", "Field2" und "Field3". Vorschläge?
EGHDK

1
Entschuldigung, ich dachte, es sind Variablen, die in Ihrem Code deklariert sind. Setzen Sie sie in doppelte Anführungszeichen.
Akhil

Vielen Dank, dass Sie der Erste mit der richtigen Antwort sind. Hat mir viel Zeit gespart. Sehr geschätzt.
EGHDK

2
Was ist, wenn ich überprüfen möchte, ob diese Zeile in der Tabelle vorhanden ist oder nicht, und dann entscheiden möchte, ob eine Zeile aktualisiert oder eingefügt werden soll?
Akash Raghav

11
Es ist eigentlich ein Rundgang. Der dritte Parameter von db.update () sollte nur die where-Klausel sein, und der vierte ist der tatsächliche Bedingungswert. In diesem Fall sollte die Zeile sein : myDB.update(TableName, cv, "_id=?", new String[]{id}). SQLite füllt automatisch den vierten Parameter in das "?" im dritten Parameter, dh der WHERE-Klausel. Wenn Ihr dritter Parameter n "?" S enthält, sollte der vierte Parameter ein String [] der Länge n sein
CristianoYL

48

Einfacher Weg:

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

myDataBase.execSQL(strSQL);

6
Dieser Code löst eine IllegalArgumentException aus. Wenn Sie eine Abfrage ohne ContentValues ​​ausführen, ist es viel besser, die Verwendung eines zweiten Arguments zu vermeiden. Wie: myDataBase.execSQL (strSQL);
Igor V Savchenko

Die Verwendung execSQL()für Updates funktioniert nicht. Read execSQL () mit UPDATE wird nicht aktualisiert .
Roshana Pitigala

Dies birgt ein ernstes Sicherheitsrisiko, da jemand eine SQL-Anweisung an die Variable 'someValue' übergeben kann, wodurch die gesamte Datenbank geändert werden kann. Versuchen Sie daher immer, vorbereitete Anweisungen auszuführen, wenn Sie Datenbankoperationen ausführen.
Achintha Isuru

42

Erstellen Sie zunächst ein ContentValues- Objekt:

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

Verwenden Sie dann die Aktualisierungsmethode. Beachten Sie, dass das dritte Argument die where-Klausel ist. Das "?" ist ein Platzhalter. Es wird durch das vierte Argument (id) ersetzt.

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

Dies ist die sauberste Lösung zum Aktualisieren einer bestimmten Zeile.


Der beste Weg seit der Verwendung? ist sicher.
Akash Agarwal

1
Und was macht das? machen?
Alphiii

1
Der Parameteransatz mit? ist der beste und sicherste Weg. Dies sollte die akzeptierte Antwort sein. Verwenden Sie beim Erstellen von SQL-Anweisungen niemals die Verkettung von Zeichenfolgen!
Grisgramm

Wie verwende ich, wenn die where-Klausel zwei Felder enthält?
Banee Ishaque K

24
  1. Ich persönlich bevorzuge .update für seine Bequemlichkeit. Aber execsql wird genauso funktionieren.
  2. Sie haben Recht mit Ihrer Vermutung, dass das Problem Ihre Inhaltswerte sind. Sie sollten ein ContentValue-Objekt erstellen und dort die Werte für Ihre Datenbankzeile einfügen.

Dieser Code sollte Ihr Beispiel korrigieren:

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

12

Sie können dies versuchen ...

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

6

hoffe das hilft dir:

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

Sie versuchen diese eine Aktualisierungsmethode in 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

Verwenden Sie diesen Code in Ihrer Datenbank

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

Verwenden Sie diesen Code, um in Ihrer sample.java zu aktualisieren

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

Kann so versuchen:

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

Wenn Ihre SQLite-Zeile eine eindeutige ID oder eine andere Entsprechung hat, können Sie die where-Klausel wie diese verwenden

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

Immer noch den gleichen Fehler wie in meiner Frage angegeben. Ich habe den dritten Parameter (String whereClause) in geändert "where _id = 1". Die Änderung spiegelt sich auch in meiner Frage wider.
EGHDK

2

Für Updates müssen Sie setTransactionSuccessfull aufrufen, damit Änderungen wie folgt festgeschrieben werden:

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

2

// Hier ist ein einfacher Beispielcode für die Aktualisierung

// Deklariere dies zuerst

private DatabaseAppHelper dbhelper;
private SQLiteDatabase db;

// initialisiere folgendes

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

// Aktualisierungscode

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

// setze deine ID anstelle des 'Fragezeichens' ist eine Funktion in meiner gemeinsamen Präferenz.


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

versuchen Sie es einfach so

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

1

Methode zur Aktualisierung in 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

Geben Sie einfach die Zeilen-ID und den Datentyp an, der in ContentValues ​​aktualisiert werden soll.

public void updateStatus (String-ID, int-Status) {

SQLiteDatabase db = this.getWritableDatabase ();

ContentValues-Daten = neue ContentValues ​​();

data.put ("Status", Status);

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

}}


0

Ich werde mit einem vollständigen Beispiel demonstrieren

Erstellen Sie Ihre Datenbank auf diese Weise

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

Erstellen Sie dann eine Klasse, um CRUD zu vereinfachen -> Erstellen | Lesen | Aktualisieren | Löschen

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

Jetzt kommt die 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
        }
    }

Sie müssen Ihren ProductsAdapter erstellen, der einen CursorAdapter zurückgeben muss

Rufen Sie in einer Aktivität einfach die Funktion wie folgt auf

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

Geben Sie hier die Bildbeschreibung ein

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.