Android存储--ContentProvider

来源:互联网 发布:java jsonarray清空 编辑:程序博客网 时间:2024/06/08 03:52
一, 什么是ContentProvider
是所有应用程序之间数据存储和检索的桥梁,  作用  是实现各个应用程序之间数据的共享
是应用程序之间数据共享的唯一方式
   注意:
如果想要访问内容提供者提供的数据, 那么需要通过 ContentResolver对象获取数据的内容
如果想要共享自己应用程序中的数据, 那么需要自定义一个内容提供者, 然后把自己的数据共享出去
二, 作用
将应用程序的私有数据向外提供一个访问的接口, 是基于URI的格式  ,向外提供数据访问的接口
三, URI   统一资源标识符   (在应用程序中是唯一的)
格式:  content://应用程序的包名.provider/表名(一般自定义)
,  分析
ContentResolver   内容解析器    负责解析ContentProvider暴露出来的数据   "客户端"
ContentProvider      内容提供者    负责暴露数据                "服务器"

实例:

1,访问联系人列表
1, 得到内容解析器对象:   ContentResolver
2, 通过URI格式  解析数据(Cursor)
3, 在清单文件中添加读取短信的权限

  raw_contacts (有多少个联系人 就有多少条数据)
_id     dispaly_name
  mimetypes(数据的类型)
_id   mimetype  (1  邮箱   5  电话    7 姓名)
  data(实际的内容)  同一个人会有多条数据,   姓名 , 电话,  邮箱  ....
_id  
raw_contact_id    (raw_contacts表的外键)
mimetype_id        (mimetypes的外键)

代码实现:

