真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

ContentProvider怎么在Android項(xiàng)目中使用

ContentProvider怎么在Android項(xiàng)目中使用?相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

創(chuàng)新互聯(lián)是一家專業(yè)的成都網(wǎng)站建設(shè)公司,我們專注成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、網(wǎng)絡(luò)營(yíng)銷、企業(yè)網(wǎng)站建設(shè),友情鏈接,廣告投放為企業(yè)客戶提供一站式建站解決方案,能帶給客戶新的互聯(lián)網(wǎng)理念。從網(wǎng)站結(jié)構(gòu)的規(guī)劃UI設(shè)計(jì)到用戶體驗(yàn)提高,創(chuàng)新互聯(lián)力求做到盡善盡美。

一、概念及說(shuō)明

ContentProvider定義:

內(nèi)容提供者是一個(gè)Android應(yīng)用的基礎(chǔ)模塊,提供內(nèi)容給這個(gè)應(yīng)用,它們封裝數(shù)據(jù)和提供它給應(yīng)用通過(guò)這個(gè)ContentResolver接口,使用ContentProvider可以在不同的應(yīng)用程序之間共享數(shù)據(jù),android為常見(jiàn)的一些數(shù)據(jù)提供了ContentProvider(視頻、音頻),ContentProvider使用表的形式來(lái)組織數(shù)據(jù)。

 URI定義:

每一個(gè)ContentProvider都擁有一個(gè)公共的URI,這個(gè)URI用于表示這個(gè)ContentProvider所提供的數(shù)據(jù)。android所提供ContentProvider都存放在android.provider。

二、實(shí)現(xiàn)ContentProvider的過(guò)程

1。定義ContentProvider所需要的常量(最主要的是定義CONTENT_URI,CONTENT_URI是Uri類型,事實(shí)是通過(guò)字符串解析得到)

//定義ContentProvider所需要的常量 
public class FirstProviderMetaData { 
 
  // AUTHORIY等于自己的創(chuàng)建ContentProvider類的完全路徑 
  public static final String AUTHORIY = "com.example.firstconent.FirstContentProvider"; 
 
  // 數(shù)據(jù)庫(kù)的名稱 
  public static final String DATABASE_NAME = "FirstProvider.db"; 
 
  // BaseColumns有兩個(gè)字段_id和_count 
  public static final class UserTableMetaData implements BaseColumns { 
    // 表名 
    public static final String TABLE_NAME = "t_user"; 
    // 訪問(wèn)該ContentProvider的URI 
    public static final Uri CONTENT_URI = Uri 
        .parse("content://" + AUTHORIY); 
 
    // 表的數(shù)據(jù)類型 
    public static final String CONTENT_TYPE = "vnd.android.cursor.dir/users"; 
    // 一列的數(shù)據(jù)類型 
    public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/users"; 
 
    // 一個(gè)字段 
    public static final String USER_NAME = "name"; 
 
    // 默認(rèn)排序 
    public static final String DEFAULT_SORT_ORDER = "_id desc"; 
  } 
} 

2。定義一個(gè)類,繼承ContentProvider

3。實(shí)現(xiàn)query,insert,update,delete,getType和onCreate方法

(1).定義UriMatcher

// 匹配Uri,檢查Uri的合法性 
  public static final UriMatcher uriMatcher; 
  public static final int INCOMING_USER_COLLECTION = 1; 
  public static final int INCOMING_USER_SIGNLE = 2; 
  static { 
    // 創(chuàng)建一個(gè)uri樹的根結(jié)點(diǎn) 
    uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); 
    // 添加uri匹配對(duì),如果這個(gè)匹配成功,則code值則會(huì)返回。 
    uriMatcher.addURI(FirstProviderMetaData.AUTHORIY, "/t_user", 
        INCOMING_USER_COLLECTION); 
    uriMatcher.addURI(FirstProviderMetaData.AUTHORIY, "/t_user/#", 
        INCOMING_USER_SIGNLE); 
 
  } 

(2).重寫getType方法

