Обновить столбцы базы данных SQL - PullRequest
0 голосов
/ 03 февраля 2019

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

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

Это мой код:

Основная операция: добавление содержимого с помощью кнопки в 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);
            }
        }
    });

Это мой класс DB

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

Так что, если я использую обновление, представление списка в моей деятельности хранения будет пустым, и если яuse 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 голосов
/ 03 февраля 2019

This:

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

Знаки вопроса означают, что я не знаю, что вам нужно вернуть.

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