Android SQLite: instrukcja aktualizacji


91

Muszę zaimplementować SQLite w mojej aplikacji. Postępowałem zgodnie z tym samouczkiem .. Tworzenie i używanie baz danych w systemie Android

Wszystko działa dobrze. Wstawiłem 1 wiersz z 5 kolumnami. Teraz chcę zaktualizować wartość tylko 1 kolumny, a inne pozostaną takie same.

W samouczku jest jedna metoda aktualizacji, ale wymaga ona wszystkich parametrów, jednak chcę zaktualizować tylko jedną kolumnę.


Żądany adres URL /index.php/articlesdatastorage/235-creating-and-using-databases-in-android-one nie został znaleziony na tym serwerze.
Machado

Odpowiedzi:


165

Możesz użyć poniższego kodu.

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

13
Możesz nawet zrobić: myDB.update ("tytuły", args, strFilter, new String [] {Integer.toString (ID)}); jeśli parametr strFilter jest ustawiony na „_id =?” ... Irytujące w przypadku pojedynczego elementu jest to, że nadal musisz umieścić go w tablicy, co może uczynić go niewygodnym. Mimo to w górę zagłosowano za właściwą odpowiedzią.
joshhendo

4
@Dheeraj - To zaktualizuje tylko kolumnę, która jest dodana do obiektu
ContentValues

2
Jeśli się nie mylę, kod @joshhendo powinien również zapobiegać wstrzyknięciom SQL, czego ta odpowiedź nie bierze pod uwagę. Ponieważ argument jest przekazywany jako parametr, jest on chroniony przez kod źródłowy.
r41n

Musisz umieścić cudzysłowy wokół swojego Id. Coś w rodzaju:String strFilter = "_id='" + Id + "'";
Guillaume

119

Możesz spróbować:

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

Lub

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

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

Lub

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

Wszystko w samouczku, jak to zrobić:

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

Użyj, ContentValuesaby ustawić zaktualizowane kolumny, a następnie update()metodę, w której musisz określić, tabelę i kryteria, aby zaktualizować tylko wiersze, które chcesz zaktualizować.


-1. Chodzi o to, aby zaktualizować pojedynczą kolumnę z rzędu, a nie zaktualizować cały wiersz. Odpowiedź Alexa jest poprawna.
Dheeraj Vepakomma

7
Dheeraj, możesz po prostu dodać tyle argumentów args.put (columnName, newValue), ile chcesz.
Simon Rolin

18

zawsze możesz wykonać SQL.

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

na przykład

update Foo set Bar=125

3
Po co używać jawnej instrukcji SQL, skoro istnieje do tego (całkiem łatwy i wygodny) interfejs API?
Stephan

3
@Stephan: Ponieważ nie jest to standardowy SQLite. Interfejs API jest zbyt mocno związany, zwłaszcza gdy baza danych jest współdzielona między aplikacjami na różnych platformach
Rafael Nobre

@Stephan To jedyna poprawna odpowiedź na pytanie. OP chce zaktualizować pojedynczą kolumnę w wierszu, a nie cały wiersz.
Dheeraj Vepakomma

Korzystanie z API jest tutaj lepszym rozwiązaniem, jestem zaskoczony, że nie ma rozwiązania pośredniego, biblioteka C pozwala zdefiniować SQL do wykonania i ustawić elementy formatujące i tokeny, następnym krokiem jest użycie interfejsu API C do powiązania zmiennych z tokeny w łańcuchu SQL, unikając w ten sposób błędów parsowania i problemów z cytatami itp. tutaj jest to prawie zbyt wspomagane, nawet nie pisanie nawet części SQL, nie jest przyjemne ... ale raczej to jest połączony ciąg SQL.
Daniel,

Ta metoda nie powiedzie się, jeśli ciąg zawiera pojedyncze cudzysłowy i jakiś znak specjalny. @ Odpowiedź Nike jest poprawna.
Słoneczny

1

Obiekt SQLiteDatabase zależy od typu operacji na bazie danych.

Więcej informacji na oficjalnej stronie:

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

Wyjaśnia, jak manipulować konsultacjami w bazie danych SQLite.

WSTAW RZĘD

Pobiera repozytorium danych w trybie zapisu

SQLiteDatabase db = mDbHelper.getWritableDatabase();

Utwórz nową mapę wartości, w której kluczami są nazwy kolumn

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

Wstaw nowy wiersz, zwracając wartość klucza podstawowego nowego wiersza

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

AKTUALIZUJ WIERSZ

Zdefiniuj część zapytania „gdzie”.

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

Określ argumenty w kolejności symboli zastępczych.

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


SQLiteDatabase db = mDbHelper.getReadableDatabase();

Nowa wartość dla jednej kolumny

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

Który wiersz zaktualizować na podstawie identyfikatora

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

Chociaż witryna, do której prowadzi łącze, może zawierać odpowiedź na pytanie, Twoja odpowiedź wydaje się niekompletna. Linki mogą wygasnąć lub zepsuć się w inny sposób. Do odpowiedzi dodaj odpowiedni kod / informacje z połączonej witryny.
Mike

Oczywiście rozumiem, po prostu dosłownie umieściłem rozwiązanie, które zadziałało dla mnie i oczywiście dla jego rzekomego źródła, w którym uzyskałem
Gustavo Eduardo Belduma

1

Używam tej klasy do obsługi bazy danych i mam nadzieję, że w przyszłości komuś to pomoże.

Miłego kodowania.

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

}

}

Stosowanie:

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

       Database.deleteCart(context);

   }
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.