亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

淺談Android Content Provider的使用

2020-04-11 12:28:19
字體:
來源:轉載
供稿:網友

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

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

  android:exported="false" ><!-- 解決 android Permission Denial error!,在監聽內容提供者數據發生變化時需要配置此項 -->
</provider>

另:  
android:authorities:為內容提供者指定一個唯一的標識,這樣別的應用才可以唯一獲取此provider;

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

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

復制代碼 代碼如下:

public class PersonProvider extends ContentProvider {// Content Provider需要繼承自ContentProvider類
 // 刪改查中,都有兩種情況:
 // person 對整個表進行操作
 // person/id 對表中的與id對應記錄進行操作
 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;
 // 設置匹配項
 static {
  MATCHER.addURI("cn.wordtech.providers.personprovider", "person",PERSONS);
  MATCHER.addURI("cn.wordtech.providers.personprovider", "person/#",PERSON);// #號表示數字
 }
 // content://cn.wordtech.providers.personprovider/person
 @Override
 public boolean onCreate() {
  // 由系統調用,當ContentProvider的實例被創建出來的時候被調用,Android開機后,當第一次有應用訪問ContentProvider時才創建ContentProvider;
  dbOpenHelper = new DBOpenHelper(getContext(), 1);
  return false;
 }

 // 可以供外部的應用查詢數據,返回查詢得到的游標對象
 @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所代表的數據的MIME類型,
 // 如果操作的數據屬于集合類型,則MIME字符串就以"vnd.android.cursor.dir"開頭
 // 如果操作的數據屬于非集合類型,則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("");
  }
 }

 // 此方法需要返回操作記錄對應的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);
  }

 }

 // 返回受影響的行數
 @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 // 返回受影響的行數
 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;
 }


下面是對前一個類進行測試
復制代碼 代碼如下:

public class AccessContentProviderTest extends AndroidTestCase {
 public void testinsert() {
  Uri uri = Uri.parse("content://cn.wordtech.providers.personprovider/person");// 根據標識名得到內容提供者
  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的內部會調用內容提供者的值;
 }

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

