Android - проверьте, существует ли строка в таблице, и обновите ее - PullRequest
0 голосов
/ 09 февраля 2019

К сожалению, все решения, которые я смог найти, не помогли бы мне решить мою проблему.

Нажав кнопку, я хочу добавить какое-то значение в таблицу базы данных, но сначала следует проверить, существует ли уже строкав моей таблице, если это так, он просто должен обновить строку.

Вот мои коды:

ОСНОВНАЯ ДЕЯТЕЛЬНОСТЬ: (просто нажатие кнопки)

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;
        }
    }
}

В этом коде он всегда использует оператор else, и я не знаю, почему это происходит.

Я надеюсь, что кто-то может помочь мне создать новую строку, если она не существует, и обновить строку, если она существует.

1 Ответ

0 голосов
/ 09 февраля 2019

С этим кодом он всегда использует оператор else, и я не знаю, почему это происходит.

Причина, по которой это происходит, заключается в том, что 4-й параметр в запросе метод равен new String[]{String.valueOf(ingredient)}

Это разрешит значение, равное Ingredient @ 1091 у вас есть строка ингредиента с таким идентификатором ( риторический, как это не может быть, потому что столбец ID является псевдонимом rowid и, следовательно, могут храниться ТОЛЬКО целочисленные значения ).

Причина, по которой Ingredient @ 1091 означает, что значение String объекта Ingredient будет указателем на объект.

Таким образом, строки не будут возвращены.

Если вместо этого вы использовали new String[]{String.valueOf(ingredient.getId),ingredient.getName,ingredient.getAmount)}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...