MyException - 我的异常网
当前位置:我的异常网» Android » Content Provider 总结

Content Provider 总结

www.MyException.Cn  网友分享于:2015-02-11  浏览:0次
Content Provider 小结

       Android中的四大组件之一ContentProvider,它支持多个应用间进行存储和读取数据等操作,实现不同应用间的数据共享。

       ContentProvider,解释为内容提供商。顾名思义,就是对外提供数据。其工作形式主要是ContentProvider以Uri的形式对外提供数据,允许其他应用访问或者修改数据,其他应用程序就使用ContentResolver根据ContentProvider提供的Uri去访问进行对数据的各种操作。

       实现数据共享的步骤:

     1,创建一个简单的数据库供ContentProvider进行操作。创建数据库方法:定义子类继承SQLiteOpenHelper,在onCreate()方法中申明SQL创建语句,用execSQL()创建。

     2,定义一个子类继承ContentProvider,然后在主配置文件中对你申明的ContentProvider进行注册!必须要注册!

     3,重写其中的各种方法,如getType(),insert(),delete(),update(),query()方法。,

          在其子类中,我们要做的很重要的一件事就是进行Uri的配置,使其他应用可以通过ContentResolver根据其Uri进行操作。这里我们就要用到UriMatcher类,它主要有两个方法:

        一个是addURI(String authority, String path, int code),它要做的就是添加Uri。authority表示其主配置文件中的注册授权,path表示要进行操作的表名,code是你自己定义的整数。

        另一个是match(Uri uri),uri就是你所要操作的uri地址,它返回一个整数,就是你之前自己定义的code。

        这两个方法就相当与加密和解码的功能。一个Uri就代表对特定数据的操作。

        在进行解析Uri的时候,我们需要对Uri结尾处的数字(即你所要操作表的行的id),这时候就要用到ContentUris,它用于获取Uri路径后面的ID部分,它有两个比较实用的方法:
     一个是 withAppendedId(uri, id)用于为路径加上ID部分
     另一个是parseId(uri)方法用于从路径中获取ID部分

     4,通过Context的getContentResolver()方法实例化ContentResolver。根据ContentProvider所提供的Uri进行数据访问和操作。

以下是我的操作代码:

主配置文件注册ContentProvider

1 <provider android:name=".StudentProvider"
2          android:authorities="com.example.android_contentprovider.StudentProvider">
3 </provider>
主配置文件

定义了一个Tools工具类便于操作

 1 package com.example.android_contentprovider;
 2 
 3 import android.net.Uri;
 4 
 5 public class Tools {
 6 
 7     public static final int VERSION = 1;// 数据库版本号
 8     public static final String DNAME = "student.db";// 数据库名称
 9     public static final String TABLE_NAME = "student";// 表名
10     public static final String ID="id";
11     public static final String PEOPLE_NAME="name";
12     public static final String ADDRESS="address";
13     public static final String SEX="sex";
14     public static final int     STUDENT=1;
15     public static final int STUDENTS=2;
16     public static final String AUTHORITY="com.example.android_contentprovider.StudentProvider";
17     public static final String  ONLY="vnd.android.cursor.item/"+TABLE_NAME;
18     public static final String  MULITY= "vnd.android.cursor.dir/"+TABLE_NAME;
19     public static final String URL="content://"+AUTHORITY+"/"+TABLE_NAME;
20 }
Tools.java

创建名为student的数据库

 1 package com.example.android_contentprovider;
 2 
 3 import android.content.Context;
 4 import android.database.DatabaseErrorHandler;
 5 import android.database.sqlite.SQLiteDatabase;
 6 import android.database.sqlite.SQLiteDatabase.CursorFactory;
 7 import android.database.sqlite.SQLiteOpenHelper;
 8 
 9 public class DbHelper extends SQLiteOpenHelper {
10 
11     public DbHelper(Context context) {
12         super(context, Tools.DNAME, null, Tools.VERSION);
13         // TODO Auto-generated constructor stub
14     }
15 
16     // 创建一个数据库
17 
18     @Override
19     public void onCreate(SQLiteDatabase db) {
20         // TODO Auto-generated method stub
21         String sql = "create table " + Tools.TABLE_NAME + " ( " + Tools.ID
22                 + " integer primary key autoincrement ," + Tools.PEOPLE_NAME
23                 + " varchar(64)," + Tools.ADDRESS + " varchar(64))";
24         db.execSQL(sql);
25     }
26 
27     @Override
28     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
29         // TODO Auto-generated method stub
30 
31     }
32 
33 }
DbHelper.java

