SQLite w Androidzie Jak zaktualizować określony wiersz

138

Od jakiegoś czasu próbuję zaktualizować konkretny wiersz i wygląda na to, że można to zrobić na dwa sposoby. Z tego, co przeczytałem i wypróbowałem, możesz po prostu użyć:

execSQL(String sql) metoda

albo:

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

(Daj mi znać, jeśli to jest nieprawidłowe, ponieważ jestem nowy na Androidzie i bardzo nowy w SQL).

Więc pozwól mi przejść do mojego aktualnego kodu.

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

Próbuję to osiągnąć:

Zaktualizuj Field1, Field2 i Field3, gdzie klucz podstawowy (_id) jest równy 1.

Eclipse wyświetla czerwoną linię tuż pod słowem „aktualizacja” i podaje następujące wyjaśnienie:

Metoda update (String, ContentValues, String, String []) w typie SQLiteDatabase nie ma zastosowania dla argumentów (String, String, String, null)

Domyślam się, że nie przypisuję poprawnie ContentValues. Czy ktoś może wskazać mi właściwy kierunek?

EGHDK
źródło

Odpowiedzi:

289

Najpierw utwórz obiekt 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");

Następnie użyj metody aktualizacji, powinna działać teraz:

myDB.update(TableName, cv, "_id="+id, null);
Achil
źródło
Eclipse daje mi czerwone podkreślenia na „Field1”, „Field2” i „Field3”. Propozycje?
EGHDK
1
przepraszam, myślałem, że to zmienne zadeklarowane w twoim kodzie. Umieść je w cudzysłowie.
Akhil
Dziękuję, że jako pierwszy podałeś poprawną odpowiedź. Zaoszczędził mi dużo czasu. Bardzo cenione.
EGHDK
2
co, jeśli chcę sprawdzić, czy ten wiersz istnieje w tabeli, czy nie, a następnie zdecydować, czy zaktualizować, czy wstawić wiersz?
Akash Raghav
11
Właściwie to spacer. Trzecim parametrem db.update () powinna być tylko klauzula where, a czwartym - rzeczywiste wartości warunków. W tym przypadku, linia powinna być: myDB.update(TableName, cv, "_id=?", new String[]{id}). SQLite automatycznie wypełni czwarty parametr w "?" w trzecim parametrze, czyli klauzuli WHERE. Jeśli trzeci parametr zawiera n „?” S, czwartym parametrem powinien być String [] o długości n
CristianoYL.
48

Prosta droga:

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

myDataBase.execSQL(strSQL);
Yaqub Ahmad
źródło
6
Ten kod spowoduje zgłoszenie wyjątku IllegalArgumentException. Jeśli wykonujesz zapytanie bez ContentValues, znacznie lepiej byłoby w ogóle unikać używania drugiego argumentu. Na przykład: myDataBase.execSQL (strSQL);
Igor V Savchenko
używanie execSQL()do aktualizacji nie będzie działać. Odczyt execSQL () z UPDATE nie aktualizuje się .
Roshana Pitigala
Istnieje przy tym poważne zagrożenie bezpieczeństwa, ponieważ ktoś może przekazać instrukcję SQL do zmiennej „someValue”, co może zmienić całą bazę danych. Dlatego zawsze staraj się wykonywać przygotowane instrukcje podczas wykonywania jakichkolwiek operacji na bazie danych.
Achintha Isuru
42

Najpierw utwórz obiekt ContentValues :

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

Następnie użyj metody aktualizacji. Uwaga, trzeci argument to klauzula where. „?” jest symbolem zastępczym. Zostanie zastąpiony czwartym argumentem (id)

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

To najczystsze rozwiązanie do aktualizacji określonego wiersza.

funcoder
źródło
Najlepszy sposób od używania? jest bezpieczny.
Akash Agarwal
1
A co to oznacza? robić?
alphiii
1
Podejście parametryczne z? to najlepszy i najbezpieczniejszy sposób. To powinna być akceptowana odpowiedź. Nigdy nie używaj konkatenacji ciągów podczas tworzenia instrukcji sql!
Grisgram
jak używać, gdy klauzula Where zawiera dwa pola?
Banee Ishaque K
24
  1. Osobiście wolę .update dla jego wygody. Ale execsql będzie działać tak samo.
  2. Zgadujesz, że problemem są wartości związane z treścią. Powinieneś utworzyć obiekt ContentValue i umieścić tam wartości dla swojego wiersza bazy danych.

Ten kod powinien naprawić twój przykład:

 ContentValues data=new ContentValues();
 data.put("Field1","bob");
 data.put("Field2",19);
 data.put("Field3","male");
 DB.update(Tablename, data, "_id=" + id, null);
KarlKarlsom
źródło
12

możesz spróbować tego ...

db.execSQL("UPDATE DB_TABLE SET YOUR_COLUMN='newValue' WHERE id=6 ");
Murugan.P
źródło
6

mam nadzieję, że to ci pomoże:

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
źródło
5

Wypróbuj tę jedną metodę aktualizacji w 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
źródło
5

użyj tego kodu w swojej bazie danych `

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

do aktualizacji w pliku sample.java użyj tego kodu

  //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
źródło
3

Możesz spróbować w ten sposób:

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
źródło
2

jeśli twój wiersz sqlite ma unikalny identyfikator lub inny równoważnik, możesz użyć klauzuli where, w ten sposób

update .... where id = {here is your unique row id}
mcxiaoke
źródło
Nadal pojawia się ten sam błąd, który podano w moim pytaniu. Zmieniłem trzeci parametr (String whereClause) na "where _id = 1". Zmiana jest również odzwierciedlona w moim pytaniu.
EGHDK
2

Aby uzyskać aktualizacje, należy wywołać setTransactionSuccessfull, aby zmiany zostały zatwierdzone w następujący sposób:

db.beginTransaction();
try {
    db.update(...) 
    db.setTransactionSuccessfull(); // changes get rolled back if this not called
} finally {
   db.endTransaction(); // commit or rollback
}
Fracdroid
źródło
2

// Oto prosty przykładowy kod do aktualizacji

// Najpierw zadeklaruj to

private DatabaseAppHelper dbhelper;
private SQLiteDatabase db;

// zainicjuj następujące

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

// kod aktualizacji

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

// wstaw swój identyfikator zamiast „znaku zapytania” to funkcja w moich wspólnych preferencjach.

Mainak Mukherjee
źródło
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
źródło
1

po prostu spróbuj w ten sposób

  String strFilter = "_id=" + Id;
  ContentValues args = new ContentValues();
  args.put(KEY_TITLE, title);
  myDB.update("titles", args, strFilter, null);**
Satyam
źródło
1

Metoda aktualizacji w 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
źródło
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
źródło
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
źródło
0

po prostu podaj rowId i typ danych, które będą aktualizowane w ContentValues.

public void updateStatus (String id, int status) {

SQLiteDatabase db = this.getWritableDatabase ();

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

data.put ("status", status);

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

}

Sanjay Goswami
źródło
0

Pokażę na kompletnym przykładzie

Stwórz w ten sposób swoją bazę danych

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

Następnie utwórz klasę, aby ułatwić CRUD -> Utwórz | Czytaj | Aktualizuj | Usuń

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

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

musisz utworzyć ProductsAdapter, który musi zwracać CursorAdapter

Więc w działaniu po prostu wywołaj taką funkcję

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

wprowadź opis obrazu tutaj

AllanRibas
źródło