public abstract class ContentProvider
extends Object
implements ComponentCallbacks2
java.lang.Object | |
↳ | android.content.ContentProvider |
Known Direct Subclasses |
内容提供者是Android应用程序的主要构建模块之一,为应用程序提供内容。 它们封装数据并通过单个ContentResolver
接口将其提供给应用程序。 只有在需要在多个应用程序之间共享数据时才需要内容提供者。 例如,联系人数据由多个应用程序使用,并且必须存储在内容提供商中。 如果您不需要在多个应用程序之间共享数据,则可以通过SQLiteDatabase
直接使用数据库。
当通过ContentResolver
发出请求时,系统检查给定URI的权限并将该请求传递给在该机构中注册的内容提供者。 内容提供者可以根据需要解释其余的URI。 UriMatcher
类有助于解析URI。
需要实施的主要方法是:
onCreate()
which is called to initialize the providerquery(Uri, String[], String, String[], String)
which returns data to the callerinsert(Uri, ContentValues)
which inserts new data into the content providerupdate(Uri, ContentValues, String, String[])
which updates existing data in the content providerdelete(Uri, String, String[])
which deletes data from the content providergetType(Uri)
which returns the MIME type of data in the content provider数据访问方法(如insert(Uri, ContentValues)
和update(Uri, ContentValues, String, String[])
)可能会同时从多个线程中调用,并且必须是线程安全的。 其他方法(如onCreate()
)只能从应用程序主线程中调用,并且必须避免执行冗长的操作。 请参阅方法描述以了解其预期的线程行为。
对 ContentResolver
请求会自动转发到相应的ContentProvider实例,因此子类不必担心跨进程调用的详细信息。
有关使用内容提供者的更多信息,请阅读 Content Providers开发人员指南。
Nested classes |
|
---|---|
interface |
ContentProvider.PipeDataWriter<T> 将数据流写入管道的接口。 |
Inherited constants |
---|
From interface android.content.ComponentCallbacks2
|
Public constructors |
|
---|---|
ContentProvider() 构建一个ContentProvider实例。 |
Public methods |
|
---|---|
ContentProviderResult[] |
applyBatch(ArrayList<ContentProviderOperation> operations) 重写此操作以处理执行一批操作的请求,或者默认实现将迭代操作并在每个操作上调用 |
void |
attachInfo(Context context, ProviderInfo info) 在被实例化之后,这被称为告诉内容提供者自己。 |
int |
bulkInsert(Uri uri, ContentValues[] values) 重写此操作以处理插入一组新行的请求,或者默认实现将迭代这些值并在其中每个值上调用 |
Bundle |
call(String method, String arg, Bundle extras) 调用提供者定义的方法。 |
Uri |
canonicalize(Uri url) 实现这一点,以支持引用您的内容提供者的URI的标准化。 |
abstract int |
delete(Uri uri, String selection, String[] selectionArgs) 实现这个来处理删除一行或多行的请求。 |
void |
dump(FileDescriptor fd, PrintWriter writer, String[] args) 将提供者的状态打印到给定的流中。 |
final String |
getCallingPackage() 返回在当前线程上发起正在处理的请求的调用方的包名称。 |
final Context |
getContext() 检索此提供程序运行的上下文。 |
final PathPermission[] |
getPathPermissions() 返回对此内容提供者进行读取和/或写入访问所需的基于路径的权限。 |
final String |
getReadPermission() 将只读访问所需权限的名称返回给此内容提供者。 |
String[] |
getStreamTypes(Uri uri, String mimeTypeFilter) 由客户端调用以确定此内容提供程序支持的给定URI的数据流类型。 |
abstract String |
getType(Uri uri) 实现这个来处理给定URI处的数据的MIME类型请求。 |
final String |
getWritePermission() 将读取/写入权限所需的权限的名称返回给此内容提供者。 |
abstract Uri |
insert(Uri uri, ContentValues values) 实现这个来处理插入新行的请求。 |
void |
onConfigurationChanged(Configuration newConfig) 设备配置在组件运行时发生更改时由系统调用。 此方法始终在应用程序主线程上调用,并且不得执行冗长的操作。 |
abstract boolean |
onCreate() 在启动时实现这个以初始化您的内容提供者。 |
void |
onLowMemory() 这在整个系统内存不足时调用,并且主动运行的进程应该修剪内存使用情况。 此方法始终在应用程序主线程上调用,并且不得执行冗长的操作。 |
void |
onTrimMemory(int level) 当操作系统确定进程从其进程中删除不需要的内存是一个好时机时调用。 |
AssetFileDescriptor |
openAssetFile(Uri uri, String mode, CancellationSignal signal) 这类似于 |
AssetFileDescriptor |
openAssetFile(Uri uri, String mode) 这类似于 |
ParcelFileDescriptor |
openFile(Uri uri, String mode, CancellationSignal signal) 重写这个来处理打开一个文件blob的请求。 |
ParcelFileDescriptor |
openFile(Uri uri, String mode) 重写这个来处理打开一个文件blob的请求。 |
<T> ParcelFileDescriptor |
openPipeHelper(Uri uri, String mimeType, Bundle opts, T args, PipeDataWriter<T> func) 用于实现 |
AssetFileDescriptor |
openTypedAssetFile(Uri uri, String mimeTypeFilter, Bundle opts) 由客户端调用以打开包含特定MIME类型数据的只读流。 |
AssetFileDescriptor |
openTypedAssetFile(Uri uri, String mimeTypeFilter, Bundle opts, CancellationSignal signal) 由客户端调用以打开包含特定MIME类型数据的只读流。 |
Cursor |
query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder, CancellationSignal cancellationSignal) 实现这个来处理来自客户端的查询请求,并支持取消。 |
abstract Cursor |
query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) 实现这个来处理来自客户端的查询请求。 |
void |
shutdown() 实现这个关闭ContentProvider实例。 |
Uri |
uncanonicalize(Uri url) 从以前由 |
abstract int |
update(Uri uri, ContentValues values, String selection, String[] selectionArgs) 实现这个来处理更新一行或多行的请求。 |
Protected methods |
|
---|---|
boolean |
isTemporary() 如果此实例是临时内容提供者,则返回true。 |
final ParcelFileDescriptor |
openFileHelper(Uri uri, String mode) 方便希望通过在给定URI处查找名为“ |
final void |
setPathPermissions(PathPermission[] permissions) 更改在内容提供者中读取和/或写入数据所需的基于路径的权限。 |
final void |
setReadPermission(String permission) 更改从内容提供者读取数据所需的权限。 |
final void |
setWritePermission(String permission) 更改在内容提供者中读取和写入数据所需的权限。 |
Inherited methods |
|
---|---|
From class java.lang.Object
|
|
From interface android.content.ComponentCallbacks2
|
|
From interface android.content.ComponentCallbacks
|
ContentProvider ()
构建一个ContentProvider实例。 内容提供者必须是declared in the manifest ,由ContentResolver
访问,并由系统自动创建,因此应用程序通常不直接创建ContentProvider实例。
在构建时,该对象未初始化,大多数字段和方法都不可用。 子类应该自行初始化为onCreate()
,而不是构造函数。
内容提供者在应用程序启动时在应用程序主线程上创建。 构造函数不能执行冗长的操作,否则应用程序启动将会延迟。
ContentProviderResult[] applyBatch (ArrayList<ContentProviderOperation> operations)
重写此操作以处理执行一批操作的请求,或者默认实现将迭代操作并在每个操作上调用apply(ContentProvider, ContentProviderResult[], int)
。 如果所有对apply(ContentProvider, ContentProviderResult[], int)
调用apply(ContentProvider, ContentProviderResult[], int)
成功,那么将会返回一个ContentProviderResult
数组,其元素数与操作数一样多。 如果有任何呼叫失败,则实施有多少个生效。 该方法可以从多个线程调用,如Processes and Threads中所述 。
Parameters | |
---|---|
operations |
ArrayList : the operations to apply |
Returns | |
---|---|
ContentProviderResult[] |
the results of the applications |
Throws | |
---|---|
OperationApplicationException |
thrown if any operation fails. |
void attachInfo (Context context, ProviderInfo info)
在被实例化之后,这被称为告诉内容提供者自己。
Parameters | |
---|---|
context |
Context : The context this provider is running in |
info |
ProviderInfo : Registered information about this content provider |
int bulkInsert (Uri uri, ContentValues[] values)
重写此操作以处理插入一组新行的请求,或者默认实现将迭代这些值并在每个值上调用insert(Uri, ContentValues)
。 作为礼节,插入后请拨打notifyChange()
。 该方法可以从多个线程中调用,如Processes and Threads中所述 。
Parameters | |
---|---|
uri |
Uri : The content:// URI of the insertion request. |
values |
ContentValues : An array of sets of column_name/value pairs to add to the database. This must not be null . |
Returns | |
---|---|
int |
The number of values that were inserted. |
Bundle call (String method, String arg, Bundle extras)
调用提供者定义的方法。 这可以用来实现对于类似表格的模型更便宜和/或不自然的接口。
警告:除了应用程序访问提供程序的基本功能外,框架不会对此内容提供程序中的条目进行权限检查。 例如,它不知道正在执行的调用是否可以读取或写入提供程序中的数据,因此无法强制执行这些单独的权限。 此方法的任何实现都必须对来电进行自己的权限检查,以确保它们被允许。
Parameters | |
---|---|
method |
String : method name to call. Opaque to framework, but should not be null . |
arg |
String : provider-defined String argument. May be null . |
extras |
Bundle : provider-defined Bundle argument. May be null . |
Returns | |
---|---|
Bundle |
provider-defined return value. May be null , which is also the default for providers which don't implement any call methods. |
Uri canonicalize (Uri url)
实现这一点,以支持引用您的内容提供者的URI的标准化。 规范化的URI是可以跨设备,备份/恢复和其他上下文传输的,并且仍然能够引用相同的数据项。 通常这是通过向URI添加查询参数来实现的,从而允许内容提供者验证传入的规范URI是否引用与最初预期相同的数据,如果不是,则查找该数据(如果存在)当前的环境。
例如,如果内容提供者拥有人,并且其中的普通URI通过行索引创建到该人员数据库中,则该可信表示可以在末尾具有附加查询参数,该参数指定了其预期的人的姓名。 稍后使用该URI调用提供程序将查找该URI的基本索引的行,如果它不匹配或其条目的名称与查询参数中的名称不匹配,请在其数据库上执行查询以查找正确的行进行操作。
如果您实现了对规范化URI的支持,则所有具有URI(包括这个URI)的传入调用都必须执行此验证并恢复其接收到的任何规范化URI。 另外,您还必须实现uncanonicalize(Uri)
以删除任何这些URI的规范化。
此方法的默认实现返回null,指示不支持规范URI。
Parameters | |
---|---|
url |
Uri : The Uri to canonicalize. |
Returns | |
---|---|
Uri |
Return the canonical representation of url, or null if canonicalization of that Uri is not supported. |
int delete (Uri uri, String selection, String[] selectionArgs)
实现这个来处理删除一行或多行的请求。 执行应该在执行删除时应用选择子句,从而允许操作影响目录中的多个行。 作为礼节,删除后请致电notifyChange()
。 该方法可以从多个线程中调用,如Processes and Threads中所述 。
如果特定的行被删除,该实现负责解析URI末尾的行ID。 也就是说,客户端将传入content://contacts/people/22
并且该实现负责在创建SQL语句时解析记录号(22)。
Parameters | |
---|---|
uri |
Uri : The full URI to query, including a row ID (if a specific record is requested). |
selection |
String : An optional restriction to apply to rows when deleting. |
selectionArgs |
String
|
Returns | |
---|---|
int |
The number of rows affected. |
Throws | |
---|---|
SQLException |
void dump (FileDescriptor fd, PrintWriter writer, String[] args)
将提供者的状态打印到给定的流中。 如果运行“adb shell dumpsys活动提供程序<provider_component_name>”,则会被调用。
Parameters | |
---|---|
fd |
FileDescriptor : The raw file descriptor that the dump is being sent to. |
writer |
PrintWriter : The PrintWriter to which you should dump your state. This will be closed for you after you return. |
args |
String : additional arguments to the dump request. |
String getCallingPackage ()
返回在当前线程上发起正在处理的请求的调用方的包名称。 返回的包将被验证属于主叫UID。 如果当前null
请求,则返回null
。
处理 getType(Uri)
或 getStreamTypes(Uri, String)
请求时,将始终返回 null
。
Returns | |
---|---|
String |
Throws | |
---|---|
SecurityException |
if the calling package doesn't belong to the calling UID. |
Context getContext ()
检索此提供程序运行的上下文。仅在调用 onCreate()
可用 - 这将在构造函数中返回 null
。
Returns | |
---|---|
Context |
PathPermission[] getPathPermissions ()
返回对此内容提供者进行读取和/或写入访问所需的基于路径的权限。 该方法可以从多个线程调用,如Processes and Threads中所述 。
Returns | |
---|---|
PathPermission[] |
String getReadPermission ()
将只读访问所需权限的名称返回给此内容提供者。 该方法可以从多个线程调用,如Processes and Threads中所述 。
Returns | |
---|---|
String |
String[] getStreamTypes (Uri uri, String mimeTypeFilter)
由客户端调用以确定此内容提供程序支持的给定URI的数据流类型。 默认实现返回null
,表示没有类型。 如果您的内容提供者存储特定类型的数据,则返回该MIME类型(如果它与给定的mimeTypeFilter匹配)。 如果它可以执行类型转换,则返回与mimeTypeFilter匹配的所有支持的MIME类型的数组。
Parameters | |
---|---|
uri |
Uri : The data in the content provider being queried. |
mimeTypeFilter |
String : The type of data the client desires. May be a pattern, such as */* to retrieve all possible data types. |
Returns | |
---|---|
String[] |
Returns null if there are no possible data streams for the given mimeTypeFilter. Otherwise returns an array of all available concrete MIME types. |
String getType (Uri uri)
实现这个来处理给定URI处的数据的MIME类型请求。 返回的MIME类型应以vnd.android.cursor.item
为单个记录vnd.android.cursor.dir/
,或vnd.android.cursor.dir/
为多个项目vnd.android.cursor.dir/
。 该方法可以从多个线程中调用,如Processes and Threads中所述 。
请注意,应用程序访问此信息不需要任何权限; 如果您的内容提供者需要读取和/或写入权限,或者未导出,则所有应用程序仍可以调用此方法,而不考虑其访问权限。 这允许他们在调度意图时检索URI的MIME类型。
Parameters | |
---|---|
uri |
Uri : the URI to query. |
Returns | |
---|---|
String |
a MIME type string, or null if there is no type. |
String getWritePermission ()
将读取/写入权限所需的权限的名称返回给此内容提供者。 该方法可以从多个线程中调用,如Processes and Threads中所述 。
Returns | |
---|---|
String |
Uri insert (Uri uri, ContentValues values)
实现这个来处理插入新行的请求。 作为礼节,插入后请致电notifyChange()
。 该方法可以从多个线程中调用,如Processes and Threads中所述 。
Parameters | |
---|---|
uri |
Uri : The content:// URI of the insertion request. This must not be null . |
values |
ContentValues : A set of column_name/value pairs to add to the database. This must not be null . |
Returns | |
---|---|
Uri |
The URI for the newly inserted item. |
void onConfigurationChanged (Configuration newConfig)
设备配置在组件运行时发生更改时由系统调用。 请注意,与活动不同,当配置更改时,其他组件不会重新启动:它们必须始终处理更改的结果,例如通过重新获取资源。
在调用此函数时,您的Resources对象将被更新为返回与新配置相匹配的资源值。
欲了解更多信息,请阅读Handling Runtime Changes 。 此方法始终在应用程序主线程上调用,并且不得执行冗长的操作。
默认的内容提供者实现什么都不做。 重写此方法以采取适当的操作。 (内容提供者通常不关心屏幕方向等内容,但可能想知道区域设置更改。)
Parameters | |
---|---|
newConfig |
Configuration : The new device configuration. |
boolean onCreate ()
在启动时实现这个以初始化您的内容提供者。 在应用程序启动时,应用程序主线程上的所有注册内容提供者都会调用此方法。 它不能执行冗长的操作,否则应用程序启动将会延迟。
你应该推迟平凡的初始化(如打开,升级和扫描数据库),直到使用内容提供商(通过query(Uri, String[], String, String[], String)
, insert(Uri, ContentValues)
,等等)。 延迟初始化可以使应用程序快速启动,避免不必要的工作(如果提供程序不需要),并停止数据库错误(如完整磁盘)停止应用程序启动。
如果您使用SQLite, SQLiteOpenHelper
是一个有用的实用程序类,可以轻松管理数据库,并会在首次使用前自动推迟打开。 如果确实使用SQLiteOpenHelper,请确保避免使用此方法调用getReadableDatabase()
或getWritableDatabase()
。 (相反,覆盖onOpen(SQLiteDatabase)
以在数据库第一次打开时对其进行初始化。)
Returns | |
---|---|
boolean |
true if the provider was successfully loaded, false otherwise |
void onLowMemory ()
这在整个系统内存不足时调用,并且主动运行的进程应该修剪内存使用情况。 虽然没有定义它的确切位置,但通常会在所有后台进程都被终止时发生。 也就是说,在达到托管服务和前台UI的杀死进程之前,我们希望避免杀死。
你应该实现这个方法来释放你可能持有的任何缓存或其他不必要的资源。 系统将从此方法返回后为您执行垃圾回收。
优选地,您应该从ComponentCallbacks2
实施onTrimMemory(int)
,以基于不同级别的内存需求逐步卸载资源。 该API可用于API级别14和更高的,所以你应该只使用这个onLowMemory()
方法,旧版本的回退,可以治疗一样onTrimMemory(int)
与TRIM_MEMORY_COMPLETE
水平。
默认的内容提供者实现什么都不做。 子类可以重写此方法以采取适当的操作。
void onTrimMemory (int level)
当操作系统确定进程从其进程中删除不需要的内存是一个好时机时调用。 例如,当它进入后台并且没有足够的内存来保持尽可能多的后台进程运行时,会发生这种情况。 您不应该与级别的确切值进行比较,因为可能会添加新的中间值 - 如果值大于或等于您感兴趣的级别,通常需要比较。
要在任何点检索处理当前修剪水平,可以使用 ActivityManager.getMyMemoryState(RunningAppProcessInfo)
。
Parameters | |
---|---|
level |
int : The context of the trim, giving a hint of the amount of trimming the application may like to perform. May be TRIM_MEMORY_COMPLETE , TRIM_MEMORY_MODERATE , TRIM_MEMORY_BACKGROUND , TRIM_MEMORY_UI_HIDDEN , TRIM_MEMORY_RUNNING_CRITICAL , TRIM_MEMORY_RUNNING_LOW , or TRIM_MEMORY_RUNNING_MODERATE . |
AssetFileDescriptor openAssetFile (Uri uri, String mode, CancellationSignal signal)
这类似于openFile(Uri, String)
,但可以由需要能够返回文件子部分的提供者实现,这些文件通常是.apk中的资源。 此方法可以从多个线程调用,如Processes and Threads中所述 。
如果你实现这个,你的客户必须能够处理这种文件切片,或者直接使用 openAssetFileDescriptor(Uri, String)
,或者使用更高级别的 ContentResolver.openInputStream
或 ContentResolver.openOutputStream
方法。
返回的AssetFileDescriptor可以是管道或套接字对,以启用数据流式传输。
如果要实现此操作以返回完整文件,则应该创建 UNKNOWN_LENGTH
的AssetFileDescriptor以与无法处理文件子部分的应用程序兼容。
要在Intents中使用,您需要实现getType(Uri)
以返回此处使用相同URI返回的数据的适当MIME类型。 这将允许意图解决方案自动确定数据MIME类型,并选择适当的匹配目标作为其操作的一部分。
为了更好地与其他应用程序互操作,建议对于可以打开的任何URI,还支持对其至少包含由 OpenableColumns
指定的列的 OpenableColumns
。
Parameters | |
---|---|
uri |
Uri : The URI whose file is to be opened. |
mode |
String : Access mode for the file. May be "r" for read-only access, "w" for write-only access (erasing whatever data is currently in the file), "wa" for write-only access to append to any existing data, "rw" for read and write access on any existing data, and "rwt" for read and write access that truncates any existing file. |
signal |
CancellationSignal : A signal to cancel the operation in progress, or null if none. For example, if you are downloading a file from the network to service a "rw" mode request, you should periodically call throwIfCanceled() to check whether the client has canceled the request and abort the download. |
Returns | |
---|---|
AssetFileDescriptor |
Returns a new AssetFileDescriptor which you can use to access the file. |
Throws | |
---|---|
FileNotFoundException |
Throws FileNotFoundException if there is no file associated with the given URI or the mode is invalid. |
SecurityException |
Throws SecurityException if the caller does not have permission to access the file. |
AssetFileDescriptor openAssetFile (Uri uri, String mode)
这类似于openFile(Uri, String)
,但可以由需要能够返回文件子部分的提供者实现,这些文件通常是.apk中的资源。 此方法可以从多个线程中调用,如Processes and Threads中所述 。
如果你实现这个,你的客户必须能够直接使用 openAssetFileDescriptor(Uri, String)
或使用更高级别的 ContentResolver.openInputStream
或 ContentResolver.openOutputStream
方法来处理这种文件切片。
返回的AssetFileDescriptor可以是管道或套接字对,以启用数据流式传输。
如果您正在实现此操作以返回完整文件,则应创建 UNKNOWN_LENGTH
的AssetFileDescriptor以与无法处理文件子部分的应用程序兼容。
为了在Intents中使用,您需要实现getType(Uri)
以返回此处使用相同URI返回的数据的适当MIME类型。 这将允许意图解决方案自动确定数据MIME类型,并选择适当的匹配目标作为其操作的一部分。
为了更好地与其他应用程序互操作,建议对于可以打开的任何URI,还支持对其至少包含由 OpenableColumns
指定的列的 OpenableColumns
。
Parameters | |
---|---|
uri |
Uri : The URI whose file is to be opened. |
mode |
String : Access mode for the file. May be "r" for read-only access, "w" for write-only access (erasing whatever data is currently in the file), "wa" for write-only access to append to any existing data, "rw" for read and write access on any existing data, and "rwt" for read and write access that truncates any existing file. |
Returns | |
---|---|
AssetFileDescriptor |
Returns a new AssetFileDescriptor which you can use to access the file. |
Throws | |
---|---|
FileNotFoundException |
Throws FileNotFoundException if there is no file associated with the given URI or the mode is invalid. |
SecurityException |
Throws SecurityException if the caller does not have permission to access the file. |
ParcelFileDescriptor openFile (Uri uri, String mode, CancellationSignal signal)
重写这个来处理打开一个文件blob的请求。 默认实现总是抛出FileNotFoundException
。 此方法可以从多个线程调用,如Processes and Threads中所述 。
这个方法返回一个ParcelFileDescriptor,它直接返回给调用者。 这样可以在不复制内容的情况下返回大量数据(如图像和文档)。
返回的ParcelFileDescriptor由调用者拥有,因此他们有责任在完成时关闭它。 也就是说,这个方法的实现应该为每个调用创建一个新的ParcelFileDescriptor。
如果以独有的“r”或“w”模式打开,返回的ParcelFileDescriptor可以是管道或套接字对,以启用数据流式传输。 以“rw”或“rwt”模式打开意味着磁盘上的文件支持查找。
如果您需要检测什么时候回来ParcelFileDescriptor已经关闭,或者远程进程崩溃或出现了其他错误,你可以使用 open(File, int, android.os.Handler, android.os.ParcelFileDescriptor.OnCloseListener)
, createReliablePipe()
,或 createReliableSocketPair()
。
为了在Intents中使用,您需要实现getType(Uri)
以返回此处使用相同URI返回的数据的适当MIME类型。 这将允许意图解决方案自动确定数据MIME类型,并选择适当的匹配目标作为其操作的一部分。
为了更好地与其他应用程序互操作,建议对于可以打开的任何URI,还支持至少包含由OpenableColumns
指定的列的OpenableColumns
。 如果您需要提供其他元数据,则可能还需要支持其他常用列,例如DATE_ADDED
中的MediaStore.MediaColumns
。
Parameters | |
---|---|
uri |
Uri : The URI whose file is to be opened. |
mode |
String : Access mode for the file. May be "r" for read-only access, "w" for write-only access, "rw" for read and write access, or "rwt" for read and write access that truncates any existing file. |
signal |
CancellationSignal : A signal to cancel the operation in progress, or null if none. For example, if you are downloading a file from the network to service a "rw" mode request, you should periodically call throwIfCanceled() to check whether the client has canceled the request and abort the download. |
Returns | |
---|---|
ParcelFileDescriptor |
Returns a new ParcelFileDescriptor which you can use to access the file. |
Throws | |
---|---|
FileNotFoundException |
Throws FileNotFoundException if there is no file associated with the given URI or the mode is invalid. |
SecurityException |
Throws SecurityException if the caller does not have permission to access the file. |
ParcelFileDescriptor openFile (Uri uri, String mode)
重写这个来处理打开一个文件blob的请求。 默认实现总是抛出FileNotFoundException
。 该方法可以从多个线程中调用,如Processes and Threads中所述 。
这个方法返回一个ParcelFileDescriptor,它直接返回给调用者。 这样可以在不复制内容的情况下返回大量数据(如图像和文档)。
返回的ParcelFileDescriptor由调用者拥有,因此他们有责任在完成时关闭它。 也就是说,这个方法的实现应该为每个调用创建一个新的ParcelFileDescriptor。
如果以独有的“r”或“w”模式打开,返回的ParcelFileDescriptor可以是管道或套接字对,以启用数据流式传输。 以“rw”或“rwt”模式打开意味着磁盘上的文件支持查找。
如果您需要检测什么时候回来ParcelFileDescriptor已经关闭,或者远程进程崩溃或出现了其他错误,你可以使用 open(File, int, android.os.Handler, android.os.ParcelFileDescriptor.OnCloseListener)
, createReliablePipe()
,或 createReliableSocketPair()
。
为了在Intents中使用,您需要实现getType(Uri)
以返回此处使用相同URI返回的数据的适当MIME类型。 这将允许意图解决方案自动确定数据MIME类型,并选择适当的匹配目标作为其操作的一部分。
为了更好地与其他应用程序互操作,建议对于可以打开的任何URI,还支持对其至少包含由OpenableColumns
指定的列的OpenableColumns
。 如果您需要提供其他元数据,则可能还需要支持其他常用列,例如DATE_ADDED
中的MediaStore.MediaColumns
。
Parameters | |
---|---|
uri |
Uri : The URI whose file is to be opened. |
mode |
String : Access mode for the file. May be "r" for read-only access, "rw" for read and write access, or "rwt" for read and write access that truncates any existing file. |
Returns | |
---|---|
ParcelFileDescriptor |
Returns a new ParcelFileDescriptor which you can use to access the file. |
Throws | |
---|---|
FileNotFoundException |
Throws FileNotFoundException if there is no file associated with the given URI or the mode is invalid. |
SecurityException |
Throws SecurityException if the caller does not have permission to access the file. |
ParcelFileDescriptor openPipeHelper (Uri uri, String mimeType, Bundle opts, T args, PipeDataWriter<T> func)
用于实现openTypedAssetFile(Uri, String, Bundle)
辅助函数,用于创建数据管道和后台线程,允许您将生成的数据传输回客户端。 这个函数返回一个新的ParcelFileDescriptor,它应该返回给调用者(调用者负责关闭它)。
Parameters | |
---|---|
uri |
Uri : The URI whose data is to be written. |
mimeType |
String : The desired type of data to be written. |
opts |
Bundle : Options supplied by caller. |
args |
T : Your own custom arguments. |
func |
PipeDataWriter : Interface implementing the function that will actually stream the data. |
Returns | |
---|---|
ParcelFileDescriptor |
Returns a new ParcelFileDescriptor holding the read side of the pipe. This should be returned to the caller for reading; the caller is responsible for closing it when done. |
Throws | |
---|---|
FileNotFoundException |
AssetFileDescriptor openTypedAssetFile (Uri uri, String mimeTypeFilter, Bundle opts)
由客户端调用以打开包含特定MIME类型数据的只读流。 这就像openAssetFile(Uri, String)
,除了文件只能是只读的,内容提供者可以执行数据转换来生成所需类型的数据。
默认实现将给定的mimeType与 getType(Uri)
的结果进行 getType(Uri)
,如果它们匹配,则只需调用 openAssetFile(Uri, String)
。
有关此方法的使用和实施示例,请参见 ClipData
。
返回的AssetFileDescriptor可以是管道或套接字对,以启用数据流式传输。
为了更好地与其他应用程序互操作,建议对于可以打开的任何URI,还支持对其至少包含由OpenableColumns
指定的列的OpenableColumns
。 如果您需要提供其他元数据(如DATE_ADDED
中的MediaStore.MediaColumns
,则可能还需要支持其他常用列。
Parameters | |
---|---|
uri |
Uri : The data in the content provider being queried. |
mimeTypeFilter |
String : The type of data the client desires. May be a pattern, such as */*, if the caller does not have specific type requirements; in this case the content provider will pick its best type matching the pattern. |
opts |
Bundle : Additional options from the client. The definitions of these are specific to the content provider being called. |
Returns | |
---|---|
AssetFileDescriptor |
Returns a new AssetFileDescriptor from which the client can read data of the desired type. |
Throws | |
---|---|
FileNotFoundException |
Throws FileNotFoundException if there is no file associated with the given URI or the mode is invalid. |
SecurityException |
Throws SecurityException if the caller does not have permission to access the data. |
IllegalArgumentException |
Throws IllegalArgumentException if the content provider does not support the requested MIME type. |
AssetFileDescriptor openTypedAssetFile (Uri uri, String mimeTypeFilter, Bundle opts, CancellationSignal signal)
由客户端调用以打开包含特定MIME类型数据的只读流。 这与openAssetFile(Uri, String)
,只是文件只能是只读的,内容提供者可以执行数据转换以生成所需类型的数据。
默认实现将给定的mimeType与 getType(Uri)
的结果进行 getType(Uri)
,如果它们匹配,则简单地调用 openAssetFile(Uri, String)
。
有关此方法的使用和实施示例,请参见 ClipData
。
返回的AssetFileDescriptor可以是管道或套接字对,以启用数据流式传输。
为了更好地与其他应用程序互操作,建议对于可以打开的任何URI,还支持对其至少包含由OpenableColumns
指定的列的OpenableColumns
。 如果您需要提供其他元数据,则可能还需要支持其他常用列,例如DATE_ADDED
中的MediaStore.MediaColumns
。
Parameters | |
---|---|
uri |
Uri : The data in the content provider being queried. |
mimeTypeFilter |
String : The type of data the client desires. May be a pattern, such as */*, if the caller does not have specific type requirements; in this case the content provider will pick its best type matching the pattern. |
opts |
Bundle : Additional options from the client. The definitions of these are specific to the content provider being called. |
signal |
CancellationSignal : A signal to cancel the operation in progress, or null if none. For example, if you are downloading a file from the network to service a "rw" mode request, you should periodically call throwIfCanceled() to check whether the client has canceled the request and abort the download. |
Returns | |
---|---|
AssetFileDescriptor |
Returns a new AssetFileDescriptor from which the client can read data of the desired type. |
Throws | |
---|---|
FileNotFoundException |
Throws FileNotFoundException if there is no file associated with the given URI or the mode is invalid. |
SecurityException |
Throws SecurityException if the caller does not have permission to access the data. |
IllegalArgumentException |
Throws IllegalArgumentException if the content provider does not support the requested MIME type. |
Cursor query (Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder, CancellationSignal cancellationSignal)
实现这个来处理来自客户端的查询请求,并支持取消。 此方法可以从多个线程调用,如Processes and Threads中所述 。
客户呼叫示例:
// Request a specific record. Cursor managedCursor = managedQuery( ContentUris.withAppendedId(Contacts.People.CONTENT_URI, 2), projection, // Which columns to return. null, // WHERE clause. null, // WHERE clause value substitution People.NAME + " ASC"); // Sort order.Example implementation:
// SQLiteQueryBuilder is a helper class that creates the // proper SQL syntax for us. SQLiteQueryBuilder qBuilder = new SQLiteQueryBuilder(); // Set the table we're querying. qBuilder.setTables(DATABASE_TABLE_NAME); // If the query ends in a specific record number, we're // being asked for a specific record, so set the // WHERE clause in our query. if((URI_MATCHER.match(uri)) == SPECIFIC_MESSAGE){ qBuilder.appendWhere("_id=" + uri.getPathLeafId()); } // Make the query. Cursor c = qBuilder.query(mDb, projection, selection, selectionArgs, groupBy, having, sortOrder); c.setNotificationUri(getContext().getContentResolver(), uri); return c;
如果您实现此方法,则还必须实现不取消取消信号的版本 query(Uri, String[], String, String[], String)
,以确保在旧版Android Framework的正确操作中,取消信号过载不可用。
Parameters | |
---|---|
uri |
Uri : The URI to query. This will be the full URI sent by the client; if the client is requesting a specific record, the URI will end in a record number that the implementation should parse and add to a WHERE or HAVING clause, specifying that _id value. |
projection |
String : The list of columns to put into the cursor. If null all columns are included. |
selection |
String : A selection criteria to apply when filtering rows. If null then all rows are included. |
selectionArgs |
String : You may include ?s in selection, which will be replaced by the values from selectionArgs, in order that they appear in the selection. The values will be bound as Strings. |
sortOrder |
String : How the rows in the cursor should be sorted. If null then the provider is free to define the sort order. |
cancellationSignal |
CancellationSignal : A signal to cancel the operation in progress, or null if none. If the operation is canceled, then OperationCanceledException will be thrown when the query is executed. |
Returns | |
---|---|
Cursor |
a Cursor or null . |
Cursor query (Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
实现这个来处理来自客户端的查询请求。 该方法可以从多个线程调用,如Processes and Threads中所述 。
客户呼叫示例:
// Request a specific record. Cursor managedCursor = managedQuery( ContentUris.withAppendedId(Contacts.People.CONTENT_URI, 2), projection, // Which columns to return. null, // WHERE clause. null, // WHERE clause value substitution People.NAME + " ASC"); // Sort order.Example implementation:
// SQLiteQueryBuilder is a helper class that creates the // proper SQL syntax for us. SQLiteQueryBuilder qBuilder = new SQLiteQueryBuilder(); // Set the table we're querying. qBuilder.setTables(DATABASE_TABLE_NAME); // If the query ends in a specific record number, we're // being asked for a specific record, so set the // WHERE clause in our query. if((URI_MATCHER.match(uri)) == SPECIFIC_MESSAGE){ qBuilder.appendWhere("_id=" + uri.getPathLeafId()); } // Make the query. Cursor c = qBuilder.query(mDb, projection, selection, selectionArgs, groupBy, having, sortOrder); c.setNotificationUri(getContext().getContentResolver(), uri); return c;
Parameters | |
---|---|
uri |
Uri : The URI to query. This will be the full URI sent by the client; if the client is requesting a specific record, the URI will end in a record number that the implementation should parse and add to a WHERE or HAVING clause, specifying that _id value. |
projection |
String : The list of columns to put into the cursor. If null all columns are included. |
selection |
String : A selection criteria to apply when filtering rows. If null then all rows are included. |
selectionArgs |
String : You may include ?s in selection, which will be replaced by the values from selectionArgs, in order that they appear in the selection. The values will be bound as Strings. |
sortOrder |
String : How the rows in the cursor should be sorted. If null then the provider is free to define the sort order. |
Returns | |
---|---|
Cursor |
a Cursor or null . |
void shutdown ()
实现这个关闭ContentProvider实例。 然后你可以在单元测试中调用这个方法。
Android通常会自动处理ContentProvider的启动和关闭。 您不需要启动或关闭ContentProvider。 但是,当您在ContentProvider上调用测试方法时,即使后续测试实例化另一个ContentProvider,ContentProvider实例也会启动并在测试完成后继续运行。 由于这两个实例通常针对相同的基础数据源(例如,一个sqlite数据库)运行,所以会发生冲突。
实现shutDown()通过提供终止ContentProvider的方法来避免这种冲突。 此方法还可以防止ContentProvider的多个实例存在内存泄漏,并且可以通过在完成下一个测试之前完全清理测试夹具来确保单元测试隔离。
Uri uncanonicalize (Uri url)
从以前由canonicalize(Uri)
返回的规范化URI中删除规范化。 例如,如果你的实现是添加一个查询参数来规范一个URI,那么这个方法可以简单地将这个URI上的任何查询参数传递出去。 默认实现总是返回传入的相同url 。
Parameters | |
---|---|
url |
Uri : The Uri to remove any canonicalization from. |
Returns | |
---|---|
Uri |
Return the non-canonical representation of url, return the url as-is if there is nothing to do, or return null if the data identified by the canonical representation can not be found in the current environment. |
int update (Uri uri, ContentValues values, String selection, String[] selectionArgs)
实现这个来处理更新一行或多行的请求。 实现应该更新与选择相匹配的所有行,以根据提供的值映射设置列。 为了礼貌,更新后请致电notifyChange()
。 该方法可以从多个线程中调用,如Processes and Threads中所述 。
Parameters | |
---|---|
uri |
Uri : The URI to query. This can potentially have a record ID if this is an update request for a specific record. |
values |
ContentValues : A set of column_name/value pairs to update in the database. This must not be null . |
selection |
String : An optional filter to match rows to update. |
selectionArgs |
String
|
Returns | |
---|---|
int |
the number of rows affected. |
boolean isTemporary ()
如果此实例是临时内容提供者,则返回true。
Returns | |
---|---|
boolean |
true if this instance is a temporary content provider |
ParcelFileDescriptor openFileHelper (Uri uri, String mode)
方便希望实现 openFile(Uri, String)
的子类,方法是在给定的URI处查找名为“ openFile(Uri, String)
”的列。
Parameters | |
---|---|
uri |
Uri : The URI to be opened. |
mode |
String : The file mode. May be "r" for read-only access, "w" for write-only access (erasing whatever data is currently in the file), "wa" for write-only access to append to any existing data, "rw" for read and write access on any existing data, and "rwt" for read and write access that truncates any existing file. |
Returns | |
---|---|
ParcelFileDescriptor |
Returns a new ParcelFileDescriptor that can be used by the client to access the file. |
Throws | |
---|---|
FileNotFoundException |
void setPathPermissions (PathPermission[] permissions)
更改在内容提供者中读取和/或写入数据所需的基于路径的权限。 这通常是在首次创建提供程序时从其清单信息中为您设置的。
Parameters | |
---|---|
permissions |
PathPermission : Array of path permission descriptions. |
void setReadPermission (String permission)
更改从内容提供者读取数据所需的权限。 这通常是在首次创建提供程序时从其清单信息中为您设置的。
Parameters | |
---|---|
permission |
String : Name of the permission required for read-only access. |
void setWritePermission (String permission)
更改在内容提供者中读取和写入数据所需的权限。 这通常是在首次创建提供程序时从其清单信息中为您设置的。
Parameters | |
---|---|
permission |
String : Name of the permission required for read/write access. |