创建子类继承ContentProvider,进行配置。

  1 package com.example.android_contentprovider;
  2 
  3 import android.R.integer;
  4 import android.R.string;
  5 import android.content.ContentProvider;
  6 import android.content.ContentUris;
  7 import android.content.ContentValues;
  8 import android.content.UriMatcher;
  9 import android.database.Cursor;
 10 import android.database.CursorJoiner.Result;
 11 import android.database.sqlite.SQLiteDatabase;
 12 import android.net.Uri;
 13 import android.provider.ContactsContract.Contacts.Data;
 14 import android.provider.SyncStateContract.Helpers;
 15 import android.util.Log;
 16 
 17 public class StudentProvider extends ContentProvider {
 18     // 实例化
 19     private DbHelper helper = null;
 20     public static final UriMatcher pUriMatcher = new UriMatcher(
 21             UriMatcher.NO_MATCH);
 22     static {
 23         pUriMatcher.addURI(Tools.AUTHORITY, Tools.TABLE_NAME + "/#",
 24                 Tools.STUDENT);
 25         pUriMatcher.addURI(Tools.AUTHORITY, Tools.TABLE_NAME, Tools.STUDENTS);
 26     }
 27 
 28     @Override
 29     public boolean onCreate() {
 30         // TODO Auto-generated method stub
 31         helper = new DbHelper(getContext());
 32         return false;
 33     }
 34 //进行查找操作
 35     @Override
 36     public Cursor query(Uri uri, String[] projection, String selection,
 37             String[] selectionArgs, String sortOrder) {
 38         // TODO Auto-generated method stub
 39         Cursor cursor = null;
 40         try {
 41             SQLiteDatabase database = helper.getWritableDatabase();
 42             int flag = pUriMatcher.match(uri);
 43             switch (flag) {
 44             case Tools.STUDENT:
 45                 long id = ContentUris.parseId(uri);
 46                 String where_values = " id = " + id;
 47 
 48                 if (selection != null && !selection.equals("")) {
 49                     where_values += " and " + selection;
 50                 }
 51                 cursor = database.query(Tools.TABLE_NAME, null, where_values,
 52                         selectionArgs, null, null, null);
 53                 break;
 54             case Tools.STUDENTS:
 55                 cursor = database.query(Tools.TABLE_NAME, null, selection,
 56                         selectionArgs, null, null, null);
 57                 break;
 58             }
 59         } catch (Exception e) {
 60             // TODO: handle exception
 61         }
 62         return cursor;
 63     }
 64 
 65     @Override
 66     public String getType(Uri uri) {
 67         // 得到匹配符
 68         int flag = pUriMatcher.match(uri);
 69         switch (flag) {
 70         case Tools.STUDENT:
 71             return Tools.ONLY;
 72         case Tools.STUDENTS:
 73             return Tools.MULITY;
 74         default:
 75             throw new IllegalArgumentException("Unknown URI" + uri);
 76         }
 77     }
 78 
 79     // 进行插入操作
 80     @Override
 81     public Uri insert(Uri uri, ContentValues values) {
 82         // TODO Auto-generated method stub
 83         Uri resultUri = null;
 84         int flag = pUriMatcher.match(uri);
 85         switch (flag) {
 86         case Tools.STUDENTS:
 87             SQLiteDatabase database = null;
 88             database = helper.getWritableDatabase();
 89             // id表示插入当前行的行号
 90             long id = database.insert(Tools.TABLE_NAME, null, values);
 91             resultUri = ContentUris.withAppendedId(uri, id);
 92             getContext().getContentResolver().notifyChange(resultUri, null);
 93             break;
 94 
 95         }
 96         Log.i("StudentProvider", resultUri.toString());
 97         return resultUri;
 98     }
 99 
100     // 进行删除操作
101     @Override
102     public int delete(Uri uri, String selection, String[] selectionArgs) {
103         // TODO Auto-generated method stub
104         int resultId = -1;
105         try {
106             SQLiteDatabase database = helper.getWritableDatabase();
107             int flag = pUriMatcher.match(uri);
108             switch (flag) {
109             case Tools.STUDENT:
110                 long id = ContentUris.parseId(uri);
111                 String where_values = "id= " + resultId;
112                 if (selection != null && !selection.equals("")) {
113                     where_values += " and " + selection;
114                 }
115                 resultId = database.delete(Tools.TABLE_NAME, where_values,
116                         selectionArgs);
117 
118                 break;
119             case Tools.STUDENTS:
120                 resultId = database.delete(Tools.TABLE_NAME, selection,
121                         selectionArgs);
122                 break;
123             }
124         } catch (Exception e) {
125             // TODO: handle exception
126         }
127 
128         return resultId;
129     }
130 //进行修改更新
131     @Override
132     public int update(Uri uri, ContentValues values, String selection,
133             String[] selectionArgs) {
134         // TODO Auto-generated method stub
135         int resultId = -1;
136         try {
137             // update table set name=?,address=? where id=?
138             long id = ContentUris.parseId(uri);
139             int flag = pUriMatcher.match(uri);
140             SQLiteDatabase database = helper.getWritableDatabase();
141             switch (flag) {
142             case Tools.STUDENT:
143                 String where_values = " id = " + id;
144                 if (selection != null && !selection.equals("")) {
145                     where_values += " and " + selection;
146                 }
147                 resultId = database.update(Tools.TABLE_NAME, values,
148                         where_values, selectionArgs);
149                 break;
150             }
151         } catch (Exception e) {
152             // TODO: handle exception
153         }
154         return resultId;
155     }
156 
157 }
StudentProvider.java

