ContentProvider 用法

有问题请加:Q群: 241359063  共同走向创业学习之旅。
原创:kylin_zeng  http://blog.chinaunix.net/uid/23795897.html
在此感谢mars 老师的帮助。
转载请注明原创出处,尊重他人的劳动成果。


一、ContentProvider作用
1、contentProvider提供为存储和获取数据提供统一的接口。
2、可以再不同的应用程序之间共享数据。
3、android 为常见的一些数据提供了contentProvider。如果视频,图片等。


二、通过URI找到某一个ContentProvider:
1、每一个ContentProvider都拥有一个公共的URI,这个URI用于表示这个CP 所提供的数据。
2、Android所提供的CP都存放在android.provider包中


三、CP提供的函数:
1、query() 查询。
2、insert() 插入.
3、update()  更新。
4、delete()  删除。
5、getType()  得到数据的类型。
6、onCreate()  创建时的回调函数。


四、实现CP的过程:
1、定义CONTENT_URI常量。
2、定义一个类,继承CP
3、实现上面的方法。
4、在AndroidManifest.xml中进行声明。


五、实现,CONTENT_TYPE="vnd.android.cursor.dir/随便名字"  //整张表,很多数据。
          CONTENT_TYPE_ITEM="vnd.android.cursor.item/随便名字 //某一个数据。

例:

1、在AndroidManifest.xml定义
<provider android:name="mars.cp.FirstContentProvider"
 android:authorities="mars.cp.FirstContentProvider"/>

二、创建CPActivity.java

点击(此处)折叠或打开

  1.       创建两个按钮,插入和查询
  2.        queryButton = (Button) findViewById(R.id.query);
  3.         queryButton.setOnClickListener(new QueryListener());
  4.         insertButton = (Button) findViewById(R.id.insert);
  5.         insertButton.setOnClickListener(new InsertListener());

击(此处)折叠或打开

  1. class InsertListener implements OnClickListener {

  2.         @Override
  3.         public void onClick(View v) {
  4.             // TODO Auto-generated method stub
  5.             ContentValues values = new ContentValues();
  6.             values.put(FirstProviderMetaData.UserTableMetaData.USER_NAME,
  7.                     "zhangsan");
  8.             Uri uri = getContentResolver()
  9.                     .insert(
  10.                             FirstProviderMetaData.UserTableMetaData.CONTENT_URI,
  11.                             values);
  12.             System.out.println("uri--->" + uri.toString());
  13.         }

  14.     }

  15.     class QueryListener implements OnClickListener {

  16.         @Override
  17.         public void onClick(View v) {
  18.             // TODO Auto-generated method stub
  19.             Cursor c = getContentResolver().query(
  20.                     FirstProviderMetaData.UserTableMetaData.CONTENT_URI, null,
  21.                     null, null, null);
  22.             while(c.moveToNext()){
  23.                 System.out.println(c.getString(c.getColumnIndex(UserTableMetaData.USER_NAME)));
  24.             }
  25.         }

  26.     }




三、创建FirstProviderMetaData.java:

点击(此处)折叠或打开

  1. public class FirstProviderMetaData {
  2.     public static final String AUTHORIY = "mars.cp.FirstContentProvider";
  3.     //数据库名称
  4.     public static final String DATABASE_NAME = "FirstProvider.db";
  5.     //数据库的版本
  6.     public static final int DATABASE_VERSION = 1;
  7.     //表名
  8.     public static final String USERS_TABLE_NAME = "users";
  9.     
  10.     public static final class UserTableMetaData implements BaseColumns{
  11.         //表名
  12.         public static final String TABLE_NAME = "users";
  13.         //访问该ContentProvider的URI
  14.         public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORIY + "/users");
  15.         //该ContentProvider所返回的数据类型的定义
  16.         public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.firstprovider.user";
  17.         public static final String CONTENT_TYPE_ITEM = "vnd.android.cursor.item/vnd.firstprovider.user";
  18.         //列名
  19.         public static final String USER_NAME = "name";
  20.         //默认的排序方法
  21.         public static final String DEFAULT_SORT_ORDER = "_id desc";
  22.     }
  23. }

四、创建CPActivity.java:

