最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android中ContentProvider和ContentResolver詳解

 更新時(shí)間:2017年04月21日 11:44:13   投稿:lqh  
這篇文章主要介紹了Android中ContentProvider和ContentResolver詳解的相關(guān)資料,需要的朋友可以參考下

Android中ContentProvider和ContentResolver詳解

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

1)AIDL 2)Broadcast 3)ContentProvider。

使用AIDL需要我們編寫AIDL接口以及實(shí)現(xiàn),而且對(duì)方也要有相應(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)行查詢并打印。就是如此簡(jiǎn)單,所有的應(yīng)用如果需要都可以對(duì)外方便的提供數(shù)據(jù)接口,同時(shí)其他應(yīng)用也可以很方便的進(jìn)行調(diào)用。

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

相關(guān)文章

  • Android中的腦殘?jiān)O(shè)計(jì)總結(jié)

    Android中的腦殘?jiān)O(shè)計(jì)總結(jié)

    本篇文章是對(duì)Android中的腦殘?jiān)O(shè)計(jì)進(jìn)行了分析與介紹,需要的朋友參考下
    2013-05-05
  • Android觸摸及手勢(shì)操作GestureDetector

    Android觸摸及手勢(shì)操作GestureDetector

    這篇文章主要a為大家詳細(xì)介紹了Android觸摸及手勢(shì)操作GestureDetector的相關(guān)資料,感興趣的小伙伴們可以參考一下
    2016-07-07
  • 解決Android Studio sdk emulator directory is missing問(wèn)題

    解決Android Studio sdk emulator directory is missing問(wèn)題

    這篇文章主要介紹了解決Android Studio sdk emulator directory is missing問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • android仿愛奇藝加載動(dòng)畫實(shí)例

    android仿愛奇藝加載動(dòng)畫實(shí)例

    這篇文章主要介紹了android仿愛奇藝加載動(dòng)畫實(shí)例,小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。
    2016-10-10
  • Android實(shí)現(xiàn)圖片上傳功能

    Android實(shí)現(xiàn)圖片上傳功能

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)圖片上傳功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • Android通過(guò)自定義Activity實(shí)現(xiàn)懸浮的Dialog詳解

    Android通過(guò)自定義Activity實(shí)現(xiàn)懸浮的Dialog詳解

    這篇文章主要給大家介紹了關(guān)于Android通過(guò)自定義Activity實(shí)現(xiàn)懸浮的Dialog的相關(guān)資料,文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,感興趣的朋友們下面來(lái)一起看看吧。
    2017-05-05
  • Android權(quán)限如何禁止以及友好提示用戶開通必要權(quán)限詳解

    Android權(quán)限如何禁止以及友好提示用戶開通必要權(quán)限詳解

    這篇文章主要給大家介紹了關(guān)于Android權(quán)限如何禁止以及友好提示用戶開通必要權(quán)限的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)各位Android開發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Flutter實(shí)現(xiàn)矩形取色器的封裝

    Flutter實(shí)現(xiàn)矩形取色器的封裝

    這篇文章主要為大家詳細(xì)介紹了Flutter實(shí)現(xiàn)矩形取色器的封裝,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • Android中自定義ContentProvider實(shí)例

    Android中自定義ContentProvider實(shí)例

    應(yīng)用A(TestBaidu)調(diào)用另外一個(gè)應(yīng)用(TestContentProvider)中的自定義ContentProvider,具體實(shí)現(xiàn)如下,感興趣的朋友可以參考下哈
    2013-06-06
  • Android RecyclerView 基礎(chǔ)知識(shí)詳解

    Android RecyclerView 基礎(chǔ)知識(shí)詳解

    本文主要介紹Android RecyclerView的資料,這里對(duì)RecyclerView 的基礎(chǔ)知識(shí)做了詳細(xì)講解,并附簡(jiǎn)單示例代碼幫助大家學(xué)習(xí)參考,有需要的小伙伴可以參考下
    2016-09-09

最新評(píng)論

广灵县| 辰溪县| 岑巩县| 禄丰县| 南木林县| 成安县| 小金县| 景东| 修武县| 西丰县| 宾川县| 甘南县| 高陵县| 兴仁县| 措美县| 从化市| 化隆| 和平县| 库尔勒市| 吉林省| 孟州市| 六安市| 罗定市| 习水县| 台北市| SHOW| 武城县| 永善县| 吉木萨尔县| 瓮安县| 五河县| 民县| 甘孜县| 高淳县| 余江县| 瑞昌市| 平湖市| 肇东市| 绥滨县| 沙坪坝区| 西畴县|