国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android中ContentProvider和ContentResolver詳解

2019-12-12 03:02:19
字體:
供稿:網(wǎng)友

Android中ContentProvider和ContentResolver詳解

在Android中,我們的應(yīng)用有的時(shí)候需要對外提供數(shù)據(jù)接口,可以有如下幾種方法:

1)AIDL 2)Broadcast 3)ContentProvider。

使用AIDL需要我們編寫AIDL接口以及實(shí)現(xiàn),而且對方也要有相應(yīng)的接口描述,有點(diǎn)麻煩;使用Broadcast,我們不需要任何接口描述,只要協(xié)議文檔就可以了,但是有點(diǎn)不好就是,這種方式不直接而且是異步的;使用ContentProvider我們不需要接口描述,只需要知道協(xié)議,同時(shí)這種方式是同步的,使用方便。

下面是ContentProvider實(shí)現(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>

在客戶端中可以使用如下方法進(jìn)行調(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));        }

上面的代碼是先進(jìn)行插入,然后進(jìn)行查詢并打印。就是如此簡單,所有的應(yīng)用如果需要都可以對外方便的提供數(shù)據(jù)接口,同時(shí)其他應(yīng)用也可以很方便的進(jìn)行調(diào)用。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 宣汉县| 绍兴县| 沙河市| 通化县| 化隆| 浪卡子县| 台北县| 介休市| 杭州市| 襄樊市| 南陵县| 拉萨市| 日土县| 离岛区| 石棉县| 武川县| 邵阳县| 兴山县| 涿鹿县| 贞丰县| 尤溪县| 泗阳县| 元朗区| 林州市| 九台市| 民乐县| 岳阳县| 长阳| 明光市| 北流市| 嘉善县| 杭州市| 临海市| 茂名市| 慈利县| 宾阳县| 安达市| 尼木县| 吉木萨尔县| 桃园县| 民县|