Custom ContentProvider
———-
The content provider is used to deal with data sources, while the content parser (ContentResolver) responsible for operating the specific content provider. The data source can be a file or database. More content resolver can simultaneously access the content provider because it is thread-safe .
A URI can identify a resource, and a content provider can have multiple URI. But all the same URI of the AUTHORITY.
Android no shared memory, so to access data from another process must be through the content provider to operate the device.

1. Inheritance ContentProvider, and override all abstract methods.
Android OS automatically call ContentProvider of onCreate () method, while the database is on-demand enabled.

2. Configuration AndroidManifest.xml
<provider android: authorities = "tl.android.provider.bookprovider"
android: name = "tl.android.data.TestContentProvider">
</ provider>

name: Specifies ContentProvider subclass the full class path.
authorities: the specified ContentProvider unique identification (recommended: company name. provider. data table + provider)

3. For the content provider defines various constants.
CONTENT_URI
TABLE_NAME
DATABASE_NAME
DATABASE_VERSION

4. ContentResolver inserting data record by

5. To obtain the generated database and view
*. db directory databases in the application of generally under.
For example:
/ data / data / tl.android.apps / databases / books.db

Copy Database to C:
adb pull / data / data / tl.android.apps / databases / books.db c:

Will be generated books.db drag sqlite3.exe (in the Android SDK tools directory)

View database tables
. tables

See the specific form
select * from table_name;

