ContentPorvider的CRUD操作混乱

时间:2018-09-26 14:13:29

标签: android android-contentprovider

我是contenProvider的新手,正在阅读有关如何在UserDictionary上执行CRUD操作的教程。

查询:

resolver.query(UserDictionary.Words.CONTENT_URI, projection, null, null, null);

用于插入:

resolver.insert(UserDictionary.Words.CONTENT_URI, values); //ContentValues values = new ContentValues();

有关更新:

Uri uri = ContentUris.withAppendedId(Words.CONTENT_URI, id);
long noUpdated = resolver.update(uri, values, null, null);

删除:

long noDeleted = resolver.delete(Words.CONTENT_URI,
   Words.WORD + " = ? ", new String[]{"Zaphod"});

我的困惑在于更新和删除操作。

在更新中:为什么在 withAppendedId()中使用 Words.CONTENT_URI ?应该使用 UserDictionary.Words.CONTENT_URI 吗?

也在删除中:它不使用withAppendedId()。仍然为什么使用 Words.CONTENT_URI

1 个答案:

答案 0 :(得分:0)

在您的示例UserDictionary.Words.CONTENT_URI是标识提供程序中数据的元素,因此,数据位置附加的ID是标识唯一记录的元素。

因此,以您的示例为例:

1)对于 Query ,正在使用UserDictionary.Words.CONTENT_URI返回此内容Uri地址下的所有记录。如果您只想返回一条已经知道其ID的特定记录,那么它也可以如下:

Uri uri = ContentUris.withAppendedId(Words.CONTENT_URI, id);
resolver.query(uri, projection, null, null, null); 

3)对于插入,由于该记录尚不存在,所以未使用任何ID。该操作要做的是在数据库中插入一条新记录,返回值将是新记录Uri,其中将包括新ID。

3)对于更新,附加的ID用于标识必须更新的特定记录。没有记录ID的情况下更新UserDictionary.Words.CONTENT_URI将导致所有记录的更新。

4)对于删除,您的示例将删除Words.WORD列的值为“ Zaphod”的所有记录,这可能导致0、1或多个记录被删除。 如果您只想删除1个知道其ID的特定记录,那么将是下一个:

Uri uri = ContentUris.withAppendedId(Words.CONTENT_URI, id);
resolver.delete(uri, null, null);

回答最后一个问题, Words.CONTENT_URI UserDictionary.Words.CONTENT_URI 之间没有区别。 UserDictionary 部分是一个限定符,如果已将其作为导入添加到java文件顶部,则可以将其删除,这样就不必一直都键入它,但最后两者实际上都是一样,没有区别。