更新SQL数据库列

时间:2019-02-03 11:11:57

标签: java android database sql-update

我知道有很多这样的问题,但是不幸的是,这些问题都无法帮助我解决问题。

单击按钮,我想向数据库中添加一些新内容, 否则现有的列应被覆盖。将内容添加到我的数据库中可以正常工作。但是,如果我想覆盖现有内容,我的代码只会向数据库中添加新行。

这是我的代码:

主要活动:使用按钮向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);
    }

1 个答案:

答案 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()

问号表示我不知道您需要退货什么。