Android中ContentProvider和ContentResolver詳解
Android中ContentProvider和ContentResolver詳解
在Android中,我們的應用有的時候需要對外提供數(shù)據(jù)接口,可以有如下幾種方法:
1)AIDL 2)Broadcast 3)ContentProvider。
使用AIDL需要我們編寫AIDL接口以及實現(xiàn),而且對方也要有相應的接口描述,有點麻煩;使用Broadcast,我們不需要任何接口描述,只要協(xié)議文檔就可以了,但是有點不好就是,這種方式不直接而且是異步的;使用ContentProvider我們不需要接口描述,只需要知道協(xié)議,同時這種方式是同步的,使用方便。
下面是ContentProvider實現(xiàn):
package com.backgroundservice; import android.content.ContentProvider; import android.content.ContentValues; import android.content.UriMatcher; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteQueryBuilder; import android.NET.Uri; import android.util.Log; /** * TODO * * @author zengpeng * @version 1.0 Create At : 2010-3-18 下午02:52:40 */ public class TestContentProvider extends ContentProvider { private SQLiteDatabase mDb; private DatabaseHelper mDbHelper = null; private static final String DATABASE_NAME = "rssitems.db"; private static final String DATABASE_TABLE_NAME = "rssItems"; private static final int DB_VERSION = 1; private static final int ALL_MESSAGES = 1; private static final int SPECIFIC_MESSAGE = 2; // Set up our URL matchers to help us determine what an // incoming URI parameter is. private static final UriMatcher URI_MATCHER; static { URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH); URI_MATCHER.addURI("test", "item", ALL_MESSAGES); URI_MATCHER.addURI("test", "item/#", SPECIFIC_MESSAGE); } // Here's the public URI used to query for RSS items. public static final Uri CONTENT_URI = Uri .parse("content://test/item"); // Here are our column name constants, used to query for field values. public static final String ID = "_id"; public static final String NAME = "NAME"; public static final String VALUE = "VALUE"; public static final String DEFAULT_SORT_ORDER = ID + " DESC"; private static class DatabaseHelper extends AbstractDatabaseHelper { @Override protected String[] createDBTables() { // TODO Auto-generated method stub String sql = "CREATE TABLE " + DATABASE_TABLE_NAME + "(" + ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + NAME + " TEXT," + VALUE + " TEXT);"; return new String[] { sql }; } @Override protected String[] dropDBTables() { // TODO Auto-generated method stub return null; } @Override protected String getDatabaseName() { // TODO Auto-generated method stub return DATABASE_NAME; } @Override protected int getDatabaseVersion() { // TODO Auto-generated method stub return DB_VERSION; } @Override protected String getTag() { // TODO Auto-generated method stub return TestContentProvider.class.getSimpleName(); } } /** * */ public TestContentProvider() { // TODO Auto-generated constructor stub } /* * (non-Javadoc) * * @see android.content.ContentProvider#delete(android.Net.Uri, * Java.lang.String, java.lang.String[]) */ @Override public int delete(Uri uri, String selection, String[] selectionArgs) { // NOTE Argument checking code omitted. Check your parameters! int rowCount = mDb.delete(DATABASE_TABLE_NAME, selection, selectionArgs); // Notify any listeners and return the deleted row count. getContext().getContentResolver().notifyChange(uri, null); return rowCount; } /* * (non-Javadoc) * * @see android.content.ContentProvider#getType(android.net.Uri) */ @Override public String getType(Uri uri) { switch (URI_MATCHER.match(uri)) { case ALL_MESSAGES: return "vnd.android.cursor.dir/rssitem"; // List of items. case SPECIFIC_MESSAGE: return "vnd.android.cursor.item/rssitem"; // Specific item. default: return null; } } /* * (non-Javadoc) * * @see android.content.ContentProvider#insert(android.net.Uri, * android.content.ContentValues) */ @Override public Uri insert(Uri uri, ContentValues values) { // NOTE Argument checking code omitted. Check your parameters! Check that // your row addition request succeeded! long rowId = -1; rowId = mDb.insert(DATABASE_TABLE_NAME, NAME, values); Uri newUri = Uri.withAppendedPath(CONTENT_URI, ""+rowId); Log.i("TestContentProvider", "saved a record " + rowId + " " + newUri); // Notify any listeners and return the URI of the new row. getContext().getContentResolver().notifyChange(CONTENT_URI, null); return newUri; } /* * (non-Javadoc) * * @see android.content.ContentProvider#onCreate() */ @Override public boolean onCreate() { // TODO Auto-generated method stub try { mDbHelper = new DatabaseHelper(); mDbHelper.open(getContext()); mDb = mDbHelper.getMDb(); }catch(Exception e){ e.printStackTrace(); } return true; } /* * (non-Javadoc) * * @see android.content.ContentProvider#query(android.net.Uri, * java.lang.String[], java.lang.String, java.lang.String[], * java.lang.String) */ public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { // We won't bother checking the validity of params here, but you should! // SQLiteQueryBuilder is the helper class that creates the // proper SQL syntax for us. SQLiteQueryBuilder qBuilder = new SQLiteQueryBuilder(); // Set the table we're querying. qBuilder.setTables(DATABASE_TABLE_NAME); // If the query ends in a specific record number, we're // being asked for a specific record, so set the // WHERE clause in our query. if((URI_MATCHER.match(uri)) == SPECIFIC_MESSAGE){ qBuilder.appendWhere("_id=" + uri.getLastPathSegment()); Log.i("TestContentProvider", "_id=" + uri.getLastPathSegment()); } // Make the query. Cursor c = qBuilder.query(mDb, projection, selection, selectionArgs, null, null, sortOrder); Log.i("TestContentProvider", "get records"); c.setNotificationUri(getContext().getContentResolver(), uri); return c; } /* * (non-Javadoc) * * @see android.content.ContentProvider#update(android.net.Uri, * android.content.ContentValues, java.lang.String, java.lang.String[]) */ @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { // NOTE Argument checking code omitted. Check your parameters! int updateCount = mDb.update(DATABASE_TABLE_NAME, values, selection, selectionArgs); // Notify any listeners and return the updated row count. getContext().getContentResolver().notifyChange(uri, null); return updateCount; } }
配文件如下:
<provider android:name="TestContentProvider" android:authorities="test"> </provider>
在客戶端中可以使用如下方法進行調(diào)用:
ContentValues values = new ContentValues(); values.put(TestContentProvider.NAME, "testname1"); values.put(TestContentProvider.VALUE, "testvalu1e"); Uri newAddUri = TestActivity.this.getContentResolver().insert(TestContentProvider.CONTENT_URI, values); Cursor c = TestActivity.this.managedQuery(newAddUri, new String[]{TestContentProvider.NAME}, null, null, null); Log.i("TestActivity", "" + c.getCount()); if(c.moveToNext()) { Log.i("TestActivity", c.getString(0)); }
上面的代碼是先進行插入,然后進行查詢并打印。就是如此簡單,所有的應用如果需要都可以對外方便的提供數(shù)據(jù)接口,同時其他應用也可以很方便的進行調(diào)用。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
- Android 中自定義ContentProvider與ContentObserver的使用簡單實例
- Android 中ContentProvider的實例詳解
- Android ContentProvider實現(xiàn)獲取手機聯(lián)系人功能
- Android數(shù)據(jù)持久化之ContentProvider機制詳解
- Android開發(fā)教程之ContentProvider數(shù)據(jù)存儲
- android基礎總結篇之八:創(chuàng)建及調(diào)用自己的ContentProvider
- Android學習筆記之ContentProvider和Uri詳解
- 實例解析Android系統(tǒng)中的ContentProvider組件用法
- Android7.0中關于ContentProvider組件詳解
相關文章
Android實現(xiàn)TextView中文字鏈接的4種方式介紹及代碼
Android實現(xiàn)TextView中文字鏈接的方式有很多種;總結起來大概有4種:用Spannable或?qū)崿F(xiàn)它的類,如SpannableString來格式,部分字符串等等,感興趣的你可以參考下2013-02-02簡單介紹Android開發(fā)中的Activity控件的基本概念
這篇文章主要介紹了Android開發(fā)中的Activity控件的基本概念,Activity控件的使用是安卓開發(fā)的基礎之一,需要的朋友可以參考下2015-12-12