// 根據(jù)傳入uri,所回該uri所表示的數(shù)據(jù)類型 
  @Override 
  public String getType(Uri uri) { 
    // TODO Auto-generated method stub 
    switch (uriMatcher.match(uri)) { 
    case INCOMING_USER_COLLECTION: 
      return UserTableMetaData.CONTENT_TYPE; 
    case INCOMING_USER_SIGNLE: 
      return UserTableMetaData.CONTENT_ITEM_TYPE; 
    default: 
      throw new IllegalArgumentException("Unknown URI" + uri); 
    } 
 
  } 

(3).創(chuàng)建userProjectMap哈希Map靜態(tài)對(duì)象

public static HashMap userProjectMap; 
  static { 
    userProjectMap = new HashMap(); 
    userProjectMap.put(UserTableMetaData._ID, UserTableMetaData._ID); 
    userProjectMap.put(UserTableMetaData.USER_NAME, 
        UserTableMetaData.USER_NAME); 
  } 

(4).重寫insert方法

// 該方法返回值是一個(gè)uri,這個(gè)uri表示的剛剛使用這個(gè)方法所插入的數(shù)據(jù) 
  @Override 
  public Uri insert(Uri uri, ContentValues values) { 
    // TODO Auto-generated method stub 
    SQLiteDatabase db = dbHelper.getWritableDatabase(); 
    // rowId是新插入數(shù)據(jù)的id 
    long rowId = db.insert(UserTableMetaData.TABLE_NAME, null, values); 
    // 正常插入,-1為出常錯(cuò)誤 
    if (rowId != -1) { 
      // 添加一個(gè)id到這個(gè)路徑的結(jié)尾 
      Uri insertUserUri = ContentUris.withAppendedId( 
          UserTableMetaData.CONTENT_URI, rowId); 
      // 得到一個(gè)ContentResolver實(shí)例. 
      ContentResolver cr = this.getContext().getContentResolver(); 
      // 通辭呈數(shù)據(jù)改變 
      cr.notifyChange(insertUserUri, null); 
 
      return insertUserUri; 
    } else { 
      throw new SQLException("Failed to insert row into" + uri); 
    } 
  } 

(5).重寫query方法

@Override 
  public Cursor query(Uri uri, String[] projection, String selection, 
      String[] selectionArgs, String sortOrder) { 
    // TODO Auto-generated method stub 
    SQLiteQueryBuilder sqb = new SQLiteQueryBuilder(); 
    switch (uriMatcher.match(uri)) { 
    case INCOMING_USER_COLLECTION: 
      sqb.setTables(UserTableMetaData.TABLE_NAME); 
      sqb.setProjectionMap(userProjectMap); 
      break; 
    case INCOMING_USER_SIGNLE: 
      sqb.setTables(UserTableMetaData.TABLE_NAME); 
      sqb.setProjectionMap(userProjectMap); 
 
      String idKey = UserTableMetaData._ID; 
      // 1得到path集合 
      // 2取它的集合的第2個(gè)元素 
      // 例如:CONTENT_URI等于content://com.example.firstconent.FirstContentProvider/t_user/id, 
      // content://為協(xié)議 
      // com.example.firstconent.FirstContentProvider為authoriy 
      // /t_user/id為path 
      String idValue = uri.getPathSegments().get(1); 
 
      sqb.appendWhere(idKey + "=" + idValue); 
      break; 
    } 
    String orderBy = null; 
    if (TextUtils.isEmpty(sortOrder)) { 
      orderBy = UserTableMetaData.DEFAULT_SORT_ORDER; 
    } else { 
      orderBy = sortOrder; 
    } 
    SQLiteDatabase db = dbHelper.getWritableDatabase(); 
    Cursor cursor = sqb.query(db, projection, selection, selectionArgs, 
        null, null, orderBy); 
    ContentResolver cr = this.getContext().getContentResolver(); 
    // 通適數(shù)據(jù)變動(dòng) 
    cursor.setNotificationUri(cr, uri); 
    return cursor; 
  } 

4。在AndroidManifest.xml中聲明

 
    

看完上述內(nèi)容,你們掌握 ContentProvider怎么在Android項(xiàng)目中使用的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!


本文標(biāo)題:ContentProvider怎么在Android項(xiàng)目中使用
分享路徑:http://weahome.cn/article/jsjehh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部