应用程序:
getContentResolver().delete(Provider.CONTENT_URI,Provider._ID + "=" + id, null);
提供者:
public static final Uri BASE_URI = Uri.parse("content://" + AUTHORITY + "/")
public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_URI,
ENTRIES_TABLE_NAME);
public static final String _ID = "_id";
@Override
public int delete(Uri uri, String where, String[] whereArgs) {
database.delete(ENTRIES_TABLE_NAME, where, whereArgs);
return 0;
}
暗示:
并查看在应用程序 getContentResolver() 中执行后,调试器是否会将您移至此断点
- 如果失败,你没有正确注册内容提供者
- 如果你会打断点实现 database.delete 是不正确的
如果我想删除第一个项目,我是否只需将 id 设置为 0?
取决于您的 _id 是否是表中的 PRIMARY_KEY
- SQlite 数据库引擎具有为您插入的每个新行创建唯一 ROWID 的机制。
如果您的表有一个 PRIMARY_KEY 那么它最终将成为该 ROW_ID 的别名
class SQLiteDatabase
/**
* Convenience method for deleting rows in the database.
*
* @param table the table to delete from
* @param whereClause the optional WHERE clause to apply when deleting.
* Passing null will delete all rows.
* @param whereArgs You may include ?s in the where clause, which
* will be replaced by the values from whereArgs. The values
* will be bound as Strings.
* @return the number of rows affected if a whereClause is passed in, 0
* otherwise. To remove all rows and get a count pass "1" as the
* whereClause.
*/
public int delete(String table, String whereClause, String[] whereArgs) {}
所以要将 id 作为 int 传递,您需要:
database.delete(TABLE_NAME, KEY_ID + " = ?",new String[]{Long.toString(id)});
或简单:
String[] whereArgs = new String[] {String.valueOf(rowId)};
注意:当数据库被清理时,Rowids会改变
因此,当您定义表并需要使用 rowids 引用记录时,请格外小心。
来自官方文档:
“Rowids 可以随时更改,恕不另行通知。如果您需要依赖您的 rowid,请将其设为 INTEGER PRIMARY KEY,则保证不会更改”。
- 还要添加 AUTOINCREMENT,这样您就可以确保在删除行时不会重用相同的 rowid。
在我的一张桌子上
我得到了 key message_id,它从value = 1开始
- 如果您不确定在 Android 设备上使用键值,SQLIte Debugger 非常出色的应用程序