Я знаю, что таких вопросов было много, но, к сожалению, ни один из них не помогает мне с моей проблемой.
Одним нажатием кнопки я хочу добавить новый контент в свою базу данных, или существующие столбцы должны быть перезаписаны. Добавление контента в мою базу данных работает нормально. Но если я хочу перезаписать существующий контент, мой код просто добавляет новую строку в базу данных.
Это мой код:
Основное действие: добавление контента с помощью кнопки на BD
btnAdd = (Button) findViewById(R.id.btnAdd);
btnAdd .setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ListView shopList= (ListView) findViewById(R.id.lvShopList);
for(int i = 0; i < dataSource.size();i++){
tvname = (TextView) shoppingList.getChildAt(i).findViewById(R.id.tvName);
tvamount= (TextView) shoppingList.getChildAt(i).findViewById(R.id.tvAmount);
String nameTV = tvname.getText().toString();
String amaountTV = tvamount.getText().toString();
ingredient.setName(nameTV);
ingredient.setAmpunt(amaountTV );
myDB.getInstance(MainActivity.this).increaseIngredient(ingredient);
}
}
});
Это мой класс БД
public Ingredient increaseIngredient(final Ingredient ingredient){
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COL_NAME, ingredient.getName());
values.put(COL_AMOUNT, ingredient.getAmount());
long newID = db.insert(TABLE_NAME, null, values);
db.close();
return getiIngredient(newID);
//Also tried this code, but with this, nothing will be shown:
// db.update(TABLE_NAME, values, KEY_ID + " = ?", new String[]{String.valueOf(ingredient.getId())});
// db.close();
// return getiIngredient(ingredient.getId());
}
public Ingredient getIngredient(final long id){
SQLiteDatabase db = this.getWritableDatabase();
Cursor c = db.query
(TABLE_NAME, new String[]{KEY_ID, COL_NAME, COL_AMOUNT},
KEY_ID + " = ?",
new String[]{String.valueOf(id)},
null, null, null);
Ingredient ingredient = null;
if (c != null && c.getCount() > 0) {
c.moveToFirst();
ingredient = new Ingredient(c.getString(c.getColumnIndex(COL_NAME)));
ingredient.setId(c.getLong(c.getColumnIndex(KEY_ID)));
ingredient.setAmount(c.getString(c.getColumnIndex(COL_AMOUNT)));
}
db.close();
return ingredient;
}
Это мой модельный класс
public class Ingredient implements Serializable {
private long id;
private String name;
private String amount;
public Zutaten() {
this(null, null);
}
public Zutaten(String name) {
this(name, null);
}
public Zutaten(String name, String amount) {
this.name = name;
this.amount= amount;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAmount() {
return amount;
}
public void setAmount(String amount) {
this.amount= amount;
}
}
Обновлено: это моя деятельность, в которой я хочу показать содержимое БД:
public class StorageDB extends AppCompatActivity {
myDB dbIngredients;
ListView lvDB;
TextView name, amount;
ArrayList<Ingredients> dataSource;
DbStorageAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ingredient_storage);
lvDB= (ListView) findViewById(R.id.lvDB);
dataSource = dbIngredients.getInstance(this).getAllIngredient();
this.adapter = new DbStorageAdapter (dataSource, this);
lvDB.setAdapter(adapter);
name = (TextView)findViewById(R.id.tvName);
amount= (TextView)findViewById(R.id.tvAmount);
showDBcontent();
}
private void showDBcontent(){
myDB db = new myDB (this);
ArrayList<Ingredients> iList = db.getAllIngredient();
adapter = new DbStorageAdapter (zList, this);
lvDB.setAdapter(adapter);
}
}
Поэтому, если я использую обновление, список в моем хранилище пуст, и если я использую вставку, будут показаны все строки из базы данных.
Первым щелчком я добавляю 8 строк в базу данных. Если я использую db.insert и нажимаю кнопку, у меня есть 16 строк в моей базе данных, и все 16 строк будут отображаться в действии хранилища.
ВТОРОЕ РЕДАКТИРОВАНИЕ:
На самом деле я просто хочу, чтобы мой код проверял после нажатия кнопки, существует ли таблица. Если он существует, я хочу, чтобы он обновил строки моей таблицы. Если таблица не существует, я хочу, чтобы она вставляла мой контент, который отправляется нажатием кнопки.
Я пробовал это, но это не работает:
public Ingredient increaseIngredient (final Ingredient ingredient ){
SQLiteDatabase db = this.getWritableDatabase();
Cursor c = db.rawQuery
("SELECT * FROM " + TABLE_NAME + " WHERE " + COL_NAME + " = ?",
null);
ContentValues values = new ContentValues();
values.put(COL_NAME, ingredient .getName());
values.put(COL_AMOUNT, ingredient .getAmount());
if (c !=null && c.getCount() > 0){
db.update(TABLE_NAME, values, KEY_ID + " = ?", new String[]{String.valueOf(zutaten.getId())});
db.close();
return getZutat(zutaten.getId());
} else {
long newID = db.insert(TABLE_NAME, null, values);
db.close();
return getZutat(newID);
}
@RickSanchez да, он возвращает 0, что мне нужно изменить, чтобы он работал?




Этот:
db.update(TABLE_NAME, values, KEY_ID + " = ?", new String[]{String.valueOf(ingredient.getId())});
обновит строку с помощью id = ingredient.getId(), если этот идентификатор существует в таблице.
Когда вы звоните:
myDB.getInstance(MainActivity.this).increaseIngredient(ingredient);
объект ingredient не содержит id, который вы хотите обновить.
Если вы сделаете что-то вроде этого:
ingredient.setId(10);
до вызова increaseIngredient(), тогда, если существует строка с id = 10, эта строка будет обновлена.
Изменить из комментариев:
Я имею в виду что-то вроде этого:
public Ingredient increaseIngredient (Ingredient ingredient) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COL_NAME, ingredient.getName());
values.put(COL_AMOUNT, ingredient.getAmount());
if (ingredient.getId() == null) {
long newID = db.insert(TABLE_NAME, null, values);
db.close();
return ???;
} else {
db.update(TABLE_NAME, values, KEY_ID + " = ?", new String[]{String.valueOf(ingredient.getId())});
db.close();
return ???;
}
}
Знаки вопроса означают, что я не знаю, что вам нужно вернуть.
поэтому я добавил ingredients.setId(i) в событие нажатия кнопки. но тем не менее, с db.insert он добавляет новую строку в мою таблицу, а с db.uprade ничего не отображается ... что я упускаю?
Идентификатор должен уже существовать в таблице, чтобы его можно было обновить. Когда вы делаете ingredients.setId(i), вероятно, внутри цикла, вы уверены, что в вашей таблице существует строка с id = i?
идентификатор был там, но теперь я снова изменил версию для тестирования, поэтому, когда я нажимаю кнопку, он не вставляет ее. как я могу переписать свой код, чтобы он проверял, существует ли строка, и использовал upragde, иначе он будет использовать вставку?
Когда у вас есть идентификатор, вы знаете, что строка существует, верно? Когда вы хотите вставить новую строку, вы не знаете идентификатор строки до тех пор, пока она не будет вставлена. Вот почему вы делаете это: long newID = db.insert(TABLE_NAME, null, values);, чтобы получить новый идентификатор. Так что я не понимаю, что вы пытаетесь сделать здесь. Отредактируйте свой вопрос и объясните.
хорошо, я вижу .. при первом нажатии на кнопку я хочу создать таблицу со всеми моими ингредиентами .. все последующие щелчки должны просто обновлять строки таблицы. поэтому я не знаю, как написать оператор if, чтобы выбрать вставку в первый раз и обновить для всех последующих кликов.
Один из способов определить, что вы будете делать внутри increaseIngredient(), — это проверить ingredient.getid() (думаю, у вас есть такой метод). Когда вы передаете ingredient с null или 0 в качестве идентификатора, вы будете вставлять, но если вы передаете его с номером> 0, вы должны обновить.
googled некоторые другие решения, но, к сожалению, ничего из этого мне не помогает. я просто не знаю, как написать оператор if. Во SECOND EDIT вы можете увидеть, что я пробовал.
хорошо, спасибо, но, к сожалению, я получаю, что Operator == cannot be applied to long, null пытался изменить мой идентификатор в моем классе модели на строку, но это все еще не работает
Если бы это был Long вместо long, он бы работал, но он также может работать, если вы передадите 0 и проверите if (ingredient.getId() == 0). Я не могу сказать, почему это не работает. Вы должны выполнить отладку, чтобы найти проблему.
хорошо.. все равно спасибо. Я надеюсь найти решение в ближайшее время. к сожалению, если я использую if (ingredient.getId() == 0, он будет использовать insert только один раз, а не для всех новых ингредиентов.
if (ingredient.getId() == 0 будет проверяться каждый раз, когда вы звоните increaseIngredient().
пришлось удалить мой ingredient.getId(i) в моем методе нажатия кнопки, но все же, если я хочу перезаписать свою таблицу, она все еще использует db.insert .. я тестировал с if (ingredients.getId == 0) .. когда я добавлял ингредиенты в первый раз, он работал отлично, но если я хочу перезаписать он по-прежнему добавляет новые строки вместо обновления строк
В вашем методе нажатия кнопки вы должны набор идентификатор. Если вы установите его на 0, тогда строка будет вставлена, если вы установите его на 10, тогда будет обновлена строка с id = 10.
db.insertобязательно вставит новую строку в вашу таблицу. Можете ли вы проверить, что возвращаетdb.update? В основном он возвращает количество обновленных строк. В вашем случае он может возвращать 0.