Android SQLite: Заява про оновлення


91

Мені потрібно застосувати SQLite у своєму додатку. Я дотримувався цього підручника .. Створення та використання баз даних в Android

Все працює нормально. Я вставив 1 рядок з 5 стовпчиками. Тепер я хочу оновити значення лише 1 стовпця, а інші будуть незмінними.

У підручнику є один метод оновлення, але йому потрібні всі параметри, однак я хочу оновити лише один стовпець.


Запитану URL-адресу /index.php/articlesdatastorage/235-creating-and-using-databases-in-android-one не знайдено на цьому сервері.
Machado,

Відповіді:


165

Ви можете використовувати код нижче.

String strFilter = "_id=" + Id;
ContentValues args = new ContentValues();
args.put(KEY_TITLE, title);
myDB.update("titles", args, strFilter, null);

13
Ви навіть можете зробити: myDB.update ("заголовки", аргументи, strFilter, новий рядок [] {Integer.toString (ID)}); якщо для strFilter встановлено значення "_id =?" ... Прикро з одним елементом полягає в тому, що вам все одно потрібно помістити його в масив, що може зробити це незручним. Тим не менше, "за" проголосували за правильну відповідь.
Джошендо

4
@Dheeraj - Це лише оновить стовпець, доданий до об’єкта
ContentValues

2
Якщо я не помиляюся, код @joshhendo також повинен запобігати ін'єкціям SQL, чого не враховує ця відповідь. Оскільки аргумент передається як параметр, його захищає базовий код.
r41n

Вам потрібно буде поставити лапки навколо вашого Id. Щось на кшталт:String strFilter = "_id='" + Id + "'";
Гійом

119

Ви можете спробувати:

db.execSQL("UPDATE DB_TABLE SET YOUR_COLUMN='newValue' WHERE id=6 ");

Або

ContentValues newValues = new ContentValues();
newValues.put("YOUR_COLUMN", "newValue");

db.update("YOUR_TABLE", newValues, "id=6", null);

Або

ContentValues newValues = new ContentValues();
newValues.put("YOUR_COLUMN", "newValue");

String[] args = new String[]{"user1", "user2"};
db.update("YOUR_TABLE", newValues, "name=? OR name=?", args);

53

Це все в підручнику, як це зробити:

    ContentValues args = new ContentValues();
    args.put(columnName, newValue);
    db.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null);

Використовуйте ContentValuesдля встановлення оновлених стовпців, а не update()метод, у якому вам потрібно вказати, таблицю та критерії для оновлення лише тих рядків, які ви хочете оновити.


-1. Питання полягає в тому, щоб оновити один стовпець підряд, а не в цілому рядку. Відповідь Алекса правильна.
Dheeraj Vepakomma

7
Dheeraj, ти можеш просто додати стільки args.put (columnName, newValue), скільки хочеш.
Саймон Ролін

18

Ви завжди можете виконати SQL.

update [your table] set [your column]=value

наприклад

update Foo set Bar=125

3
Навіщо використовувати явний оператор SQL, якщо для цього існує (досить простий і зручний) API?
Стефан

3
@Stephan: Оскільки це не стандартний SQLite. API занадто багато зв’язується, коли БД ділиться між програмами на різних платформах
Рафаель Нобре

@Stephan Це єдина правильна відповідь на запитання. ОП хоче оновити один стовпець підряд, а не весь рядок.
Dheeraj Vepakomma

Використання API тут кращий вибір, я здивований, що середнього рішення немає, бібліотека C дозволяє визначити SQL для запуску та встановлення форматорів та лексем, наступним кроком є ​​використання C api для прив’язки змінних до лексеми в рядку SQL, тим самим уникаючи аналізу помилок, проблем із цитуваннями тощо ... тут це майже занадто допомагає, навіть не пишеться навіть частина SQL, не відчуває себе приємно ... натомість це тоді зв’язаний рядок SQL.
Даніель

Цей метод не вдасться, коли рядок містить одинарні лапки та спеціальний символ. Відповідь @Nike правильна.
Сонячно

1

Об'єкт SQLiteDatabase залежить від типу операції з базою даних.

Більше інформації відвідайте офіційний веб-сайт:

https://developer.android.com/training/basics/data-storage/databases.html#UpdateDbRow

Тут пояснюється, як маніпулювати консультаціями щодо бази даних SQLite.

ВСТАВИТИ РЯДОК

Отримує сховище даних у режимі запису

SQLiteDatabase db = mDbHelper.getWritableDatabase();

Створіть нову карту значень, де імена стовпців є ключами

ContentValues values = new ContentValues();
values.put(FeedEntry.COLUMN_NAME_ENTRY_ID, id);
values.put(FeedEntry.COLUMN_NAME_TITLE, title);
values.put(FeedEntry.COLUMN_NAME_CONTENT, content);

Вставте новий рядок, повернувши значення первинного ключа нового рядка

