<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Code Library &#187; custom</title>
	<atom:link href="http://www.ucosoft.com/tag/custom/feed" rel="self" type="application/rss+xml" />
	<link>http://www.ucosoft.com</link>
	<description>Free Source Code and Program Tips</description>
	<lastBuildDate>Mon, 19 Jul 2010 04:51:18 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Android custom ContentProvider</title>
		<link>http://www.ucosoft.com/android-custom-contentprovider-2.html</link>
		<comments>http://www.ucosoft.com/android-custom-contentprovider-2.html#comments</comments>
		<pubDate>Thu, 17 Dec 2009 19:07:18 +0000</pubDate>
		<dc:creator>support</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[contentprovider]]></category>
		<category><![CDATA[custom]]></category>

		<guid isPermaLink="false">http://www.ucosoft.com/uncategorized/android-custom-contentprovider-2.html</guid>
		<description><![CDATA[Custom ContentProvider &#8212;&#8212;&#8212;- 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]]></description>
			<content:encoded><![CDATA[<p>  Custom ContentProvider <br />  &#8212;&#8212;&#8212;- <br />  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 . <br />  A URI can identify a resource, and a content provider can have multiple URI. But all the same URI of the AUTHORITY. <br />  Android no shared memory, so to access data from another process must be through the content provider to operate the device. </p>
<p>  1. Inheritance ContentProvider, and override all abstract methods. <br />  Android OS automatically call ContentProvider of onCreate () method, while the database is on-demand enabled. </p>
<p>  2. Configuration AndroidManifest.xml <br />  &lt;provider android: authorities = &quot;tl.android.provider.bookprovider&quot; <br />  android: name = &quot;tl.android.data.TestContentProvider&quot;&gt; <br />  &lt;/ provider&gt; </p>
<p>  name: Specifies ContentProvider subclass the full class path. <br />  authorities: the specified ContentProvider unique identification (recommended: company name. provider. data table + provider) </p>
<p>  3. For the content provider defines various constants. <br />  CONTENT_URI <br />  TABLE_NAME <br />  DATABASE_NAME <br />  DATABASE_VERSION <br />  &#8230; </p>
<p>  4. ContentResolver inserting data record by </p>
<p>  5. To obtain the generated database and view <br />  *. db directory databases in the application of generally under. <br />  For example: <br />  / data / data / tl.android.apps / databases / books.db </p>
<p>  Copy Database to C: <br />  adb pull / data / data / tl.android.apps / databases / books.db c:  </p>
<p>  Will be generated books.db drag sqlite3.exe (in the Android SDK tools directory) </p>
<p>  View database tables <br />  . tables </p>
<p>  See the specific form <br />  select * from table_name; </p>
<p>  Specific reference code: <br />  TestContentProvider.java</p>

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

<p>  MainActivity.java</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="java" style="font-family:monospace;">  <span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">tl.android.apps</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">tl.android.data.TestContentProvider</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">android.app.Activity</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">android.content.ContentResolver</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">android.content.ContentValues</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">android.database.sqlite.SQLiteDatabase</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">android.os</span> . <span style="color: #006633;">Bundle</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> MainActivity <span style="color: #000000; font-weight: bold;">extends</span> Activity <span style="color: #009900;">&#40;</span><span style="color: #339933;">/</span> <span style="color: #339933;">**</span> Called when the activity is first created. <span style="color: #339933;">*</span> <span style="color: #339933;">/</span> @ Override <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> onCreate <span style="color: #009900;">&#40;</span>Bundle savedInstanceState<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">onCreate</span> <span style="color: #009900;">&#40;</span>savedInstanceState<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> setContentView <span style="color: #009900;">&#40;</span>R.<span style="color: #006633;">layout</span>.<span style="color: #006633;">main</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> ContentResolver cr <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">getContentResolver</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> ContentValues cv <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> ContentValues <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> cv.<span style="color: #006633;">put</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">&amp;</span>quot<span style="color: #339933;">;</span>name<span style="color: #339933;">&amp;</span>quot<span style="color: #339933;">;</span>, <span style="color: #339933;">&amp;</span>quot<span style="color: #339933;">;</span>android pro<span style="color: #339933;">&amp;</span>quot<span style="color: #339933;">;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> cr.<span style="color: #006633;">insert</span> <span style="color: #009900;">&#40;</span>TestContentProvider.<span style="color: #006633;">CONTENT_URI</span>, cv<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> cv.<span style="color: #006633;">put</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">&amp;</span>quot<span style="color: #339933;">;</span>name<span style="color: #339933;">&amp;</span>quot<span style="color: #339933;">;</span>, <span style="color: #339933;">&amp;</span>quot<span style="color: #339933;">;</span>android programming <span style="color: #339933;">&amp;</span>quot<span style="color: #339933;">;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> cr.<span style="color: #006633;">insert</span> <span style="color: #009900;">&#40;</span>TestContentProvider.<span style="color: #006633;">CONTENT_URI</span>, cv<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span></pre></td></tr></table></div>

<p>  AndroidManifest.xml</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="java" style="font-family:monospace;">  <span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;?</span> xml version <span style="color: #339933;">=</span> <span style="color: #339933;">&amp;</span>quot<span style="color: #339933;">;</span><span style="color: #cc66cc;">1.0</span><span style="color: #339933;">&amp;</span>quot<span style="color: #339933;">;</span> encoding <span style="color: #339933;">=</span> <span style="color: #339933;">&amp;</span>quot<span style="color: #339933;">;</span>utf<span style="color: #339933;">-</span><span style="color: #cc66cc;">8</span><span style="color: #339933;">&amp;</span>quot<span style="color: #339933;">;?&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span>manifest xmlns<span style="color: #339933;">:</span> android <span style="color: #339933;">=</span> <span style="color: #339933;">&amp;</span>quot<span style="color: #339933;">;</span>http<span style="color: #339933;">:</span><span style="color: #666666; font-style: italic;">//schemas.android.com/apk/res/android&amp;quot; package = &amp;quot;tl.android.apps&amp;quot; android : versionCode = &amp;quot;1&amp;quot; android: versionName = &amp;quot;1.0&amp;quot;&amp;gt; &amp;lt;application android:icon=&amp;quot;@drawable/icon&amp;quot; android:label=&amp;quot;@string/app_name&amp;quot;&amp;gt; &amp;lt;activity android: name = &amp;quot;tl.android.apps. MainActivity &amp;quot;android: label =&amp;quot; @ string / app_name &amp;quot;&amp;gt; &amp;lt;intent-filter&amp;gt; &amp;lt;action android:name=&amp;quot;android.intent.action.MAIN&amp;quot; /&amp;gt; &amp;lt;category android: name =&amp;quot; android.intent.category.LAUNCHER &amp;quot; /&amp;gt; &amp;lt;/ intent-filter&amp;gt; &amp;lt;/ activity&amp;gt; &amp;lt;provider android:authorities=&amp;quot;tl.android.provider.bookprovider&amp;quot;android:name=&amp;quot;tl.android.data.TestContentProvider&amp;quot;&amp;gt; &amp;lt;/ provider&amp;gt; &amp;lt;/ application&amp;gt; &amp;lt; uses-sdk android: minSdkVersion = &amp;quot;4&amp;quot; /&amp;gt; &amp;lt;/ manifest&amp;gt;</span></pre></td></tr></table></div>
</p>

	Tags: <strong><a href="http://www.ucosoft.com/tag/android" title="android" rel="tag">android</a>, <a href="http://www.ucosoft.com/tag/contentprovider" title="contentprovider" rel="tag">contentprovider</a>, <a href="http://www.ucosoft.com/tag/custom" title="custom" rel="tag">custom</a></strong><br />

	<ul class="st-related-posts">
	<li><a href="http://www.ucosoft.com/android-actions-broadcastreceiver.html" title="Android: Actions for BroadcastReceiver (October 16, 2009)">Android: Actions for BroadcastReceiver</a> (0)</li>
	<li><a href="http://www.ucosoft.com/sending-email-user-interaction-android.html" title="Sending email without user interaction in Android (November 17, 2009)">Sending email without user interaction in Android</a> (0)</li>
	<li><a href="http://www.ucosoft.com/sending-email-user-interaction-android-2.html" title="Sending email without user interaction in Android (December 17, 2009)">Sending email without user interaction in Android</a> (0)</li>
	<li><a href="http://www.ucosoft.com/android-20.html" title="Everything you need to know about Android 2.0 (November 20, 2009)">Everything you need to know about Android 2.0</a> (0)</li>
	<li><a href="http://www.ucosoft.com/android-20-2.html" title="Everything you need to know about Android 2.0 (December 17, 2009)">Everything you need to know about Android 2.0</a> (0)</li>
	<li><a href="http://www.ucosoft.com/eclipse-development-android-helloword-program.html" title="Eclipse Development Android, the first one HelloWord program (study 1) (November 22, 2009)">Eclipse Development Android, the first one HelloWord program (study 1)</a> (0)</li>
	<li><a href="http://www.ucosoft.com/eclipse-development-android-helloword-program-2.html" title="Eclipse Development Android, the first one HelloWord program (study 1) (December 17, 2009)">Eclipse Development Android, the first one HelloWord program (study 1)</a> (0)</li>
	<li><a href="http://www.ucosoft.com/eclipse-developed-android-tablelayout-study.html" title="Eclipse developed Android, TableLayout (study 4) (December 3, 2009)">Eclipse developed Android, TableLayout (study 4)</a> (0)</li>
	<li><a href="http://www.ucosoft.com/eclipse-developed-android-tablelayout-study-2.html" title="Eclipse developed Android, TableLayout (study 4) (December 18, 2009)">Eclipse developed Android, TableLayout (study 4)</a> (0)</li>
	<li><a href="http://www.ucosoft.com/eclipse-developed-android-relativelayout-study.html" title="Eclipse developed Android, RelativeLayout (study 3) (December 2, 2009)">Eclipse developed Android, RelativeLayout (study 3)</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.ucosoft.com/android-custom-contentprovider-2.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android custom ContentProvider</title>
		<link>http://www.ucosoft.com/android-custom-contentprovider.html</link>
		<comments>http://www.ucosoft.com/android-custom-contentprovider.html#comments</comments>
		<pubDate>Sat, 28 Nov 2009 15:18:46 +0000</pubDate>
		<dc:creator>support</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[contentprovider]]></category>
		<category><![CDATA[custom]]></category>

		<guid isPermaLink="false">http://www.ucosoft.com/uncategorized/android-custom-contentprovider.html</guid>
		<description><![CDATA[Custom ContentProvider &#8212;- 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 &#8211; safe. A URI can identify a resource,]]></description>
			<content:encoded><![CDATA[<p>  Custom ContentProvider <br />  &#8212;- <br />  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 &#8211; safe. <br />  A URI can identify a resource, and a content provider can have multiple URI. But all the same URI of the AUTHORITY. <br />  Android no shared memory, so to access data from another process must be through the content provider to operate the device. </p>
<p>  1. Inheritance ContentProvider, and override all abstract methods. <br />  Android OS automatically call ContentProvider of onCreate () method, while the database is on-demand enabled. </p>
<p>  2. Configuration AndroidManifest.xml <br />  &lt;provider android: authorities = &quot;tl.android.provider.bookprovider&quot; <br />  android: name = &quot;tl.android.data.TestContentProvider&quot;&gt; <br />  &lt;/ Provider&gt; </p>
<p>  name: Specifies ContentProvider subclass the full class path. <br />  authorities: the specified ContentProvider unique identification (recommended: company name. provider. data table   provider) </p>
<p>  3. For the content provider defines various constants. <br />  CONTENT_URI <br />  TABLE_NAME <br />  DATABASE_NAME <br />  DATABASE_VERSION <br />  &#8230; </p>
<p>  4. ContentResolver inserting data record by </p>
<p>  5. To obtain the generated database and view <br />  *. Db directory databases in the application of generally under. <br />  For example: <br />  / Data / data / tl.android.apps / databases / books.db </p>
<p>  Copy Database to C: <br />  adb pull / data / data / tl.android.apps / databases / books.db c: </p>
<p>  Will be generated books.db drag sqlite3.exe (in the Android SDK tools directory) </p>
<p>  View database tables <br />  . Tables </p>
<p>  See the specific form <br />  select * from table_name; </p>
<p>  Specific reference code: <br />  TestContentProvider.java </p>
<div class="wp_syntax">
<div class="code">
<pre style="font-family:monospace">   ; 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 = "&gt; quot ; amos_tl &amp; quot ;; public DatabaseHelper openHelper = null ; / / - Create table column names and JavaBean map. public static HashMap &amp; lt ; String, String &amp; gt ; sBookProjectionMap = null ; static ( sBookProjectionMap = new HashMap &amp; lt ; String , String &amp; 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 , &amp; quot ; books &amp; quot ; , INCOMMING_BOOK_COLLECTION_URI_INDICATOR ) ; sUriMatcher. addURI ( TestContentProviderMetaData. AUTHORITY , &amp; quot ; books / # &amp; quot ; , INCOMMING_SINGLE_BOOK_URI_INDICATOR ) ; ) @ Overridepublic int delete ( Uri uri, String whereClause, String [ ] whereArgs ) ( Log. i ( TAG, &amp; quot ; del &amp; 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 + &amp; quot ;=&amp; quot ; + rowID + ( ! TextUtils. isEmpty ( whereClause ) ? &amp; quot ; AND ( &amp; quot ; + whereClause + &amp; # 39 ; ) &amp; # 39 ; :&amp; quot ;&amp; quot ; ) ; count = db. delete ( BookTableMetaData. TABLE_NAME , where, whereArgs ) ; break ; default : throw new IllegalArgumentException ( &amp; quot ; Unknown URI &amp; 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 ( &amp; quot ; Unknown URI &amp; quot ;+ uri ) ; } } Overridepublic Uri insert ( Uri uri, ContentValues values ) ( / / TODO Auto - generated method stubLog. i ( TAG, &amp; quot ; insert &amp; quot ; ) ; if ( sUriMatcher. match ( uri ) ! = INCOMMING_BOOK_COLLECTION_URI_INDICATOR ) ( throw new IllegalArgumentException ( &amp; quot ; Unknown URI &amp; 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 , &amp; quot ; null &amp; quot ; ) ; throw new SQLException ( &amp; quot ; Failed to insert row, because Book Name is needed &amp; quot ; + uri ) ; ) if ( values. containsKey ( BookTableMetaData. BOOK_ISBN ) == false ) ( values . put ( BookTableMetaData. BOOK_ISBN , &amp; quot ; Unknown ISBN &amp; quot ; ) ; ) if ( values. containsKey ( BookTableMetaData. BOOK_AUTHOR ) == false ) ( values. put ( BookTableMetaData. BOOK_AUTHOR , &amp; quot ; Unknown author &amp; quot ; ) ; ) SQLiteDatabase db = openHelper. getWritableDatabase ( ) ; long rowID = db. insert ( BookTableMetaData. TABLE_NAME , BookTableMetaData. BOOK_NAME , values ) ; if ( rowID &amp; gt ; 0 ) ( Uri insertBookedUri = ContentUris. withAppendedId ( BookTableMetaData. CONTENT_URI , rowID ) ; getContext ( ) . getContentResolver ( ) . notifyChange ( insertBookedUri, null ) ; return insertBookedUri ; ) throw new SQLException ( &amp; quot ; Failed to insert row into &amp; quot ; + uri ) ; ) @ Overridepublic boolean onCreate ( ) ( / / TODO Auto - generated method stubLog. i ( TAG, &amp; quot ; create table &amp; 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, &amp; quot ; query &amp; 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 + &amp; quot ;=&amp; quot ; + uri. getPathSegments ( ) . get ( 1 ) ) ; break ; default : throw new IllegalArgumentException ( &amp; quot ; Unknown URI &amp; quot ; + uri ) ; ) String orderBy = &amp; quot ;&amp; 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, &amp; quot ; update &amp; 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 = &amp; quot ; BookTableMetaData._ID &amp; quot ; + &amp; quot ;=&amp; quot ; + rowID + ( ! TextUtils. isEmpty ( selection ) ? &amp; quot ; AND ( &amp; quot ; + selection +&amp; # 39 ; ) &amp; # 39 ;:&amp; quot ;&amp; quot ; ) ; count = db. update ( BookTableMetaData. TABLE_NAME , values, where, selectionArgs ) ; break ; default : throw new IllegalArgumentException ( &amp; quot ; Unknown URI &amp; 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 = &amp;quot;CREATE TABLE&amp;quot; + BookTableMetaData.TABLE_NAME + &amp;quot;(&amp;quot; + TestContentProviderMetaData.BookTableMetaData._ID + &amp;quot;INTEGER PRIMARY KEY,&amp;quot; + BookTableMetaData.BOOK_NAME + &amp;quot;TEXT,&amp;quot; + BookTableMetaData.BOOK_ISBN + &amp;quot;TEXT,&amp;quot; + BookTableMetaData.BOOK_AUTHOR + &amp;quot;TEXT,&amp;quot; + BookTableMetaData.CREATED_DATE + &amp;quot;INTEGER,&amp;quot; + BookTableMetaData.MODIFIED_DATE + &amp;quot;INTEGER&amp;quot; + &amp;quot;);&amp;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, &amp;quot;Upgrade database from &amp;quot;+ oldVersion +&amp;quot; to &amp;quot;+ newVersion +&amp;quot;, which will destroy old data! &amp;quot;); String sql =&amp;quot; DROP TABLE IF EXISTS &amp;quot;+ BookTableMetaData.TABLE_NAME; db.execSQL (sql); onCreate (db);) )) class TestContentProviderMetaData (public static final String DATABASE_NAME = &amp;quot;books.db&amp;quot;; public static final int DATABASE_VERSION = 1; public static final String AUTHORITY = &amp;quot;tl.android.provider.bookprovider&amp;quot;; public static final String BOOKS_TABLE_NAME = &amp;quot;books&amp;quot; ; public static final class BookTableMetaData implements BaseColumns (public static final String TABLE_NAME = &amp;quot;books&amp;quot;; / / String public static final String BOOK_NAME = &amp;quot;name&amp;quot;; / / Stringpublic static final String BOOK_ISBN = &amp;quot;isbn&amp;quot;; / / Stringpublic static final String BOOK_AUTHOR = &amp;quot;author&amp;quot;; / / Integerpublic static final String CREATED_DATE = &amp;quot;created&amp;quot;; / / Integerpublic static final String MODIFIED_DATE = &amp;quot;modified&amp;quot;; public static final Uri CONTENT_URI = Uri.parse ( &amp;quot;content: / /&amp;quot; + AUTHORITY + &amp;quot; / books &amp;quot;);//-- multi-record public static final String CONTENT_TYPE = &amp;quot;vnd.android.cursor.dir / vnd.androidbook.book &amp;quot;;//-- a single record of public static final String CONTENT_ITEM_TYPE =&amp;quot; vnd.android. cursor.item / vnd.androidbook.book &amp;quot;; public static final String DEFAULT_SORT_ORDER =&amp;quot; modified DESC &amp;quot;;)) 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 = &amp; quot; amos_tl &amp; quot;; public DatabaseHelper openHelper = null; / / - Create table column names and JavaBean map. public static HashMap &amp; lt; String, String &amp; gt; sBookProjectionMap = null; static (sBookProjectionMap = new HashMap &amp; lt; String, String &amp; 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, &amp; quot; books &amp; quot;, INCOMMING_BOOK_COLLECTION_URI_INDICATOR); sUriMatcher. addURI (TestContentProviderMetaData. AUTHORITY, &amp; quot; books / # &amp; quot;, INCOMMING_SINGLE_BOOK_URI_INDICATOR);) @ Overridepublic int delete (Uri uri, String whereClause, String [] whereArgs) (Log. i (TAG, &amp; quot; del &amp; 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 + &amp; quot; = &amp; quot; + rowID + (! TextUtils. isEmpty (whereClause)? &amp; quot; AND (&amp; quot; + whereClause + &amp; # 39;) &amp; # 39;: &amp; quot; &amp; quot;); count = db. delete ( BookTableMetaData. TABLE_NAME, where, whereArgs); break; default: throw new IllegalArgumentException (&amp; quot; Unknown URI &amp; 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 (&amp; quot; Unknown URI &amp; quot; + uri);)) Overridepublic Uri insert (Uri uri, ContentValues values) (/ / TODO Auto - generated method stubLog. i (TAG, &amp; quot; insert &amp; quot;); if (sUriMatcher. match (uri)! = INCOMMING_BOOK_COLLECTION_URI_INDICATOR ) (throw new IllegalArgumentException (&amp; quot; Unknown URI &amp; 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, &amp; quot; null &amp; quot;); throw new SQLException (&amp; quot; Failed to insert row, because Book Name is needed &amp; quot; + uri);) if (values. containsKey (BookTableMetaData. BOOK_ISBN) == false) (values. put (BookTableMetaData. BOOK_ISBN, &amp; quot; Unknown ISBN &amp; quot;);) if (values. containsKey (BookTableMetaData. BOOK_AUTHOR) == false) (values. put (BookTableMetaData . BOOK_AUTHOR, &amp; quot; Unknown author &amp; quot;);) SQLiteDatabase db = openHelper. getWritableDatabase (); long rowID = db. insert (BookTableMetaData. TABLE_NAME, BookTableMetaData. BOOK_NAME, values); if (rowID &amp; gt; 0) ( Uri insertBookedUri = ContentUris. withAppendedId (BookTableMetaData. CONTENT_URI, rowID); getContext (). getContentResolver (). notifyChange (insertBookedUri, null); return insertBookedUri;) throw new SQLException (&amp; quot; Failed to insert row into &amp; quot; + uri );) @ Overridepublic boolean onCreate () (/ / TODO Auto - generated method stubLog. i (TAG, &amp; quot; create table &amp; 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, &amp; quot; query &amp; 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 + &amp; quot; = &amp; quot; + uri. getPathSegments (). get ( 1)); break; default: throw new IllegalArgumentException (&amp; quot; Unknown URI &amp; quot; + uri);) String orderBy = &amp; quot; &amp; 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, &amp; quot; update &amp; 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 = &amp; quot; BookTableMetaData._ID &amp; quot; + &amp; quot; = &amp; quot; + rowID + (! TextUtils. isEmpty (selection)? &amp; quot; AND (&amp; quot; + selection + &amp; # 39;) &amp; # 39;: &amp; quot; &amp; quot;); count = db. update (BookTableMetaData. TABLE_NAME , values, where, selectionArgs); break; default: throw new IllegalArgumentException (&amp; quot; Unknown URI &amp; 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;;)) </pre>
</div>
</div>
<p>  MainActivity.java </p>
<div class="wp_syntax">
<div class="code">
<pre style="font-family:monospace">  ; 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 ( &amp; quot ; name &amp; quot ; , &amp; quot ; android pro &amp; quot ; ) ; cr. insert ( TestContentProvider. CONTENT_URI , cv ) ; cv. put ( &amp; quot ; name &amp; quot ; , &amp; quot ; android programming &amp; quot ; ) ; cr. insert ( TestContentProvider. CONTENT_URI , cv ) ; ) ) 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 (&amp; quot; name &amp; quot;, &amp; quot; android pro &amp; quot;); cr. insert (TestContentProvider. CONTENT_URI, cv); cv. put (&amp; quot; name &amp; quot;, &amp; quot; android programming &amp; quot;); cr. insert (TestContentProvider. CONTENT_URI, cv);)) </pre>
</div>
</div>
<p>  AndroidManifest.xml </p>
<div class="wp_syntax">
<div class="code">
<pre style="font-family:monospace">  xml version = &amp; quot ; 1.0 &amp; quot ; encoding = &amp; quot ; utf - 8 &amp; quot ;?&amp; gt ; &amp; lt ; manifest xmlns : android = &amp; quot ; http : //schemas.android.com/apk/res/android&amp;quot; package = &amp;quot;tl.android.apps&amp;quot; android : versionCode = &amp;quot;1&amp;quot; android: versionName = &amp;quot;1.0&amp;quot;&amp;gt; &amp;lt;application android:icon=&amp;quot;@drawable/icon&amp;quot; android:label=&amp;quot;@string/app_name&amp;quot;&amp;gt; &amp;lt;activity android: name = &amp;quot;tl.android.apps. MainActivity &amp;quot;android: label =&amp;quot; @ string / app_name &amp;quot;&amp;gt; &amp;lt;intent-filter&amp;gt; &amp;lt;action android:name=&amp;quot;android.intent.action.MAIN&amp;quot; /&amp;gt; &amp;lt;category android: name =&amp;quot; android.intent.category.LAUNCHER &amp;quot; /&amp;gt; &amp;lt;/ intent-filter&amp;gt; &amp;lt;/ activity&amp;gt; &amp;lt;provider android:authorities=&amp;quot;tl.android.provider.bookprovider&amp;quot;android:name=&amp;quot;tl.android.data.TestContentProvider&amp;quot;&amp;gt; &amp;lt;/ provider&amp;gt; &amp;lt;/ application&amp;gt; &amp;lt; uses-sdk android: minSdkVersion = &amp;quot;4&amp;quot; /&amp;gt; &amp;lt;/ manifest&amp;gt; &amp; Lt;? Xml version = &amp; quot; 1.0 &amp; quot; encoding = &amp; quot; utf - 8 &amp; quot;? &amp; Gt; &amp; lt; manifest xmlns: android = &amp; 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; </pre>
</div>
</div>

	Tags: <strong><a href="http://www.ucosoft.com/tag/android" title="android" rel="tag">android</a>, <a href="http://www.ucosoft.com/tag/contentprovider" title="contentprovider" rel="tag">contentprovider</a>, <a href="http://www.ucosoft.com/tag/custom" title="custom" rel="tag">custom</a></strong><br />

	<ul class="st-related-posts">
	<li><a href="http://www.ucosoft.com/android-actions-broadcastreceiver.html" title="Android: Actions for BroadcastReceiver (October 16, 2009)">Android: Actions for BroadcastReceiver</a> (0)</li>
	<li><a href="http://www.ucosoft.com/sending-email-user-interaction-android.html" title="Sending email without user interaction in Android (November 17, 2009)">Sending email without user interaction in Android</a> (0)</li>
	<li><a href="http://www.ucosoft.com/sending-email-user-interaction-android-2.html" title="Sending email without user interaction in Android (December 17, 2009)">Sending email without user interaction in Android</a> (0)</li>
	<li><a href="http://www.ucosoft.com/android-20.html" title="Everything you need to know about Android 2.0 (November 20, 2009)">Everything you need to know about Android 2.0</a> (0)</li>
	<li><a href="http://www.ucosoft.com/android-20-2.html" title="Everything you need to know about Android 2.0 (December 17, 2009)">Everything you need to know about Android 2.0</a> (0)</li>
	<li><a href="http://www.ucosoft.com/eclipse-development-android-helloword-program.html" title="Eclipse Development Android, the first one HelloWord program (study 1) (November 22, 2009)">Eclipse Development Android, the first one HelloWord program (study 1)</a> (0)</li>
	<li><a href="http://www.ucosoft.com/eclipse-development-android-helloword-program-2.html" title="Eclipse Development Android, the first one HelloWord program (study 1) (December 17, 2009)">Eclipse Development Android, the first one HelloWord program (study 1)</a> (0)</li>
	<li><a href="http://www.ucosoft.com/eclipse-developed-android-tablelayout-study.html" title="Eclipse developed Android, TableLayout (study 4) (December 3, 2009)">Eclipse developed Android, TableLayout (study 4)</a> (0)</li>
	<li><a href="http://www.ucosoft.com/eclipse-developed-android-tablelayout-study-2.html" title="Eclipse developed Android, TableLayout (study 4) (December 18, 2009)">Eclipse developed Android, TableLayout (study 4)</a> (0)</li>
	<li><a href="http://www.ucosoft.com/eclipse-developed-android-relativelayout-study.html" title="Eclipse developed Android, RelativeLayout (study 3) (December 2, 2009)">Eclipse developed Android, RelativeLayout (study 3)</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.ucosoft.com/android-custom-contentprovider.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