击(此处)折叠或打开

  1. public class FirstContentProvider extends ContentProvider {

  2.     public static final UriMatcher uriMatcher;
  3.     public static final int INCOMING_USER_COLLECTION = 1;
  4.     public static final int INCOMING_USER_SINGLE = 2;
  5.     private DatabaseHelper dh;
  6.     static {
  7.         uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
  8.         uriMatcher.addURI(FirstProviderMetaData.AUTHORIY, "/users",
  9.                 INCOMING_USER_COLLECTION);
  10.         uriMatcher.addURI(FirstProviderMetaData.AUTHORIY, "/users/#",
  11.                 INCOMING_USER_SINGLE);
  12.     }
  13.     
  14.     public static HashMap<String,String> userProjectionMap;
  15.     static
  16.     {
  17.         userProjectionMap = new HashMap<String,String>();
  18.         userProjectionMap.put(UserTableMetaData._ID,UserTableMetaData._ID);
  19.         userProjectionMap.put(UserTableMetaData.USER_NAME, UserTableMetaData.USER_NAME);
  20.     }
  21.     @Override
  22.     public int delete(Uri arg0, String arg1, String[] arg2) {
  23.         // TODO Auto-generated method stub
  24.         System.out.println("delete");
  25.         return 0;
  26.     }

  27.     //根据传入的URI,返回该URI所表示的数据类型
  28.     @Override
  29.     public String getType(Uri uri) {
  30.         // TODO Auto-generated method stub
  31.         System.out.println("getType");
  32.         switch(uriMatcher.match(uri)){
  33.         case INCOMING_USER_COLLECTION:
  34.             return UserTableMetaData.CONTENT_TYPE;
  35.         case INCOMING_USER_SINGLE:
  36.             return UserTableMetaData.CONTENT_TYPE_ITEM;
  37.         default:
  38.             throw new IllegalArgumentException("Unknown URI" + uri);
  39.         }
  40.     }

  41.     /**
  42.      * 该函数的返回值是一个Uri,这个Uri表示的是刚刚使用这个函数所插入的数据
  43.      * content://mars.cp.FirstContentProvider/users/1
  44.      */
  45.     @Override
  46.     public Uri insert(Uri uri, ContentValues values) {
  47.         System.out.println("insert");
  48.         SQLiteDatabase db = dh.getWritableDatabase();
  49.         long rowId = db.insert(UserTableMetaData.TABLE_NAME, null, values);
  50.         if(rowId > 0){
  51.             Uri insertedUserUri = ContentUris.withAppendedId(UserTableMetaData.CONTENT_URI, rowId);
  52.             //通知监听器,数据已经改变
  53.             getContext().getContentResolver().notifyChange(insertedUserUri, null);
  54.             return insertedUserUri;
  55.         }
  56.         throw new SQLException("Failed to insert row into" + uri);
  57.     }

  58.     //是一个回调方法,所以说在ContentProvider创建的时候执行
  59.     @Override
  60.     public boolean onCreate() {
  61.         //打开数据库
  62.         dh = new DatabaseHelper(getContext(),FirstProviderMetaData.DATABASE_NAME);
  63.         System.out.println("onCreate");
  64.         return true;
  65.     }

  66.     @Override
  67.     public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
  68.             String sortOrder) {
  69.         SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
  70.         switch(uriMatcher.match(uri)){
  71.         case INCOMING_USER_COLLECTION:
  72.             qb.setTables(UserTableMetaData.TABLE_NAME);
  73.             qb.setProjectionMap(userProjectionMap);
  74.             break;
  75.         case INCOMING_USER_SINGLE:
  76.             qb.setTables(UserTableMetaData.TABLE_NAME);
  77.             qb.setProjectionMap(userProjectionMap);
  78.             qb.appendWhere(UserTableMetaData._ID + "=" + uri.getPathSegments().get(1));
  79.             break;
  80.         }
  81.         String orderBy;
  82.         if(TextUtils.isEmpty(sortOrder)){
  83.             orderBy = UserTableMetaData.DEFAULT_SORT_ORDER;
  84.         }
  85.         else{
  86.             orderBy = sortOrder;
  87.         }
  88.         SQLiteDatabase db = dh.getWritableDatabase();
  89.         Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, orderBy);
  90.         c.setNotificationUri(getContext().getContentResolver(), uri);
  91.         System.out.println("query");
  92.         return c;
  93.     }

  94.     @Override
  95.     public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) {
  96.         // TODO Auto-generated method stub
  97.         System.out.println("update");
  98.         return 0;
  99.     }

  100. }


19集Lesson_19_code.zip


<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(5) | 评论(0) | 转发(0) |
0

上一篇:linux pwm 应用

下一篇:android xml文件的解析

给主人留下些什么吧!~~
评论热议
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值