a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

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

淺談Android Content Provider的使用

2020-04-11 12:28:19
字體:
供稿:網(wǎng)友

Content Provider:一個組件,必須放在應(yīng)用的主包或應(yīng)用的子包之下;

組件的配置需要在清單文件中進(jìn)行配置;content provider需要在application節(jié)點中進(jìn)行配置;
內(nèi)容提供者在應(yīng)用中的作用是對外共享數(shù)據(jù)(任意類型的數(shù)據(jù))使用的,別的程序可以對數(shù)據(jù)進(jìn)行CRUD,如通訊錄;
如果采用文件的方式對外共享數(shù)據(jù),會因為文件的類型不同而需要使用不同的api訪問方式導(dǎo)致訪問繁雜,而內(nèi)容提供者提供了統(tǒng)一的api對數(shù)據(jù)進(jìn)行操作;
<provider
  android:name=".PersonProvider"<!-- 內(nèi)容提供者類的名稱 -->
  android:authorities="cn.wordtech.providers.personprovider"

  android:exported="false" ><!-- 解決 android Permission Denial error!,在監(jiān)聽內(nèi)容提供者數(shù)據(jù)發(fā)生變化時需要配置此項 -->
</provider>

另:  
android:authorities:為內(nèi)容提供者指定一個唯一的標(biāo)識,這樣別的應(yīng)用才可以唯一獲取此provider;

Uri 代表了要操作的數(shù)據(jù);
Uri主要包含兩部分的信息:1>>需要操作的ContentProvider,2>>對ContentProvider中的什么數(shù)據(jù)進(jìn)行操作

ContentProvider(內(nèi)容提供者)的scheme已經(jīng)由Android所規(guī)定,scheme為:content://
主機(jī)名(或Authority)用于唯一標(biāo)識這個ContentProvider,外部調(diào)用者可以根據(jù)此標(biāo)識來找到它,
路徑(path)可以用來表示我們要操作的數(shù)據(jù),路徑的構(gòu)建根據(jù)業(yè)務(wù)而定。
ex:
要操作person表中id為10的記錄,可以構(gòu)建這樣的路徑:/person/10
要操作person表中id為10的記錄的name字段,可以構(gòu)建這樣的路徑:/person/10/name
要操作person表中的所有記錄,可以構(gòu)建這樣的路徑:/person
要操作XXX表中的記錄,可以構(gòu)建這樣的路徑:/XXX
要操作的數(shù)據(jù)不一定是數(shù)據(jù)庫中的文件,也可以是文件,xml或網(wǎng)絡(luò)等其它方式
ex:
要操作xml文件中person節(jié)點下的name節(jié)點,可以構(gòu)建這樣的路徑:/person/name

復(fù)制代碼 代碼如下:

public class PersonProvider extends ContentProvider {// Content Provider需要繼承自ContentProvider類
 // 刪改查中,都有兩種情況:
 // person 對整個表進(jìn)行操作
 // person/id 對表中的與id對應(yīng)記錄進(jìn)行操作
 private DBOpenHelper dbOpenHelper;
 private static final UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH);// new UriMatcher(code);code即為匹配不成功時返回的值;
 private static final int PERSONS = 1;
 private static final int PERSON = 2;
 // 設(shè)置匹配項
 static {
  MATCHER.addURI("cn.wordtech.providers.personprovider", "person",PERSONS);
  MATCHER.addURI("cn.wordtech.providers.personprovider", "person/#",PERSON);// #號表示數(shù)字
 }
 // content://cn.wordtech.providers.personprovider/person
 @Override
 public boolean onCreate() {
  // 由系統(tǒng)調(diào)用,當(dāng)ContentProvider的實例被創(chuàng)建出來的時候被調(diào)用,Android開機(jī)后,當(dāng)?shù)谝淮斡袘?yīng)用訪問ContentProvider時才創(chuàng)建ContentProvider;
  dbOpenHelper = new DBOpenHelper(getContext(), 1);
  return false;
 }

 // 可以供外部的應(yīng)用查詢數(shù)據(jù),返回查詢得到的游標(biāo)對象
 @Override
 public Cursor query(Uri uri, String[] projection, String selection,
   String[] selectionArgs, String sortOrder) {
  SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
  switch (MATCHER.match(uri)) {
  case 1:
   return db.query("person", projection, selection, selectionArgs,
     null, null, sortOrder);
  case 2:
   long rowid = ContentUris.parseId(uri);// 返回要操作的id
   String where = "personid=" + rowid;
   if (selection != null && !"".equals(selection.trim())) {
    where += "and" + selection;
   }
   return db.query("person", projection, where, selectionArgs, null,
     null, sortOrder);

  default:
   throw new IllegalArgumentException("");
  }
 }

 // 此方法用于返回目前Uri所代表的數(shù)據(jù)的MIME類型,
 // 如果操作的數(shù)據(jù)屬于集合類型,則MIME字符串就以"vnd.android.cursor.dir"開頭
 // 如果操作的數(shù)據(jù)屬于非集合類型,則MIME字符串就以"vnd.android.cursor.item"開頭
 @Override
 public String getType(Uri uri) {
  switch (MATCHER.match(uri)) {
  case 1:
   return "vnd.android.cursor.dir/person";
  case 2:
   return "vnd.android.cursor.item/person";
  default:
   throw new IllegalArgumentException("");
  }
 }

 // 此方法需要返回操作記錄對應(yīng)的Uri
 @Override
 public Uri insert(Uri uri, ContentValues values) {
  SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
  switch (MATCHER.match(uri)) {
  case 1:
   long rowid = db.insert("person", "", values);// 返回行號?主鍵值
   // Uri insertUri = Uri
   // .parse("content://com.sqlite.PersonProvider/person/"
   // + rowid);
   Uri insertUri = ContentUris.withAppendedId(uri, rowid);
   return insertUri;
  default:
   throw new IllegalArgumentException("this is Unknow Uri:" + uri);
  }

 }

 // 返回受影響的行數(shù)
 @Override
 public int delete(Uri uri, String selection, String[] selectionArgs) {
  SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
  int num = 0;
  switch (MATCHER.match(uri)) {
  case 1:
   num = db.delete("person", selection, selectionArgs);// 清空整個表
   break;
  case 2:
   long rowid = ContentUris.parseId(uri);// 返回要操作的id
   String where = "personid=" + rowid;
   if (selection != null && !"".equals(selection.trim())) {
    where += "and" + selection;
   }
   num = db.delete("person", where, selectionArgs);
   break;
  default:
   throw new IllegalArgumentException("");
  }
  return num;
 }

 @Override // 返回受影響的行數(shù)
 public int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {
  SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
  int num = 0;
  switch (MATCHER.match(uri)) {
  case 1:
   num = db.update("person", values, selection, selectionArgs);
   break;
  case 2:
   long rowid = ContentUris.parseId(uri);// 返回要操作的id
   String where = "personid=" + rowid;
   if (selection != null && !"".equals(selection.trim())) {
    where += "and" + selection;
   }
   num = db.update("person", values, where, selectionArgs);
   break;
  default:
   throw new IllegalArgumentException("");
  }
  return num;
 }