long newRowId;
newRowId = db.insert(
     FeedEntry.TABLE_NAME,
     FeedEntry.COLUMN_NAME_NULLABLE,
     values);

ОНОВИТИ РЯДОК

Визначте частину запиту "де".

String selection = FeedEntry.COLUMN_NAME_ENTRY_ID + " LIKE ?";

Вкажіть аргументи в порядку заповнювача.

String[] selectionArgs = { String.valueOf(rowId) };


SQLiteDatabase db = mDbHelper.getReadableDatabase();

Нове значення для одного стовпця

ContentValues values = new ContentValues();
values.put(FeedEntry.COLUMN_NAME_TITLE, title);

Який рядок оновити, виходячи з ідентифікатора

String selection = FeedEntry.COLUMN_NAME_ENTRY_ID + " LIKE ?";
String[] selectionArgs = { String.valueOf(rowId) };
    int count = db.update(
    FeedReaderDbHelper.FeedEntry.TABLE_NAME,
    values,
    selection,
    selectionArgs);

Хоча веб-сайт, на який посилається, може містити відповідь на запитання, ваша відповідь здається неповною. Посилання можуть закінчитися чи порушитись іншим способом. Будь ласка, додайте відповідний код / ​​інформацію із веб-сайту, на який посилається, до своєї відповіді.
Майк

Звичайно, я розумію, я просто буквально поставив рішення, яке працювало на мене, і, звичайно, на його передбачуване джерело, де я отримав
Густаво Едуардо Белдума

1

Я використовую цей клас для обробки бази даних, сподіваюся, це допоможе комусь у майбутньому.

Щасливого кодування.

public class Database {

private static class DBHelper extends SQLiteOpenHelper {

    /**
     * Database name
     */
    private static final String DB_NAME = "db_name";

    /**
     * Table Names
     */
    public static final String TABLE_CART = "DB_CART";


    /**
     *  Cart Table Columns
     */
    public static final String CART_ID_PK = "_id";// Primary key

    public static final String CART_DISH_NAME = "dish_name";
    public static final String CART_DISH_ID = "menu_item_id";
    public static final String CART_DISH_QTY = "dish_qty";
    public static final String CART_DISH_PRICE = "dish_price";

    /**
     * String to create reservation tabs table
     */
    private final String CREATE_TABLE_CART = "CREATE TABLE IF NOT EXISTS "
            + TABLE_CART + " ( "
            + CART_ID_PK + " INTEGER PRIMARY KEY, "
            + CART_DISH_NAME + " TEXT , "
            + CART_DISH_ID + " TEXT , "
            + CART_DISH_QTY + " TEXT , "
            + CART_DISH_PRICE + " TEXT);";


