SQLite в Android Как обновить определенную строку


143

Я уже некоторое время пытаюсь обновить конкретную строку, и кажется, что есть два способа сделать это. Из того, что я читал и пробовал, вы можете просто использовать:

execSQL(String sql) метод

или:

update(String table, ContentValues values, String whereClause, String[] whereArgs) метод.

(Сообщите мне, если это неверно, поскольку я новичок в Android и очень новичок в SQL.)

Итак, позвольте мне перейти к моему собственному коду.

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

Я пытаюсь добиться этого:

Обновите Поле1, Поле2 и Поле3, где первичный ключ (_id) равен 1.

Eclipse показывает мне красную линию прямо под словом «обновление» и дает мне следующее объяснение:

Обновление метода (String, ContentValues, String, String []) в типе SQLiteDatabase неприменимо для аргументов (String, String, String, null)

Полагаю, я неправильно назначаю ContentValues. Может кто-то указать мне верное направление?

Ответы:


295

Сначала создайте объект 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 подчеркивает красным цветом «Поле1», «Поле2» и «Поле3». Предложения?
EGHDK

1
извините, я думал, что это переменные, объявленные в вашем коде. Поместите их в двойные кавычки.
Ахил

Спасибо, что первым дал правильный ответ. Сэкономил много времени. Очень признателен.
EGHDK

3
что, если я хочу проверить, существует ли эта строка в таблице или нет, а затем решить, обновлять или вставлять строку?
Akash Raghav

12
На самом деле это прогулка. Третий параметр db.update () должен быть только предложением where, а четвертый - фактическими значениями условий. В этом случае, линия должна быть: myDB.update(TableName, cv, "_id=?", new String[]{id}). SQLite автоматически подставит четвертый параметр в "?" в третьем параметре, то есть в предложении WHERE. Если ваш третий параметр содержит n "?", Четвертый параметр должен быть String [] длины n
CristianoYL

50

Простой способ:

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

myDataBase.execSQL(strSQL);

7
Этот код вызовет исключение IllegalArgumentException. Если вы выполняете запрос без ContentValues, было бы намного лучше вообще избегать использования второго аргумента. Например: myDataBase.execSQL (strSQL);
Игорь Савченко

использование execSQL()для обновлений не сработает. Чтение execSQL () с UPDATE не обновляется .
Рошана Питигала

Это создает серьезную угрозу безопасности, поскольку кто-то может передать оператор SQL переменной someValue, что может изменить всю базу данных. Поэтому всегда старайтесь выполнять подготовленные операторы при выполнении любых операций с базой данных.
Achintha Isuru

43

Сначала создайте объект 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});

Это наиболее чистое решение для обновления определенной строки.


Лучший способ с момента использования? безопасно.
Акаш Агарвал

2
А что это? делать?
alphiii

1
Параметрический подход с? это лучший и самый безопасный способ. Это должен быть принятый ответ. Никогда не используйте конкатенацию строк при составлении операторов sql!
Grisgram 02

как использовать, когда предложение where содержит два поля?
Banee Ishaque K,

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


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

используйте этот код в своей БД `

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

для обновления в вашем sample.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 имеет уникальный идентификатор или другой эквивалент, вы можете использовать предложение 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

просто укажите rowId и тип данных, которые будут обновляться в ContentValues.

public void updateStatus (String id, int status) {

SQLiteDatabase db = this.getWritableDatabase ();

Данные ContentValues ​​= новые ContentValues ​​();

data.put («статус», статус);

db.update (TableName, data, "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
        }
    }

вы должны создать свой ProductsAdapter, который должен возвращать CursorAdapter

Поэтому в действии просто вызовите функцию, подобную этой

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

введите описание изображения здесь

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.