我知道有很多这样的问题,但是不幸的是,这些问题都无法帮助我解决问题。
单击按钮,我想向数据库中添加一些新内容, 否则现有的列应被覆盖。将内容添加到我的数据库中可以正常工作。但是,如果我想覆盖现有内容,我的代码只会向数据库中添加新行。
这是我的代码:
主要活动:使用按钮向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);
}
}
因此,如果我使用update,则存储活动中的listview为空,如果使用insert,将显示数据库中的所有行。
第一次单击,我向数据库添加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);
}
答案 0 :(得分:1)
此:
libraryDependencies += "org.apache.spark" % "spark-core_2.12" % "2.4.0"
libraryDependencies += "org.apache.spark" % "spark-sql_2.12" % "2.4.0"
libraryDependencies += "org.apache.spark" % "spark-mllib_2.12" % "2.4.0"
如果表中存在此ID,将使用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);
之前,如果存在id = 10的行,则该行将被更新。
从评论中编辑:
我的意思是这样的:
increaseIngredient()
问号表示我不知道您需要退货什么。