Specific reference code:
TestContentProvider.java

 package tl.android.data; import java.util.HashMap; import tl.android.data.TestContentProviderMetaData.BookTableMetaData; import android.content.ContentProvider; import android.content.ContentResolver; import android.content.ContentUris; import android.content . ContentValues; import android.content.Context; import android.content.UriMatcher; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteQueryBuilder; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.net.Uri; import android.provider.BaseColumns; import android.text.TextUtils; import android.util.Log; public class TestContentProvider extends ContentProvider (public static final String TAG = &quot;amos_tl&quot;; public DatabaseHelper openHelper = null; / / - Create table column names and JavaBean map. public static HashMap &lt;String, String&gt; sBookProjectionMap = null; static (sBookProjectionMap = new HashMap &lt; String, String&gt; (); sBookProjectionMap.put (BookTableMetaData._ID, BookTableMetaData._ID); sBookProjectionMap.put (BookTableMetaData.BOOK_NAME, BookTableMetaData.BOOK_NAME); sBookProjectionMap.put (BookTableMetaData.BOOK_ISBN, BookTableMetaData.BOOK_ISBN); sBookProjectionMap.put ( BookTableMetaData.BOOK_AUTHOR, BookTableMetaData.BOOK_AUTHOR); sBookProjectionMap.put (BookTableMetaData.CREATED_DATE, BookTableMetaData.CREATED_DATE); sBookProjectionMap.put (BookTableMetaData.MODIFIED_DATE, BookTableMetaData.MODIFIED_DATE);) / / - create the best match URI device private static UriMatcher sUriMatcher = null; / / - registered URI request type private static final int INCOMMING_BOOK_COLLECTION_URI_INDICATOR = 1; private static final int INCOMMING_SINGLE_BOOK_URI_INDICATOR = 2; static (sUriMatcher = new UriMatcher (UriMatcher.NO_MATCH); sUriMatcher.addURI (TestContentProviderMetaData.AUTHORITY, &quot;books&quot; , INCOMMING_BOOK_COLLECTION_URI_INDICATOR); sUriMatcher.addURI (TestContentProviderMetaData.AUTHORITY, &quot;books / #&quot;, INCOMMING_SINGLE_BOOK_URI_INDICATOR);) @ Overridepublic int delete (Uri uri, String whereClause, String [] whereArgs) (Log.i (TAG, &quot;del&quot;); / / TODO Auto-generated method stubSQLiteDatabase db = openHelper.getWritableDatabase (); int count = 0; switch (sUriMatcher.match (uri)) (case INCOMMING_BOOK_COLLECTION_URI_INDICATOR: count = db.delete (BookTableMetaData.TABLE_NAME, whereClause, whereArgs); break ; case INCOMMING_SINGLE_BOOK_URI_INDICATOR: String rowID = uri.getPathSegments (). get (1); String where = BookTableMetaData._ID + &quot;=&quot; + rowID + (! TextUtils.isEmpty (whereClause)? &quot;AND (&quot; + whereClause + &#39;)&#39; :&quot;&quot;); count = db.delete (BookTableMetaData.TABLE_NAME, where, whereArgs); break; default: throw new IllegalArgumentException ( &quot;Unknown URI&quot; + uri);) this.getContext (). getContentResolver (). notifyChange (uri , null); return count;) @ Overridepublic String getType (Uri uri) (switch (sUriMatcher.match (uri)) (case INCOMMING_BOOK_COLLECTION_URI_INDICATOR: return BookTableMetaData.CONTENT_TYPE; case INCOMMING_SINGLE_BOOK_URI_INDICATOR: return BookTableMetaData.CONTENT_ITEM_TYPE; default: throw new IllegalArgumentException ( &quot; Unknown URI &quot;+ uri );}}Overridepublic Uri insert (Uri uri, ContentValues values) (/ / TODO Auto-generated method stubLog.i (TAG,&quot; insert &quot;); if (sUriMatcher.match (uri)! = INCOMMING_BOOK_COLLECTION_URI_INDICATOR ) (throw new IllegalArgumentException ( &quot;Unknown URI&quot; + uri);) long now = Long.valueOf (System.currentTimeMillis ()); if (values.containsKey (BookTableMetaData.CREATED_DATE) == false) (values.put (BookTableMetaData. CREATED_DATE, now);) if (values.containsKey (BookTableMetaData.MODIFIED_DATE) == false) (values.put (BookTableMetaData.MODIFIED_DATE, now);) if (values.containsKey (BookTableMetaData.BOOK_NAME) == false) (/ / values.put (BookTableMetaData.BOOK_NAME, &quot;null&quot;); throw new SQLException ( &quot;Failed to insert row, because Book Name is needed&quot; + uri);) if (values.containsKey (BookTableMetaData.BOOK_ISBN) == false) (values . put (BookTableMetaData.BOOK_ISBN, &quot;Unknown ISBN&quot;);) if (values.containsKey (BookTableMetaData.BOOK_AUTHOR) == false) (values.put (BookTableMetaData.BOOK_AUTHOR, &quot;Unknown author&quot;);) SQLiteDatabase db = openHelper.getWritableDatabase (); long rowID = db.insert (BookTableMetaData.TABLE_NAME, BookTableMetaData.BOOK_NAME, values); if (rowID&gt; 0) (Uri insertBookedUri = ContentUris.withAppendedId (BookTableMetaData.CONTENT_URI, rowID); getContext (). getContentResolver (). notifyChange (insertBookedUri, null); return insertBookedUri;) throw new SQLException ( &quot;Failed to insert row into&quot; + uri);) @ Overridepublic boolean onCreate () (/ / TODO Auto-generated method stubLog.i (TAG, &quot;create table &quot;); openHelper = new DatabaseHelper (this.getContext ()); Log.i (TAG, openHelper.toString ()); return true;) @ Overridepublic Cursor query (Uri uri, String [] projection, String selection, String [ ] selectionArgs, String sortOrder) (/ / TODO Auto-generated method stubLog.i (TAG, &quot;query&quot;); Cursor cursor = null; SQLiteQueryBuilder qb = null; qb = new SQLiteQueryBuilder (); switch (sUriMatcher.match (uri) ) (case INCOMMING_BOOK_COLLECTION_URI_INDICATOR: qb.setTables (BookTableMetaData.TABLE_NAME); qb.setProjectionMap (sBookProjectionMap); break; case INCOMMING_SINGLE_BOOK_URI_INDICATOR: qb.setTables (BookTableMetaData.TABLE_NAME); qb.setProjectionMap (sBookProjectionMap); qb.appendWhere (BookTableMetaData._ID + &quot;=&quot; + uri.getPathSegments (). get (1)); break; default: throw new IllegalArgumentException ( &quot;Unknown URI&quot; + uri);) String orderBy = &quot;&quot;; if (TextUtils.isEmpty (sortOrder)) (orderBy = BookTableMetaData.DEFAULT_SORT_ORDER;) else (orderBy = sortOrder;) SQLiteDatabase db = openHelper.getReadableDatabase (); Cursor c = qb.query (db, projection, selection, selectionArgs, null, null, orderBy); int i = c.getCount (); ContentResolver cr = this.getContext (). getContentResolver (); c.setNotificationUri (cr, uri); return c;) @ Overridepublic int update (Uri uri, ContentValues values, String selection, String [] selectionArgs) (/ / TODO Auto-generated method stubLog.i (TAG, &quot;update&quot;); SQLiteDatabase db = openHelper.getWritableDatabase (); int count = 0; switch (sUriMatcher.match (uri)) (case INCOMMING_BOOK_COLLECTION_URI_INDICATOR: count = db.update ( BookTableMetaData.TABLE_NAME, values, selection, selectionArgs); break; case INCOMMING_SINGLE_BOOK_URI_INDICATOR: String rowID = uri.getPathSegments (). get (1); String where = &quot;BookTableMetaData._ID&quot; + &quot;=&quot; + rowID + (! TextUtils.isEmpty (selection)? &quot;AND (&quot; + selection +&#39;)&#39;:&quot;&quot;); count = db.update (BookTableMetaData.TABLE_NAME, values, where, selectionArgs); break; default: throw new IllegalArgumentException ( &quot;Unknown URI&quot; + uri );) getContext (). getContentResolver (). notifyChange (uri, null); return count ;}//-- create tablepublic class DatabaseHelper extends SQLiteOpenHelper (public DatabaseHelper (Context context) (super (context, TestContentProviderMetaData.DATABASE_NAME, null, TestContentProviderMetaData.DATABASE_VERSION);) @ Overridepublic void onCreate (SQLiteDatabase db) (/ / TODO Auto-generated method stubString sql = &quot;CREATE TABLE&quot; + BookTableMetaData.TABLE_NAME + &quot;(&quot; + TestContentProviderMetaData.BookTableMetaData._ID + &quot;INTEGER PRIMARY KEY,&quot; + BookTableMetaData.BOOK_NAME + &quot;TEXT,&quot; + BookTableMetaData.BOOK_ISBN + &quot;TEXT,&quot; + BookTableMetaData.BOOK_AUTHOR + &quot;TEXT,&quot; + BookTableMetaData.CREATED_DATE + &quot;INTEGER,&quot; + BookTableMetaData.MODIFIED_DATE + &quot;INTEGER&quot; + &quot;);&quot;; Log . i (TAG, db.getPath ()); db.execSQL (sql);) @ Overridepublic void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion) (/ / TODO Auto-generated method stubLog.i (TAG, &quot;Upgrade database from &quot;+ oldVersion +&quot; to &quot;+ newVersion +&quot;, which will destroy old data! &quot;); String sql =&quot; DROP TABLE IF EXISTS &quot;+ BookTableMetaData.TABLE_NAME; db.execSQL (sql); onCreate (db);) )) class TestContentProviderMetaData (public static final String DATABASE_NAME = &quot;books.db&quot;; public static final int DATABASE_VERSION = 1; public static final String AUTHORITY = &quot;tl.android.provider.bookprovider&quot;; public static final String BOOKS_TABLE_NAME = &quot;books&quot; ; public static final class BookTableMetaData implements BaseColumns (public static final String TABLE_NAME = &quot;books&quot;; / / String public static final String BOOK_NAME = &quot;name&quot;; / / Stringpublic static final String BOOK_ISBN = &quot;isbn&quot;; / / Stringpublic static final String BOOK_AUTHOR = &quot;author&quot;; / / Integerpublic static final String CREATED_DATE = &quot;created&quot;; / / Integerpublic static final String MODIFIED_DATE = &quot;modified&quot;; public static final Uri CONTENT_URI = Uri.parse ( &quot;content: / /&quot; + AUTHORITY + &quot; / books &quot;);//-- multi-record public static final String CONTENT_TYPE = &quot;vnd.android.cursor.dir / vnd.androidbook.book &quot;;//-- a single record of public static final String CONTENT_ITEM_TYPE =&quot; vnd.android. cursor.item / vnd.androidbook.book &quot;; public static final String DEFAULT_SORT_ORDER =&quot; modified DESC &quot;;))

MainActivity.java

  package tl.android.apps; import tl.android.data.TestContentProvider; import android.app.Activity; import android.content.ContentResolver; import android.content.ContentValues; import android.database.sqlite.SQLiteDatabase; import android.os . Bundle; public class MainActivity extends Activity (/ ** Called when the activity is first created. * / @ Override public void onCreate (Bundle savedInstanceState) (super.onCreate (savedInstanceState); setContentView (R.layout.main); ContentResolver cr = this.getContentResolver (); ContentValues cv = new ContentValues (); cv.put ( &quot;name&quot;, &quot;android pro&quot;); cr.insert (TestContentProvider.CONTENT_URI, cv); cv.put ( &quot;name&quot;, &quot;android programming &quot;); cr.insert (TestContentProvider.CONTENT_URI, cv);))

AndroidManifest.xml

  &lt;? xml version = &quot;1.0&quot; encoding = &quot;utf-8&quot;?&gt; &lt;manifest xmlns: android = &quot;http://schemas.android.com/apk/res/android&quot; package = &quot;tl.android.apps&quot; android : versionCode = &quot;1&quot; android: versionName = &quot;1.0&quot;&gt; &lt;application android:icon=&quot;@drawable/icon&quot; android:label=&quot;@string/app_name&quot;&gt; &lt;activity android: name = &quot;tl.android.apps. MainActivity &quot;android: label =&quot; @ string / app_name &quot;&gt; &lt;intent-filter&gt; &lt;action android:name=&quot;android.intent.action.MAIN&quot; /&gt; &lt;category android: name =&quot; android.intent.category.LAUNCHER &quot; /&gt; &lt;/ intent-filter&gt; &lt;/ activity&gt; &lt;provider android:authorities=&quot;tl.android.provider.bookprovider&quot;android:name=&quot;tl.android.data.TestContentProvider&quot;&gt; &lt;/ provider&gt; &lt;/ application&gt; &lt; uses-sdk android: minSdkVersion = &quot;4&quot; /&gt; &lt;/ manifest&gt;

Tags: , ,