这里我注册了一个instrumentation单元测试。

 <instrumentation android:name="android.test.InstrumentationTestRunner"

                             android:targetPackage="com.example.android_contentprovider">

</instrumentation>

定义MyTest测试类继承AndroidTestCase

 1 package com.example.android_contentprovider;
 2 
 3 import android.content.ContentResolver;
 4 import android.content.ContentValues;
 5 import android.database.Cursor;
 6 import android.net.Uri;
 7 import android.test.AndroidTestCase;
 8 
 9 public class MyTest extends AndroidTestCase {
10 
11     public MyTest() {
12         // TODO Auto-generated constructor stub
13     }
14 
15     public void insert() {
16         ContentResolver contentResolver = getContext().getContentResolver();
17         Uri url = Uri.parse(Tools.URL);
18         ContentValues values = new ContentValues();
19         values.put(Tools.PEOPLE_NAME, "王五");
20         values.put(Tools.ADDRESS, "北京");
21         contentResolver.insert(url, values);
22     }
23 
24     public void delete() {
25         ContentResolver contentResolver = getContext().getContentResolver();
26         Uri uri = Uri.parse(Tools.URL + "/1");
27         contentResolver.delete(uri, null, null);
28     }
29 
30     public void update() {
31         ContentResolver contentResolver = getContext().getContentResolver();
32         Uri uri = Uri.parse(Tools.URL + "/2");
33         ContentValues values = new ContentValues();
34         values.put(Tools.PEOPLE_NAME, "程洋");
35         values.put(Tools.ADDRESS, "上海");
36         contentResolver.update(uri, values, null, null);
37 
38     }
39 
40     public void query() {
41         ContentResolver contentResolver = getContext().getContentResolver();
42         Uri uri = Uri.parse(Tools.URL);
43         Cursor cursor = contentResolver.query(uri, null, null, null, null);
44         while (cursor.moveToNext()) {
45             // 输出查询该条记录的名字
46             System.out
47                     .println("你所查找的学生为:"
48                             + cursor.getString(cursor
49                                     .getColumnIndex(Tools.PEOPLE_NAME))
50                             + ";地址为:"
51                             + cursor.getString(cursor
52                                     .getColumnIndex(Tools.ADDRESS)));
53         }
54     }
55 }
MyTest.java

 

note:正学习Android之中,不足的地方还有很多望见谅。       

       

文章评论

什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
如何成为一名黑客
如何成为一名黑客
为什么程序员都是夜猫子
为什么程序员都是夜猫子
Java程序员必看电影
Java程序员必看电影
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
那些争议最大的编程观点
那些争议最大的编程观点
10个调试和排错的小建议
10个调试和排错的小建议
鲜为人知的编程真相
鲜为人知的编程真相
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
我是如何打败拖延症的
我是如何打败拖延症的
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
中美印日四国程序员比较
中美印日四国程序员比较
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
漫画:程序员的工作
漫画:程序员的工作
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
代码女神横空出世
代码女神横空出世
程序员应该关注的一些事儿
程序员应该关注的一些事儿
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
老程序员的下场
老程序员的下场
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
程序员都该阅读的书
程序员都该阅读的书
编程语言是女人
编程语言是女人
旅行,写作,编程
旅行,写作,编程
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
程序员和编码员之间的区别
程序员和编码员之间的区别
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
程序员的鄙视链
程序员的鄙视链
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
一个程序员的时间管理
一个程序员的时间管理
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
我的丈夫是个程序员
我的丈夫是个程序员
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
程序员必看的十大电影
程序员必看的十大电影
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
 程序员的样子
程序员的样子
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
总结2014中国互联网十大段子
总结2014中国互联网十大段子
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有