Android SQLite:更新语句
Posted
技术标签:
【中文标题】Android SQLite:更新语句【英文标题】:Android SQLite: Update Statement 【发布时间】: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。 【参考方案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);
【讨论】:
虽然链接的网站可能包含问题的答案,但您的答案似乎不完整。链接可能会以其他方式过期或中断。请将链接网站中的相关代码/信息添加到您的答案中。 我当然明白,我只是把对我有用的解决方案,当然也适用于我获得的所谓来源以上是关于Android SQLite:更新语句的主要内容,如果未能解决你的问题,请参考以下文章
在 2 个 android 应用程序之间共享 SQLite 数据库?
无法打开在 Android 中创建的 SQLite DB(文件已加密或不是数据库)