Обновление столбцов базы данных SQL

Я знаю, что таких вопросов было много, но, к сожалению, ни один из них не помогает мне с моей проблемой.

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

Это мой код:

Основное действие: добавление контента с помощью кнопки на 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);
    }
db.insert обязательно вставит новую строку в вашу таблицу. Можете ли вы проверить, что возвращает db.update? В основном он возвращает количество обновленных строк. В вашем случае он может возвращать 0.
Binary Baba 03.02.2019 12:21

@RickSanchez да, он возвращает 0, что мне нужно изменить, чтобы он работал?

diem_L 03.02.2019 12:57
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
60
1

Ответы 1

Этот:

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 ничего не отображается ... что я упускаю?

diem_L 03.02.2019 14:33

Идентификатор должен уже существовать в таблице, чтобы его можно было обновить. Когда вы делаете ingredients.setId(i), вероятно, внутри цикла, вы уверены, что в вашей таблице существует строка с id = i?

forpas 03.02.2019 14:35

идентификатор был там, но теперь я снова изменил версию для тестирования, поэтому, когда я нажимаю кнопку, он не вставляет ее. как я могу переписать свой код, чтобы он проверял, существует ли строка, и использовал upragde, иначе он будет использовать вставку?

diem_L 03.02.2019 14:39

Когда у вас есть идентификатор, вы знаете, что строка существует, верно? Когда вы хотите вставить новую строку, вы не знаете идентификатор строки до тех пор, пока она не будет вставлена. Вот почему вы делаете это: long newID = db.insert(TABLE_NAME, null, values);, чтобы получить новый идентификатор. Так что я не понимаю, что вы пытаетесь сделать здесь. Отредактируйте свой вопрос и объясните.

forpas 03.02.2019 14:45

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

diem_L 03.02.2019 14:47

Один из способов определить, что вы будете делать внутри increaseIngredient(), — это проверить ingredient.getid() (думаю, у вас есть такой метод). Когда вы передаете ingredient с null или 0 в качестве идентификатора, вы будете вставлять, но если вы передаете его с номером> 0, вы должны обновить.

forpas 03.02.2019 14:51

googled некоторые другие решения, но, к сожалению, ничего из этого мне не помогает. я просто не знаю, как написать оператор if. Во SECOND EDIT вы можете увидеть, что я пробовал.

diem_L 03.02.2019 15:59

хорошо, спасибо, но, к сожалению, я получаю, что Operator == cannot be applied to long, null пытался изменить мой идентификатор в моем классе модели на строку, но это все еще не работает

diem_L 03.02.2019 17:14

Если бы это был Long вместо long, он бы работал, но он также может работать, если вы передадите 0 и проверите if (ingredient.getId() == 0). Я не могу сказать, почему это не работает. Вы должны выполнить отладку, чтобы найти проблему.

forpas 03.02.2019 17:19

хорошо.. все равно спасибо. Я надеюсь найти решение в ближайшее время. к сожалению, если я использую if (ingredient.getId() == 0, он будет использовать insert только один раз, а не для всех новых ингредиентов.

diem_L 03.02.2019 17:29
if (ingredient.getId() == 0 будет проверяться каждый раз, когда вы звоните increaseIngredient().
forpas 03.02.2019 17:32

пришлось удалить мой ingredient.getId(i) в моем методе нажатия кнопки, но все же, если я хочу перезаписать свою таблицу, она все еще использует db.insert .. я тестировал с if (ingredients.getId == 0) .. когда я добавлял ингредиенты в первый раз, он работал отлично, но если я хочу перезаписать он по-прежнему добавляет новые строки вместо обновления строк

diem_L 03.02.2019 17:45

В вашем методе нажатия кнопки вы должны набор идентификатор. Если вы установите его на 0, тогда строка будет вставлена, если вы установите его на 10, тогда будет обновлена ​​строка с id = 10.

forpas 03.02.2019 17:52

Другие вопросы по теме