1

我想删除内容提供程序中的第一项。我试图通过删除 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;

我将如何从中删除?谢谢!!

4

1 回答 1

4

应用程序:

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() 中执行后,调试器是否会将您移至此断点

  • 如果失败,你没有正确注册内容提供者
  • 如果你会打断点实现 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。

在我的一张桌子上 sqlite3 表

我得到了 key message_id,它从value = 1开始

  • 如果您不确定在 Android 设备上使用键值,SQLIte Debugger 非常出色的应用程序
于 2015-08-02T00:27:37.460 回答