Android SQLite: Cập nhật Tuyên bố


91

Tôi cần triển khai SQLite trong ứng dụng của mình. Tôi đã làm theo hướng dẫn này .. Tạo và sử dụng cơ sở dữ liệu trong Android one

Mọi thứ đang hoạt động tốt. Tôi đã chèn 1 hàng với 5 cột. Bây giờ tôi chỉ muốn cập nhật giá trị của 1 cột và các cột khác sẽ được giữ nguyên.

Có một phương pháp cập nhật trong hướng dẫn nhưng nó cần tất cả các tham số, tuy nhiên tôi chỉ muốn cập nhật một cột.


Không tìm thấy URL /index.php/articlesdatastorage/235-creating-and-using-databases-in-android-one được yêu cầu trên máy chủ này.
Machado

Câu trả lời:


165

Bạn có thể sử dụng mã dưới đây.

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

13
Bạn thậm chí có thể làm: myDB.update ("title", args, strFilter, new String [] {Integer.toString (ID)}); nếu bạn đặt strFilter thành "_id =?" ... Điều khó chịu với một mục duy nhất là bạn vẫn phải đặt nó trong một mảng, điều này có thể gây bất tiện. Tuy nhiên, vẫn bình chọn cho câu trả lời đúng.
joshhendo

4
@Dheeraj - Điều này sẽ chỉ cập nhật cột được thêm vào đối tượng
ContentValues

2
Nếu tôi không sai, mã của @joshhendo cũng sẽ ngăn chặn việc tiêm SQL, điều mà câu trả lời này không xem xét. Vì đối số được truyền dưới dạng tham số nên nó được mã bên dưới thoát ra.
r41n

Bạn sẽ cần phải đặt dấu ngoặc kép xung quanh của bạn Id. Một cái gì đó như:String strFilter = "_id='" + Id + "'";
Guillaume

119

Bạn co thể thử:

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

Hoặc là

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

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

Hoặc là

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

Tất cả đều có trong hướng dẫn cách làm điều đó:

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

Sử dụng ContentValuesđể đặt các cột được cập nhật và hơn update()phương pháp mà bạn phải xác định, bảng và tiêu chí để chỉ cập nhật các hàng bạn muốn cập nhật.


-1. Câu hỏi là cập nhật một cột duy nhất trong một hàng, không phải cập nhật toàn bộ hàng. Câu trả lời của Alex là đúng.
Dheeraj Vepakomma

7
Dheeraj, bạn chỉ có thể thêm bao nhiêu args.put (columnName, newValue) tùy thích.
Simon Rolin,

18

bạn luôn có thể thực thi SQL.

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

ví dụ

update Foo set Bar=125

3
Tại sao lại sử dụng một câu lệnh SQL rõ ràng, nếu có một API (khá dễ dàng và thuận tiện) cho điều đó?
Stephan

3
@Stephan: Bởi vì nó không phải là SQLite chuẩn. API liên kết quá nhiều đặc biệt khi DB được chia sẻ giữa các ứng dụng trên các nền tảng khác nhau
Rafael Nobre

@Stephan Đây là câu trả lời đúng duy nhất cho câu hỏi. OP muốn cập nhật một cột trong một hàng, không phải cập nhật toàn bộ hàng.
Dheeraj Vepakomma

Sử dụng API là một lựa chọn tốt hơn ở đây, tôi ngạc nhiên là không có giải pháp trung gian, thư viện C cho phép bạn xác định một SQL để thực thi và đặt các định dạng và mã thông báo, bước tiếp theo là sử dụng C api để liên kết các biến với mã thông báo trong chuỗi SQL, do đó tránh được lỗi phân tích cú pháp và các vấn đề về trích dẫn, v.v. ở đây nó gần như được hỗ trợ quá nhiều, thậm chí không viết được ngay cả một phần của SQL, không cảm thấy tốt ... nhưng đúng hơn đây là một chuỗi SQL được nối.
Daniel

Phương thức này sẽ không thành công khi chuỗi chứa dấu nháy đơn và một số ký tự đặc biệt. @Nike câu trả lời là chính xác.
Nắng

1

Đối tượng SQLiteDatabase phụ thuộc vào loại hoạt động trên cơ sở dữ liệu.

Thông tin thêm, hãy truy cập trang web chính thức:

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

Nó giải thích cách thao tác tham vấn trên cơ sở dữ liệu SQLite.

CHÈN HÀNG

Nhận kho dữ liệu ở chế độ ghi

SQLiteDatabase db = mDbHelper.getWritableDatabase();

Tạo một bản đồ giá trị mới, trong đó tên cột là chìa khóa

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

Chèn hàng mới, trả về giá trị khóa chính của hàng mới

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

CẬP NHẬT ROW

Xác định phần 'ở đâu' của truy vấn.

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

Chỉ định các đối số theo thứ tự chỗ dành sẵn.

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


SQLiteDatabase db = mDbHelper.getReadableDatabase();

Giá trị mới cho một cột

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

Hàng nào cần cập nhật, dựa trên ID

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

Mặc dù trang web được liên kết có thể chứa câu trả lời cho câu hỏi, nhưng câu trả lời của bạn dường như chưa đầy đủ. Các liên kết có thể hết hạn hoặc đứt theo cách khác. Vui lòng thêm mã / thông tin liên quan từ trang web được liên kết vào câu trả lời của bạn.
Mike

Tất nhiên tôi hiểu, tôi chỉ theo nghĩa đen đặt giải pháp mà làm việc cho tôi và tất nhiên cho nguồn cáo buộc của nó mà tôi thu được
Gustavo Eduardo Belduma

1

Tôi sử dụng lớp này để xử lý cơ sở dữ liệu, hy vọng nó sẽ giúp ích cho một số người trong tương lai.

Chúc bạn viết mã vui vẻ.

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

}

}

Sử dụng:

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

       Database.deleteCart(context);

   }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.