Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android-检查表中是否存在行并更新它_Java_Android_Sqlite - Fatal编程技术网

Java Android-检查表中是否存在行并更新它

Java Android-检查表中是否存在行并更新它,java,android,sqlite,Java,Android,Sqlite,不幸的是,我能找到的所有解决方案都不能帮助我解决问题 单击一个按钮,我想向我的数据库表添加一些值,但首先它应该检查我的表中是否已经存在该行,如果已经存在,它应该只更新该行 这是我的密码: 主要活动:(只需点击按钮) 对于这段代码,它总是使用else语句,我不知道为什么会发生这种情况 我希望有人能帮助我创建一个新行,如果它不存在,并更新该行,如果它存在 对于这段代码,它总是使用else语句,我不知道为什么 这种情况经常发生 发生这种情况的原因是query方法的第四个参数是newstring[]{S

不幸的是,我能找到的所有解决方案都不能帮助我解决问题

单击一个按钮,我想向我的数据库表添加一些值,但首先它应该检查我的表中是否已经存在该行,如果已经存在,它应该只更新该行

这是我的密码:

主要活动:(只需点击按钮)

对于这段代码,它总是使用else语句,我不知道为什么会发生这种情况

我希望有人能帮助我创建一个新行,如果它不存在,并更新该行,如果它存在

对于这段代码,它总是使用else语句,我不知道为什么 这种情况经常发生

发生这种情况的原因是query方法的第四个参数是
newstring[]{String.valueOf(component)}

这将成为一个类似Ingredient@1091您是否有一个ID类似的成分行(修辞性地说,因为ID列是rowid的别名,因此只能存储整数值)

Ingredient@1091是指成分对象的字符串值将是指向该对象的指针

因此,不会返回任何行

如果改为使用
newstring[]{String.valueOf(component.getId)、component.getName、component.getAmount)}


这3个值应该是正确的值(假设ID正确存储在配料中)。

您可以使用此代码来实现这一点。查看这篇文章@Sobhan我已经尝试过这段代码,但不幸的是它对我不起作用,问题是,它对第一个成分使用else语句,对第二个成分使用if语句,但对这两个成分都应该使用else语句,如果我再次单击add按钮,那么它应该使用if语句
ingredient= new Ingredient();

btnAdd.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        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 amountTV = tvamount.getText().toString();

            ingredient.setName(nameTV);
            ingredient.setAmount(amountTV);
            ingredient.setId(i);

            TableIngredient.getInstance(IngredientShopping.this).checkRow(ingredient);
            }
public class TableIncredient extends SQLiteOpenHelper {
    public static TableIngredient INSTANCE = null;

    public static final String DB_NAME = "INGREDIENT_TABLE";
    public static final int VERSION = 1;
    public static final String TABLE_NAME = "ingredient_table";

    public static final String KEY_ID = "ID";
    public static final String COL_NAME = "Name";
    public static final String COL_AMOUNT = "AMOUNT";


    public TableIngredient (Context context) {
        super(context, DB_NAME, null, VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
    String createQuery = "CREATE TABLE " + TABLE_NAME
            + "(" + KEY_ID + " INTEGER PRIMARY KEY, "
            + COL_NAME + " TEXT NOT NULL, "
            + COL_AMOUNT + " INTEGER DEFAULT NULL)";
    db.execSQL(createQuery);
    }

    public boolean checkRow(Ingredient ingredient){
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor c = db.query(TABLE_NAME,
            new String[]{KEY_ID, COL_NAME, COL_AMOUUNT},
            KEY_ID + " =? AND " + COL_NAME + " =? AND " + COL_AMOUNT + " =?" ,
            new String[]{String.valueOf(ingredient)},
            null, null, null, null);

        ContentValues values = new ContentValues();
        values.put(COL_NAME, ingredient.getName());
        values.put(COL_AMOUNT, ingredient.getAmount());

        if (c.moveToFirst()){
            increseIngredient(ingredient);
            return true;
        }
        else {
            long newID = db.insert(TABLE_NAME, null, values);
            db.close();
            getIngredient(newID);
            return false;
        }
    }
}