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

102

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

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 дает мне красную строку прямо под словом "update" и дает мне следующее объяснение:

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

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

15 ответов

210
Лучший ответ

Сначала создайте объект 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);
  • 0
    Затмение дает мне красные подчеркивания на «Поле1», «Поле2» и «Поле3». Предложения?
  • 1
    извините, я думал, что это переменные, объявленные в вашем коде. Поместите их в двойные кавычки.
Показать ещё 4 комментария
42

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

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

myDataBase.execSQL(strSQL);
  • 6
    Этот код вызовет исключение IllegalArgumentException. Если вы выполняете запрос без ContentValues, было бы гораздо лучше вообще не использовать второй аргумент. Например: myDataBase.execSQL (strSQL);
24
  • Я лично предпочитаю .update для его удобства. Но execsql будет работать одинаково.
  • Вы правы, полагая, что проблема заключается в ваших значениях контента. Вы должны создать объект ContentValue и поместить здесь значения для строки базы данных.

Этот код должен исправить ваш пример:

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

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

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

  • 0
    Лучший способ с момента использования? безопасно.
  • 1
    И что это? делать?
Показать ещё 1 комментарий
7

вы можете попробовать это...

db.execSQL("UPDATE DB_TABLE SET YOUR_COLUMN='newValue' WHERE id=6 ");
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();
4

Вы пытаетесь использовать этот один метод обновления в 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);
3

надеюсь, что это вам поможет:

public boolean updatedetails(long rowId, String address)
  {
   ContentValues args = new ContentValues();
   args.put(KEY_ROWID, rowId);          
   args.put(KEY_ADDRESS, address);
  mDb.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null)>0;   
 }
2

Можно попробовать следующее:

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

//Вот простой пример кода для обновления

//Сначала объявим этот

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

Для обновлений необходимо вызвать setTransactionSuccessfull для того, чтобы изменения были совершены так:

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

если ваша строка sqlite имеет уникальный идентификатор или другой эквивалент, вы можете использовать предложение where, подобное этому

update .... where id = {here is your unique row id}
  • 0
    По-прежнему получаю ту же ошибку, как указано в моем вопросе. Я изменил третий параметр (String whereClause) на "where _id = 1" . Изменение также отражено в моем вопросе.
1

просто попробуйте этот путь

  String strFilter = "_id=" + Id;
  ContentValues args = new ContentValues();
  args.put(KEY_TITLE, title);
  myDB.update("titles", args, strFilter, null);**
0
 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();
}
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);
}
Сообщество Overcoder
Наверх
Меню