2016-08-16 4 views
0

Так что для моего андроид приложения, я хочу, чтобы обновить строку данных, которые я первоначально введенную через стандартные методы ниже, находятся в пределах одного класса, который простирается SQLiteOpenHelper:Как обновить запись в SQLiteOpenHelper без ввода?

public boolean insert(String name, int quantity, double price){ 
    ContentValues contentValues = new ContentValues(); 
    contentValues.put(DatabaseContract.Table.COLUMN_NAME_NAME, name); 
    contentValues.put(DatabaseContract.Table.COLUMN_NAME_QUANTITY, quantity); 
    contentValues.put(DatabaseContract.Table.COLUMN_NAME_PRICE, price); 
    long result = db.insert(DatabaseContract.Table.TABLE_NAME, null, contentValues); 
    if (result == -1) 
     return false; 
    else 
     return true; 
} 

public void updateData(int id, String name, int quantity, double price){ 
     ContentValues contentValues = new ContentValues(); 
     contentValues.put(DatabaseContract.Table.COLUMN_NAME_ID, id); 
     contentValues.put(DatabaseContract.Table.COLUMN_NAME_NAME, name); 
     contentValues.put(DatabaseContract.Table.COLUMN_NAME_QUANTITY, quantity); 
     contentValues.put(DatabaseContract.Table.COLUMN_NAME_PRICE, price); 
     db.update(DatabaseContract.Table.TABLE_NAME, contentValues, "ID = ?", new String[]{Integer.toString(id)}); 
    } 

В моей фактической деятельности, у меня есть имя , количество и цену Я хочу изменить, но я озадачен тем, как это сделать, когда я не знаю «id» произвольной записи.

Заранее спасибо.

+0

Где вы звоните 'UpdateData()'? Являются ли данные в «ListView»? Если это так, вы можете использовать [Adapter.getItemId()] (https://developer.android.com/reference/android/widget/Adapter.html#getItemId (int)). –

ответ

2

Вместо того, чтобы возвращать логическое значение, я вернул бы идентификатор новой записи. Скажем, например, ваше приложение имеет какое-то отношение к Магазину, а ваше имя, количество и цена являются атрибутами класса Item, я бы добавил атрибут идентификатора к вашему элементу. На вашем сохранении (создать) вы устанавливаете идентификатор в своем элементе. Это позволит вам обновить его, используя этот же идентификатор позже. Если нет, вам понадобится некоторое количество других атрибутов, которые будут служить в качестве первичного ключа, но это не похоже на то, что вы ищете, и это отличный вариант.

+0

Это именно то, что ['SQLiteDatabase.insert()'] (https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#insert (java.lang.String,% 20java.lang. String,% 20android.content.ContentValues)), поэтому OP может просто «вернуть результат». –

+0

Спасибо, это именно то, что я сделал, и это облегчает мою жизнь: ^) – user287474

0

Метод insert возвращает идентификатор только что вставленной строки или -1, если во время вставки была ошибка.

long id = db.insert(...) 

Или изменили первичный ключ таблицы, например:

db.execSQL("CREATE TABLE " + TABLE_NAME + "(name TEXT PRIMARY KEY not null,... 
1

Для удобства и гибкости, возвращая идентификатор после вставки строки всегда лучше. Для этого вы можете изменить ваш код.

Однако, как и в текущем сценарии, , если у вас нет идентификатора и вы хотите обновить строку, вы можете использовать другие столбцы и создать комбинацию условий.

Если вы можете указать название продукта (если оно уникально), вы можете заменить идентификатор с именем продукта в методе обновления (..).

db.update(DatabaseContract.Table.TABLE_NAME, contentValues, DatabaseContract.Table.COLUMN_NAME_NAME + " = ?", new String[]{name}); 

Или, если вы хотите использовать комбинацию условий:

db.update(DatabaseContract.Table.TABLE_NAME, contentValues, DatabaseContract.Table.COLUMN_NAME_NAME + " = ? AND "+DatabaseContract.Table.COLUMN_NAME_PRICE + " = ?", new String[]{name,price}); 

 Смежные вопросы

  • Нет связанных вопросов^_^