 public void testupdate() {
  Uri uri = Uri.parse("content://cn.wordtech.providers.personprovider/person/2");// 根據標識名得到內容提供者
  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");// 根據標識名得到內容提供者
  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);
  }
 }
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品大陆在线观看| 国产丝袜精品视频| 4438全国亚洲精品在线观看视频| 欧美激情视频给我| 日本成人在线视频网址| 日韩中文字幕第一页| 91精品久久久久久久久久久| 欧美日韩成人在线观看| 日本精品久久电影| 久久av红桃一区二区小说| 久久久国产精品免费| 欧美最猛性xxxxx免费| 欧美一级在线播放| 国产精品第一页在线| 国产亚洲激情视频在线| 国产91精品网站| 亚洲精选在线观看| 亚洲欧美中文在线视频| 久久久精品999| 亚洲精品动漫100p| 国产成人中文字幕| 538国产精品一区二区在线| 一区二区三区天堂av| 欧美日韩国产一区在线| 日韩av手机在线观看| 国产在线观看不卡| 久久久爽爽爽美女图片| 成人在线中文字幕| 国产男女猛烈无遮挡91| 成人午夜两性视频| 国产不卡一区二区在线播放| 欧美日韩美女在线| 欧美高清视频在线播放| 亚洲天堂久久av| 欧美极品欧美精品欧美视频| 正在播放国产一区| 9.1国产丝袜在线观看| 国产亚洲视频在线| 日本精品在线视频| 午夜精品久久久久久久久久久久| 国产在线观看不卡| 色婷婷综合成人| 最近2019中文免费高清视频观看www99| 精品中文视频在线| 色系列之999| 在线精品视频视频中文字幕| 欧美精品中文字幕一区| 国产精品自产拍在线观看| 亚洲国产精品国自产拍av秋霞| 中文字幕av日韩| 亚洲人成在线观看| 欧美极品少妇xxxxⅹ喷水| 国产女人18毛片水18精品| 精品毛片网大全| 欧美电影免费观看高清| 欧美专区在线观看| 26uuu亚洲伊人春色| 久久久精品国产网站| 久久久91精品国产一区不卡| 国产精品成人一区| 91夜夜揉人人捏人人添红杏| 久久久久久91香蕉国产| 亚洲在线观看视频网站| 国产精品99久久久久久久久久久久| 精品中文字幕乱| 热re99久久精品国产66热| 亚洲女人天堂视频| 久久久亚洲欧洲日产国码aⅴ| 日韩免费中文字幕| 欧美精品免费在线| 成人黄色在线观看| 国产精品一区二区av影院萌芽| 欧美午夜激情小视频| 日韩成人中文电影| 欧美在线视频一区| 日韩精品视频中文在线观看| 这里只有精品丝袜| 欧美一二三视频| 亚洲国产精品美女| 亚洲国产精品网站| 中文字幕亚洲无线码在线一区| 亚洲精品国产精品国自产在线| 久久精品人人爽| 色综合久综合久久综合久鬼88| 亚洲免费电影一区| 亚洲午夜未删减在线观看| 黑人巨大精品欧美一区二区三区| 美女999久久久精品视频| 亚洲精品美女免费| 日韩高清电影好看的电视剧电影| 91久久国产婷婷一区二区| 欧美与黑人午夜性猛交久久久| 国模私拍视频一区| 成人在线国产精品| 国内精品视频久久| 国产欧美日韩中文字幕| 久久精品国产亚洲| 91精品视频专区| 在线亚洲国产精品网| 在线中文字幕日韩| 91精品视频在线免费观看| 欧美大学生性色视频| 高清日韩电视剧大全免费播放在线观看| 亚洲最新视频在线| 久久久久久久一区二区三区| 日韩欧美国产中文字幕| 国产精品美女免费| 欧美精品www在线观看| 欧美床上激情在线观看| 国产亚洲日本欧美韩国| 日韩av在线导航| 亚洲成色999久久网站| 亚洲无亚洲人成网站77777| 日韩精品在线免费观看视频| 亚洲美女在线观看| 日韩有码在线播放| 亚洲最大的成人网| 国产精品视频久久久| 91成品人片a无限观看| 疯狂做受xxxx高潮欧美日本| 国产精品久久久久久超碰| 欧美极品欧美精品欧美视频| 97av在线播放| 色yeye香蕉凹凸一区二区av| 欧美国产第一页| 欧美亚洲在线播放| 九色91av视频| 久久天堂av综合合色| 粉嫩av一区二区三区免费野| 久久综合国产精品台湾中文娱乐网| 欧美在线一区二区三区四| 九九九久久国产免费| 亚洲自拍中文字幕| 最新亚洲国产精品| 国产成人精品一区| 综合欧美国产视频二区| 精品丝袜一区二区三区| 国产欧美精品xxxx另类| 精品小视频在线| 久久在线免费观看视频| 国产日韩在线播放| 欧美有码在线观看视频| 亚洲色图av在线| 国产精品一区二区久久| 国产精品日韩精品| 欧美激情国产精品| x99av成人免费| 啪一啪鲁一鲁2019在线视频| 黑人极品videos精品欧美裸| 午夜精品久久久久久久99黑人| 国内免费精品永久在线视频| 成人情趣片在线观看免费| 欧美人交a欧美精品| 欧美视频在线观看免费网址| 国产精品揄拍500视频| 91夜夜未满十八勿入爽爽影院| 日韩精品极品在线观看播放免费视频| 欧美日韩国产限制| 亚洲日韩第一页| 亚洲永久在线观看| 国产日韩欧美综合| 日韩视频中文字幕| 欧美国产第一页| 久久激情视频久久|