从 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 非常出色的应用程序