public class MainActivity extends Activity {private ListView lv;private SimpleAdapter adapter;private List<Map<String, Object>> data;private ContentResolver resolver;private Uri uri = ContactsContract.Contacts.CONTENT_URI;private Uri phoneuri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;private Uri emailuri = ContactsContract.CommonDataKinds.Email.CONTENT_URI;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);lv = (ListView) findViewById(R.id.lv);data = getData();adapter = new SimpleAdapter(this, data, R.layout.lvitem, new String[] {"id", "name", "phone", "email" }, new int[] { R.id.id,R.id.name, R.id.phone, R.id.email });lv.setAdapter(adapter);}private List<Map<String, Object>> getData() {// TODO Auto-generated method stubList<Map<String, Object>> resultdata = new ArrayList<Map<String, Object>>();Map<String, Object> map;// 获取数据resolver = getContentResolver();Cursor cursor = resolver.query(uri, null, null, null, null);while (cursor.moveToNext()) {map = new HashMap<String, Object>();int id = cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts._ID));String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));map.put("id", id);map.put("name", name);String phone = "该用户暂时没有电话";Cursor cursor1 = resolver.query(phoneuri, null, "raw_contact_id=?",new String[] { id + "" }, null);while (cursor1.moveToNext()) {phone = cursor1.getString(cursor1.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));}map.put("phone", phone);String email = "该用户暂时没有邮箱";Cursor emailCursor = resolver.query(emailuri, null,"raw_contact_id =?", new String[] { id + "" }, null);while (emailCursor.moveToNext()) {email = emailCursor.getString(emailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));}map.put("email", email);resultdata.add(map);}return resultdata;}}
自定义的ContentProvider
1, 定义一个类, 继承ContentProvider, 重写父类的6个方法
    onCreate()   初始化数据库的操作
    query(Uri uri,...)
    insert(Uri uri,...)
    delete(Uri uri,...)
    update(Uri uri,...)
    getType()  只实现, 不做处理
2, 声明ContentProvider的唯一标识(内容为小写的字母, 建议 : 包名+数据库的名称)
3, 声明访问数据库的Code码(是在CotentProvider暴露数据时, 使用)
4, 定义Uri的匹配器  UriMatcher , 并且实例化, 同时注册Uri
private static UriMatcher uriMatcher ;
static
{
uriMatcher  = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.add("唯一标识","路径(建议: 表名)",当前Uri对应的数据库的code码);
}
5, 定义一个数据库的帮助类, 并在onCreate() 方法中完成数据表的初始
6, 在相应的增 删  改  查 方法中, 通过Uri匹配器, 判断当前用户传入的Uri到底是操作那张表的code
if(uriMatcher.match(uri) == code)
{........}
7, 在清单文件中, 注册ContentProvider 
<provider    
android:name=""   说明注册的是那个CotentProvider   全类名
android:authorities=""   与CotentProvider中的 唯一标识完全一直
android:exported=""    声明当前应用程序  可以被外部的应用程序访问/>

实例:


public class DataOpenHelp extends SQLiteOpenHelper {public DataOpenHelp(Context context) {super(context, "nba", null, 1);// TODO Auto-generated constructor stub}@Overridepublic void onCreate(SQLiteDatabase db) {// TODO Auto-generated method stubdb.execSQL("create table t_user(_id integer primary key  autoincrement, uname,upwd,umoney)");db.execSQL("create table t_order(_id integer primary key  autoincrement, product_name,price,user_id)");db.execSQL("insert into t_user(uname,upwd,umoney) values('詹姆斯','123','100')");db.execSQL("insert into t_user(uname,upwd,umoney) values('科比','667','100')");db.execSQL("insert into t_user(uname,upwd,umoney) values('库里','321','100')");db.execSQL("insert into t_user(uname,upwd,umoney) values('汤普森','135','100')");db.execSQL("insert into t_user(uname,upwd,umoney) values('欧文','165','100')");db.execSQL("insert into t_user(uname,upwd,umoney) values('杜兰特','145','100')");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// TODO Auto-generated method stub}

public class UserContentProvider extends ContentProvider {private DataOpenHelp openHelp;private static final int USER_CODE = 0;private static final int ORDER_CODE = 1;private static UriMatcher uriMatcher;private static String AUTHORITY = "com.example.day46_contentprovider_03.nba";static {uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);uriMatcher.addURI(AUTHORITY, "t_user", 0);uriMatcher.addURI(AUTHORITY, "t_order", 1);}@Overridepublic boolean onCreate() {// TODO Auto-generated method stubopenHelp = new DataOpenHelp(getContext());return false;}@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {// TODO Auto-generated method stubSQLiteDatabase db = openHelp.getWritableDatabase();Cursor sCursor = null;switch (uriMatcher.match(uri)) {case USER_CODE:sCursor = db.query("t_user", null, selection, selectionArgs, null,null, null);break;case ORDER_CODE:sCursor = db.query("t_order", null, selection, selectionArgs, null,null, null);break;}return sCursor;}@Overridepublic String getType(Uri uri) {// TODO Auto-generated method stubreturn null;}@Overridepublic Uri insert(Uri uri, ContentValues values) {// TODO Auto-generated method stubSQLiteDatabase db = openHelp.getWritableDatabase();long id;if (uriMatcher.match(uri) == USER_CODE) {id = db.insert("t_user", null, values);return ContentUris.withAppendedId(uri, id);}if (uriMatcher.match(uri) == ORDER_CODE) {id = db.insert("t_order", null, values);return ContentUris.withAppendedId(uri, id);}return null;}@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {// TODO Auto-generated method stubSQLiteDatabase db = openHelp.getWritableDatabase();int count = 0;if (uriMatcher.match(uri) == USER_CODE) {count = db.delete("t_user", selection, selectionArgs);}return count;}@Overridepublic int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {SQLiteDatabase db = openHelp.getWritableDatabase();int count = 0;if (uriMatcher.match(uri) == USER_CODE) {count = db.update("t_user", values, selection, selectionArgs);}return count;}}

<provider             android:name="com.example.contentprovider_03DB.UserContentProvider"            android:authorities="com.example.day46_contentprovider_03.nba"            android:exported="true"            />
ContentResolver部分:

public class MainActivity extends Activity {private ListView lv;private SimpleCursorAdapter list;private ContentResolver resolver;private Uri uri = Uri.parse("content://com.example.day46_contentprovider_03.nba/t_user");@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);lv = (ListView) findViewById(R.id.lv);resolver = getContentResolver();}public void show(View v) {Cursor cursor = resolver.query(uri, null, null, null, null);list = new SimpleCursorAdapter(this, R.layout.lvitem, cursor,new String[] { "uname", "upwd" },new int[] { R.id.t1, R.id.t2 },SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);lv.setAdapter(list);}public void insert(View v) {ContentValues values = new ContentValues();values.put("uname", "哈登");values.put("upwd", "09876");resolver.insert(uri, values);show(null);}public void update(View v) {ContentValues values = new ContentValues();values.put("uname", "哈登1111");resolver.update(uri, values, "upwd = ?", new String[] { "09876" });show(null);}public void delete(View v) {resolver.delete(uri, "_id=?", new String[] { "1" });show(null);}}



0 0
原创粉丝点击