【问题标题】:Android SQLite: Update StatementAndroid SQLite:更新语句
【发布时间】:2011-08-24 16:15:09
【问题描述】:

我需要在我的应用程序中实现 SQLite。我跟着这个教程.. Creating and using databases in Android one

一切正常。我插入了 1 行 5 列。 现在我只想更新 1 列的值,其他列保持不变。

教程中有一种更新方法,但它需要所有参数,但我只想更新一列。

【问题讨论】:

  • 在此服务器上找不到请求的 URL /index.php/articlesdatastorage/235-creating-and-using-databases-in-android-one。

标签: android sql sqlite


【解决方案1】:

您可以使用下面的代码。

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

【讨论】:

  • 你甚至可以这样做:myDB.update("titles", args, strFilter, new String[] { Integer.toString(ID) });如果您将 strFilter 设置为 "_id=?"... 单个项目的烦人之处在于您仍然需要将其放入数组中,这可能会带来不便。尽管如此,还是对正确答案投了赞成票。
  • @Dheeraj - 这只会更新添加到 ContentValues 对象的列
  • 如果我没记错的话,@joshhendo 的代码也应该防止 SQL 注入,这是这个答案没有考虑的。由于参数是作为参数传递的,因此它会被底层代码转义。
  • 您需要在Id 周围加上引号。比如:String strFilter = "_id='" + Id + "'";
【解决方案2】:

你可以试试:

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

【讨论】:

    【解决方案3】:

    如何做到这一点都在教程中:

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

    使用ContentValues 设置更新的列,而不是使用update() 方法,您必须在其中指定表和条件以仅更新您要更新的行。

    【讨论】:

    • -1。问题是更新一行中的单个列,而不是更新整行。 Alex's answer 是正确的。
    • Dheeraj,您可以根据需要添加任意数量的 args.put(columnName, newValue)。
    【解决方案4】:

    您始终可以执行 SQL。

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

    例如

    update Foo set Bar=125
    

    【讨论】:

    • 如果有一个(非常简单方便的)API,为什么要使用显式 SQL 语句?
    • @Stephan :因为它不是标准的 SQLite。当数据库在不同平台上的应用程序之间共享时,API 会特别占用太多
    • @Stephan 这是该问题的唯一正确答案。 OP 想要更新一行中的单个列,而不是更新整行。
    • 在这里使用 API 是一个更好的选择,我很惊讶没有中间解决方案,C 库允许您定义 SQL 来执行和设置格式化程序和令牌,下一步是使用将变量绑定到 SQL 字符串中的标记的 C api,从而避免解析错误和引用问题等......这里几乎太有帮助了,甚至连 SQL 的一部分都没有写,感觉不太好......而是然后是连接的 SQL 字符串。
    • 当字符串包含单引号和一些特殊字符时,此方法将失败。 @Nike 的回答是正确的。
    【解决方案5】:

    我使用这个类来处理数据库。我希望它对将来的一些人有所帮助。

    愉快的编码。

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

    【讨论】:

      【解决方案6】:

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

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

      【讨论】:

      • 虽然链接的网站可能包含问题的答案,但您的答案似乎不完整。链接可能会以其他方式过期或中断。请将链接网站中的相关代码/信息添加到您的答案中。
      • 我当然明白,我只是把对我有用的解决方案,当然也适用于我获得的所谓来源
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-29
      • 2011-12-13
      相关资源
      最近更新 更多