我是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 ?
答案 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文件顶部,则可以将其删除,这样就不必一直都键入它,但最后两者实际上都是一样,没有区别。