下面是對前一個類進(jìn)行測試
復(fù)制代碼 代碼如下:

public class AccessContentProviderTest extends AndroidTestCase {
 public void testinsert() {
  Uri uri = Uri.parse("content://cn.wordtech.providers.personprovider/person");// 根據(jù)標(biāo)識名得到內(nèi)容提供者
  ContentResolver cr = this.getContext().getContentResolver(); // This class provides applications access to the content model
  ContentValues values = new ContentValues();
  values.put("name", "Livingstone");
  values.put("phone", "110");
  values.put("amount", "1111111111");
  cr.insert(uri, values);// 在cr的內(nèi)部會調(diào)用內(nèi)容提供者的值;
 }

 public void testdelete() {
  Uri uri = Uri.parse("content://cn.wordtech.providers.personprovider/person/1");// 根據(jù)標(biāo)識名得到內(nèi)容提供者
  ContentResolver cr = this.getContext().getContentResolver();
  cr.delete(uri, null, null);
 }

 public void testupdate() {
  Uri uri = Uri.parse("content://cn.wordtech.providers.personprovider/person/2");// 根據(jù)標(biāo)識名得到內(nèi)容提供者
  ContentResolver cr = this.getContext().getContentResolver();
  ContentValues values = new ContentValues();
  values.put("name", "Livingstone11");
  cr.update(uri, values, null, null);
 }

 public void testquery() {
  Uri uri = Uri.parse("content://cn.wordtech.providers.personprovider/person");// 根據(jù)標(biāo)識名得到內(nèi)容提供者
  ContentResolver cr = this.getContext().getContentResolver();
  Cursor cursor = cr.query(uri, null, null, null, "personid asc");
  while (cursor.moveToNext()) {
   String name = cursor.getString(cursor.getColumnIndex("name"));
   Log.i("Name", name);
  }
 }
}

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 巨大黑人极品videos精品 | 欧美乱妇高清无乱码 | 国产一极片| 91久久精品www人人做人人爽 | 亚洲欧美一区二区三区在线 | 亚洲一级毛片 | 欧美视频一区二区三区四区 | 激情久久久 | 精品一区二区在线观看 | 亚洲啊v| 久久精品色欧美aⅴ一区二区 | 久久综合色88| 亚洲精品午夜国产va久久成人 | av男人电影天堂 | 91蜜桃婷婷亚洲最大一区 | 国产一区二区三区久久久久久久久 | 国产一级淫免费播放m | 综合色婷婷 | 国产精品久久久久久久7电影 | 黄网址在线观看 | 午夜影视在线观看 | 成人免费网站www网站高清 | 日本久久二区 | 91网在线观看 | 亚洲人成人一区二区在线观看 | 欧美一区二区三区在线观看视频 | 精品国自产在线观看 | 欧美精品免费在线观看 | www狠狠操| 岛国免费av | 国产九九九 | 午夜精品一区二区三区免费视频 | 日韩欧美在线观看视频网站 | 欧美精产国品一二三区 | 国产欧美精品区一区二区三区 | 亚洲精品在线视频 | 在线免费观看黄色小视频 | 国产看片网站 | 欧美成人一区二区 | 91精品国产777在线观看 | 亚洲视频欧美视频 |