    public DBHelper(Context context) {
        super(context, DB_NAME, null, 2);

    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_TABLE_CART);


    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
        db.execSQL("DROP TABLE IF EXISTS " + CREATE_TABLE_CART);
        onCreate(db);
    }

}


     /**
      * CART handler
      */
      public static class Cart {


    /**
     * Check if Cart is available or not
     *
     * @param context
     * @return
     */
    public static boolean isCartAvailable(Context context) {

        DBHelper dbHelper = new DBHelper(context);
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        boolean exists = false;

        try {
            String query = "SELECT * FROM " + DBHelper.TABLE_CART;
            Cursor cursor = db.rawQuery(query, null);
            exists = (cursor.getCount() > 0);
            cursor.close();
            db.close();
        } catch (SQLiteException e) {
            db.close();
        }

        return exists;
    }


    /**
     * Insert values in cart table
     *
     * @param context
     * @param dishName
     * @param dishPrice
     * @param dishQty
     * @return
     */
    public static boolean insertItem(Context context, String itemId, String dishName, String dishPrice, String dishQty) {

        DBHelper dbHelper = new DBHelper(context);
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(DBHelper.CART_DISH_ID, "" + itemId);
        values.put(DBHelper.CART_DISH_NAME, "" + dishName);
        values.put(DBHelper.CART_DISH_PRICE, "" + dishPrice);
        values.put(DBHelper.CART_DISH_QTY, "" + dishQty);

        try {
            db.insert(DBHelper.TABLE_CART, null, values);
            db.close();
            return true;
        } catch (SQLiteException e) {
            db.close();
            return false;
        }
    }

    /**
     * Check for specific record by name
     *
     * @param context
     * @param dishName
     * @return
     */
    public static boolean isItemAvailable(Context context, String dishName) {

        DBHelper dbHelper = new DBHelper(context);
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        boolean exists = false;

        String query = "SELECT * FROM " + DBHelper.TABLE_CART + " WHERE "
                + DBHelper.CART_DISH_NAME + " = '" + String.valueOf(dishName) + "'";


        try {
            Cursor cursor = db.rawQuery(query, null);

            exists = (cursor.getCount() > 0);
            cursor.close();

        } catch (SQLiteException e) {

            e.printStackTrace();
            db.close();

        }

        return exists;
    }

    /**
     * Update cart item by item name
     *
     * @param context
     * @param dishName
     * @param dishPrice
     * @param dishQty
     * @return
     */
    public static boolean updateItem(Context context, String itemId, String dishName, String dishPrice, String dishQty) {

        DBHelper dbHelper = new DBHelper(context);
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(DBHelper.CART_DISH_ID, itemId);
        values.put(DBHelper.CART_DISH_NAME, dishName);
        values.put(DBHelper.CART_DISH_PRICE, dishPrice);
        values.put(DBHelper.CART_DISH_QTY, dishQty);

        try {

            String[] args = new String[]{dishName};
            db.update(DBHelper.TABLE_CART, values, DBHelper.CART_DISH_NAME + "=?", args);

            db.close();


            return true;
        } catch (SQLiteException e) {
            db.close();

            return false;
        }
    }

    /**
     * Get cart list
     *
     * @param context
     * @return
     */
    public static ArrayList<CartModel> getCartList(Context context) {

        DBHelper dbHelper = new DBHelper(context);
        SQLiteDatabase db = dbHelper.getReadableDatabase();

        ArrayList<CartModel> cartList = new ArrayList<>();

        try {
            String query = "SELECT * FROM " + DBHelper.TABLE_CART + ";";

            Cursor cursor = db.rawQuery(query, null);


            for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {

                cartList.add(new CartModel(
                        cursor.getString(cursor.getColumnIndex(DBHelper.CART_DISH_ID)),
                        cursor.getString(cursor.getColumnIndex(DBHelper.CART_DISH_NAME)),
                        cursor.getString(cursor.getColumnIndex(DBHelper.CART_DISH_QTY)),
                        Integer.parseInt(cursor.getString(cursor.getColumnIndex(DBHelper.CART_DISH_PRICE)))
                ));
            }

            db.close();

        } catch (SQLiteException e) {
            db.close();
        }
        return cartList;
    }

   /**
     * Get total amount of cart items
     *
     * @param context
     * @return
     */
    public static String getTotalAmount(Context context) {

        DBHelper dbHelper = new DBHelper(context);
        SQLiteDatabase db = dbHelper.getReadableDatabase();

        double totalAmount = 0.0;

        try {
            String query = "SELECT * FROM " + DBHelper.TABLE_CART + ";";

            Cursor cursor = db.rawQuery(query, null);


            for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {

                totalAmount = totalAmount + Double.parseDouble(cursor.getString(cursor.getColumnIndex(DBHelper.CART_DISH_PRICE))) *
                        Double.parseDouble(cursor.getString(cursor.getColumnIndex(DBHelper.CART_DISH_QTY)));
            }

            db.close();


        } catch (SQLiteException e) {
            db.close();
        }


        if (totalAmount == 0.0)
            return "";
        else
            return "" + totalAmount;
    }


    /**
     * Get item quantity
     *
     * @param context
     * @param dishName
     * @return
     */
    public static String getItemQty(Context context, String dishName) {

        DBHelper dbHelper = new DBHelper(context);
        SQLiteDatabase db = dbHelper.getReadableDatabase();

        Cursor cursor = null;
        String query = "SELECT * FROM " + DBHelper.TABLE_CART + " WHERE " + DBHelper.CART_DISH_NAME + " = '" + dishName + "';";
        String quantity = "0";

        try {
            cursor = db.rawQuery(query, null);

            if (cursor.getCount() > 0) {

                cursor.moveToFirst();
                quantity = cursor.getString(cursor
                        .getColumnIndex(DBHelper.CART_DISH_QTY));

                return quantity;
            }


        } catch (SQLiteException e) {
            e.printStackTrace();
        }

        return quantity;
    }


    /**
     * Delete cart item by name
     *
     * @param context
     * @param dishName
     */
    public static void deleteCartItem(Context context, String dishName) {
        DBHelper dbHelper = new DBHelper(context);
        SQLiteDatabase db = dbHelper.getReadableDatabase();

        try {

            String[] args = new String[]{dishName};
            db.delete(DBHelper.TABLE_CART, DBHelper.CART_DISH_NAME + "=?", args);

            db.close();
        } catch (SQLiteException e) {
            db.close();
            e.printStackTrace();
        }

    }


}//End of cart class

/**
 * Delete database table
 *
 * @param context
 */
public static void deleteCart(Context context) {
    DBHelper dbHelper = new DBHelper(context);
    SQLiteDatabase db = dbHelper.getReadableDatabase();

    try {

        db.execSQL("DELETE FROM " + DBHelper.TABLE_CART);

    } catch (SQLiteException e) {
        e.printStackTrace();
    }

}

}

Використання:

  if(Database.Cart.isCartAvailable(context)){

       Database.deleteCart(context);

   }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.