Methods Summary |
---|
public void | attachInfo(Context context, android.content.pm.ProviderInfo info)After being instantiated, this is called to tell the content provider
about itself.
/*
* Only allow it to be set once, so after the content service gives
* this to us clients can't change it.
*/
if (mContext == null) {
mContext = context;
if (info != null) {
setReadPermission(info.readPermission);
setWritePermission(info.writePermission);
}
ContentProvider.this.onCreate();
}
|
public int | bulkInsert(android.net.Uri uri, ContentValues[] values)Implement this to insert a set of new rows, or the default implementation will
iterate over the values and call {@link #insert} on each of them.
As a courtesy, call {@link ContentResolver#notifyChange(android.net.Uri ,android.database.ContentObserver) notifyChange()}
after inserting.
This method can be called from multiple
threads, as described in
Application Fundamentals:
Processes and Threads.
int numValues = values.length;
for (int i = 0; i < numValues; i++) {
insert(uri, values[i]);
}
return numValues;
|
public static android.content.ContentProvider | coerceToLocalContentProvider(IContentProvider abstractInterface)Given an IContentProvider, try to coerce it back to the real
ContentProvider object if it is running in the local process. This can
be used if you know you are running in the same process as a provider,
and want to get direct access to its implementation details. Most
clients should not nor have a reason to use it.
if (abstractInterface instanceof Transport) {
return ((Transport)abstractInterface).getContentProvider();
}
return null;
|
public abstract int | delete(android.net.Uri uri, java.lang.String selection, java.lang.String[] selectionArgs)A request to delete one or more rows. The selection clause is applied when performing
the deletion, allowing the operation to affect multiple rows in a
directory.
As a courtesy, call {@link ContentResolver#notifyChange(android.net.Uri ,android.database.ContentObserver) notifyDelete()}
after deleting.
This method can be called from multiple
threads, as described in
Application Fundamentals:
Processes and Threads.
The implementation is responsible for parsing out a row ID at the end
of the URI, if a specific row is being deleted. That is, the client would
pass in content://contacts/people/22 and the implementation is
responsible for parsing the record number (22) when creating a SQL statement.
|
public final Context | getContext()Retrieve the Context this provider is running in. Only available once
onCreate(Map icicle) has been called -- this will be null in the
constructor.
return mContext;
|
public IContentProvider | getIContentProvider()Returns the Binder object for this provider.
return mTransport;
|
public final java.lang.String | getReadPermission()Return the name of the permission required for read-only access to
this content provider. This method can be called from multiple
threads, as described in
Application Fundamentals:
Processes and Threads.
return mReadPermission;
|
public SyncAdapter | getSyncAdapter()Get the sync adapter that is to be used by this content provider.
This is intended for use by the sync system. If null then this
content provider is considered not syncable.
This method can be called from multiple
threads, as described in
Application Fundamentals:
Processes and Threads.
return null;
|
public abstract java.lang.String | getType(android.net.Uri uri)Return the MIME type of the data at the given URI. This should start with
vnd.android.cursor.item for a single record,
or vnd.android.cursor.dir/ for multiple items.
This method can be called from multiple
threads, as described in
Application Fundamentals:
Processes and Threads.
|
public final java.lang.String | getWritePermission()Return the name of the permission required for read/write access to
this content provider. This method can be called from multiple
threads, as described in
Application Fundamentals:
Processes and Threads.
return mWritePermission;
|
public abstract android.net.Uri | insert(android.net.Uri uri, ContentValues values)Implement this to insert a new row.
As a courtesy, call {@link ContentResolver#notifyChange(android.net.Uri ,android.database.ContentObserver) notifyChange()}
after inserting.
This method can be called from multiple
threads, as described in
Application Fundamentals:
Processes and Threads.
|
protected boolean | isTemporary()Returns true if this instance is a temporary content provider.
return false;
|
public void | onConfigurationChanged(android.content.res.Configuration newConfig)
|
public abstract boolean | onCreate()Called when the provider is being started.
|
public void | onLowMemory()
|
public android.content.res.AssetFileDescriptor | openAssetFile(android.net.Uri uri, java.lang.String mode)This is like {@link #openFile}, but can be implemented by providers
that need to be able to return sub-sections of files, often assets
inside of their .apk. Note that when implementing this your clients
must be able to deal with such files, either directly with
{@link ContentResolver#openAssetFileDescriptor
ContentResolver.openAssetFileDescriptor}, or by using the higher-level
{@link ContentResolver#openInputStream ContentResolver.openInputStream}
or {@link ContentResolver#openOutputStream ContentResolver.openOutputStream}
methods.
Note: if you are implementing this to return a full file, you
should create the AssetFileDescriptor with
{@link AssetFileDescriptor#UNKNOWN_LENGTH} to be compatible with
applications that can not handle sub-sections of files.
ParcelFileDescriptor fd = openFile(uri, mode);
return fd != null ? new AssetFileDescriptor(fd, 0, -1) : null;
|
public android.os.ParcelFileDescriptor | openFile(android.net.Uri uri, java.lang.String mode)Open a file blob associated with a content URI.
This method can be called from multiple
threads, as described in
Application Fundamentals:
Processes and Threads.
Returns a
ParcelFileDescriptor, from which you can obtain a
{@link java.io.FileDescriptor} for use with
{@link java.io.FileInputStream}, {@link java.io.FileOutputStream}, etc.
This can be used to store large data (such as an image) associated with
a particular piece of content.
The returned ParcelFileDescriptor is owned by the caller, so it is
their responsibility to close it when done. That is, the implementation
of this method should create a new ParcelFileDescriptor for each call.
throw new FileNotFoundException("No files supported by provider at "
+ uri);
|
protected final android.os.ParcelFileDescriptor | openFileHelper(android.net.Uri uri, java.lang.String mode)Convenience for subclasses that wish to implement {@link #openFile}
by looking up a column named "_data" at the given URI.
Cursor c = query(uri, new String[]{"_data"}, null, null, null);
int count = (c != null) ? c.getCount() : 0;
if (count != 1) {
// If there is not exactly one result, throw an appropriate
// exception.
if (c != null) {
c.close();
}
if (count == 0) {
throw new FileNotFoundException("No entry for " + uri);
}
throw new FileNotFoundException("Multiple items at " + uri);
}
c.moveToFirst();
int i = c.getColumnIndex("_data");
String path = (i >= 0 ? c.getString(i) : null);
c.close();
if (path == null) {
throw new FileNotFoundException("Column _data not found.");
}
int modeBits = ContentResolver.modeToMode(uri, mode);
return ParcelFileDescriptor.open(new File(path), modeBits);
|
public abstract android.database.Cursor | query(android.net.Uri uri, java.lang.String[] projection, java.lang.String selection, java.lang.String[] selectionArgs, java.lang.String sortOrder)Receives a query request from a client in a local process, and
returns a Cursor. This is called internally by the {@link ContentResolver}.
This method can be called from multiple
threads, as described in
Application Fundamentals:
Processes and Threads.
Example client call:
// Request a specific record.
Cursor managedCursor = managedQuery(
Contacts.People.CONTENT_URI.addId(2),
projection, // Which columns to return.
null, // WHERE clause.
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;
|
protected final void | setReadPermission(java.lang.String permission)Change the permission required to read data from the content
provider. This is normally set for you from its manifest information
when the provider is first created.
mReadPermission = permission;
|
protected final void | setWritePermission(java.lang.String permission)Change the permission required to read and write data in the content
provider. This is normally set for you from its manifest information
when the provider is first created.
mWritePermission = permission;
|
public abstract int | update(android.net.Uri uri, ContentValues values, java.lang.String selection, java.lang.String[] selectionArgs)Update a content URI. All rows matching the optionally provided selection
will have their columns listed as the keys in the values map with the
values of those keys.
As a courtesy, call {@link ContentResolver#notifyChange(android.net.Uri ,android.database.ContentObserver) notifyChange()}
after updating.
This method can be called from multiple
threads, as described in
Application Fundamentals:
Processes and Threads.
|