android内容提供者

android数据的存储方式大体上来书有四种:SharedPreferences,File,SQLite,ContentProvider

做了个ContentProvider的demo

ContentProvider翻译成中文是内容提供者,肯定有提供方和调用方。

数据提供方的实现:

流程:分为两步

     (1)  编写一个类继承自ContentProvider类,会有很多方法可以实现,根据具体需求选择自己要实现的

public class MyContentProvider extends ContentProvider {

 private static UriMatcher matcher;
 //请求唯一标示
 private static final String CONNPATH = "com.mycontentprovider";
 private static final int ALL_WORD = 1;
 private static final int PAGE_WORD = 2; 
 private static final String DATABASE_ALL = "all";
 private static final String DATABASE_PAGE = "page";
 private SQLiteDatabase database;
 static{
  //出事换UriMatcher
  matcher = new UriMatcher(UriMatcher.NO_MATCH);
  matcher.addURI(CONNPATH, DATABASE_ALL, ALL_WORD);
  matcher.addURI(CONNPATH, DATABASE_PAGE, PAGE_WORD);
  
 }
 @Override
 public int delete(Uri arg0, String arg1, String[] arg2) {
  // TODO Auto-generated method stub
  return 0;
 }

 @Override
 public String getType(Uri arg0) {
  // TODO Auto-generated method stub
  return null;
 }

 @Override
 public Uri insert(Uri arg0, ContentValues arg1) {
  // TODO Auto-generated method stub
  return null;
 }
 @Override
 public boolean onCreate() {
  //得到SqliteDatabase
  database = DBHelper.getInstance().openDatabase();
  return true;
 }

 @Override
 public Cursor query(Uri arg0, String[] arg1, String arg2, String[] arg3,
   String arg4) {
  Cursor cursor = null;
  switch (matcher.match(arg0)) {
  case ALL_WORD:
   cursor = database.query("tb_test",arg1, null,null, null,null,arg4);
   break;
  case PAGE_WORD:
     
   int pageCount =Integer.valueOf(arg3[0]);
   Log.d("debug","var2="+pageCount);
   int pageSize =Integer.valueOf(arg3[1]);
   Log.d("debug","var1="+pageSize);
   
   String sqlStr = "select id,name,sex from tb_test limit ?,?";
   // 从limit 10,100 表示表示从11条记录开始的100条记录
   cursor = database.rawQuery(sqlStr,
     new String[] { String.valueOf((pageCount - 1) * pageSize),
       String.valueOf(pageSize) });
   break;
  default:
   break;
  }
  return cursor;
 }
 
 @Override
 public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) {
  // TODO Auto-generated method stub
  return 0;
 }

}

     (2)  在AndroidManifest.xml 中的<application>节点下添加<provider>节点,注册路径和请求uri

<provider android:name="MyContentProvider" android:authorities="com.mycontentprovider" ></provider>

调用方:

一步就可以了

Activity实例对象的getContentResolver()方法得到ContentResolver对象就可以进行增删改查了

//请求Url
        String connPath = "content://com.mycontentprovider";
        //与数据提供方UriMatcher 添加的tag对应
        //查找所有
        String all = connPath+"/all";
        Cursor cursor =  getContentResolver().query(Uri.parse(all), new String[]{"id","name","sex"}, null, null, "id");

 

由调用方可以知道,最终请求的地址是: "content://com.mycontentprovider/all";

这个请求的可以分为三部分

(1)协议:content 谷歌规定的

(2)唯一标识:com.mycontentprovider 在android系统实例中必须唯一,与数据提供方注册是的uri一致

(3)请求数据的tag,与 数据提供方的UriMatcher添加的tag一致

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值