从 ContentProvider 中删除?
Deleting from a ContentProvider?
我想删除我的内容提供商中的第一项。我试图通过删除 ID 为 0 的行来做到这一点(如下所示)。这不起作用——该应用程序不会 运行 使用此代码。
public void onClickDeleteExercise(View view){
int ret_val = getContentResolver().delete(MyProvider.CONTENT_URI, MyProvider.id+ " = ? ", new String[]{"0"});
Toast.makeText(getBaseContext(), "First exercise deleted", Toast.LENGTH_LONG).show();
}
我的提供商定义了这些:
static final String PROVIDER_NAME = "com.example.contentproviderexample.MyProvider";
static final String URL = "content://" + PROVIDER_NAME + "/cte";
static final Uri CONTENT_URI = Uri.parse(URL);
static final String id = "id";
static final String name = "name";
static final int uriCode = 1;
我将如何从中删除?谢谢!!
应用程序:
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;
}
提示:
排除错误,如果你使用 android studio 在
上设置断点
public int delete(..) {
database.delete() <= here breakpoint
}
并查看在应用程序 getContentResolver() 中执行后调试器是否会将您移动到此断点
- 如果失败你没有正确注册内容提供者
- if u will hit breakpoint implementation of database.delete is incorect
If I want to delete the first item, would I just set id to 0?
取决于您的 _id 在 table
中是否为 PRIMARY_KEY
- SQlite 数据库引擎有一种机制,可以为您插入的每个新行创建一个唯一的 ROWID。
如果你 table 有一个 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:
database.delete(TABLE_NAME, KEY_ID + " = ?",new String[]{Long.toString(id)});
或简单:
String[] whereArgs = new String[] {String.valueOf(rowId)};
警告:Rowids 将 更改 当数据库被清空时
因此,当您定义 table 并且需要使用 rowid 引用记录时,请格外小心。
来自官方文档:
“Rowids can change at any time and without notice. If you need to depend on your rowid, make it an INTEGER PRIMARY KEY, then it is guaranteed not to change”.
- 还添加 AUTOINCREMENT,这样您就可以确保在删除行时不会重复使用相同的 rowid。
在我的 table 之一
我得到了 key message_id 并且它从 value = 1
开始
- 如果您不确定在 Android 设备上使用 Key Value,SQLIte Debugger 非常出色的应用程序
我想删除我的内容提供商中的第一项。我试图通过删除 ID 为 0 的行来做到这一点(如下所示)。这不起作用——该应用程序不会 运行 使用此代码。
public void onClickDeleteExercise(View view){
int ret_val = getContentResolver().delete(MyProvider.CONTENT_URI, MyProvider.id+ " = ? ", new String[]{"0"});
Toast.makeText(getBaseContext(), "First exercise deleted", Toast.LENGTH_LONG).show();
}
我的提供商定义了这些:
static final String PROVIDER_NAME = "com.example.contentproviderexample.MyProvider";
static final String URL = "content://" + PROVIDER_NAME + "/cte";
static final Uri CONTENT_URI = Uri.parse(URL);
static final String id = "id";
static final String name = "name";
static final int uriCode = 1;
我将如何从中删除?谢谢!!
应用程序:
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;
}
提示:
排除错误,如果你使用 android studio 在
上设置断点public int delete(..) { database.delete() <= here breakpoint }
并查看在应用程序 getContentResolver() 中执行后调试器是否会将您移动到此断点
- 如果失败你没有正确注册内容提供者
- if u will hit breakpoint implementation of database.delete is incorect
If I want to delete the first item, would I just set id to 0?
取决于您的 _id 在 table
中是否为 PRIMARY_KEY- SQlite 数据库引擎有一种机制,可以为您插入的每个新行创建一个唯一的 ROWID。
如果你 table 有一个 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:
database.delete(TABLE_NAME, KEY_ID + " = ?",new String[]{Long.toString(id)});
或简单:
String[] whereArgs = new String[] {String.valueOf(rowId)};
警告:Rowids 将 更改 当数据库被清空时
因此,当您定义 table 并且需要使用 rowid 引用记录时,请格外小心。
来自官方文档:
“Rowids can change at any time and without notice. If you need to depend on your rowid, make it an INTEGER PRIMARY KEY, then it is guaranteed not to change”.
- 还添加 AUTOINCREMENT,这样您就可以确保在删除行时不会重复使用相同的 rowid。
在我的 table 之一
我得到了 key message_id 并且它从 value = 1
开始- 如果您不确定在 Android 设备上使用 Key Value,SQLIte Debugger 非常出色的应用程序