博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据存储之ContentProvide
阅读量:6153 次
发布时间:2019-06-21

本文共 5417 字,大约阅读时间需要 18 分钟。

3、ContentProvider 数据在Android当中是私有的,当然这些数据包括文件数据和数据库数据以及一些其他类型的数据。ContentProvider实现多应用程序间的数据共享类 一般利用ContentProvider为需要共享的数据定义一个URI(统一资源定位符) 然后其他程序通过Context获得ContentResolver并将数据的URI传入即可

Android已为一些常用的数据创建ContentProvider,这些ContentProvider位于 android.provider包下,常用的就是手机上联系人信息,但是要取得相应的权限自己的应用程序才能访问 具体设置是在AndroidManifest.xml

1 

对于ContentProvide重要的是数据模型和URI 数据模型:ContentProvide为所需要的数据创建表,每行代表一条记录,每条记录有唯一的'_ID'标识 URI:每个ContentProvide对外提供一个URI来标识自己的数据集

URI特点: 1、无法改变的标准前缀,包括;"content://"、"tel://"等。当前缀是"content://"时,说明通过一个Content Provider控制这些数据 2、URI的标识,它通过authorities属性声明,用于定义了是哪个ContentProvider提供这些数据。对于第三方应用程序,为了保证URI标识的唯一性,它必须是一个完整的类名(数据路径)。例如;"content://com.example.contentprovide.myprovider" 3、如果URI中包含表示需要获取的记录的_ID;则就返回该id对应的数据,如果没有_ID,就表示返回全部

举个例子,如: 

所有联系人的URI: content://contacts/people

某个联系人的URI: content://contacts/people/5

 

具体使用步骤: 1、在当前应用程序中定义一个ContentProvider

1 public class MyProvider extends ContentProvider { 2  3     @Override 4     public int delete(Uri arg0, String arg1, String[] arg2) { 5         // TODO Auto-generated method stub 6         return 0; 7     } 8  9     @Override10     public String getType(Uri arg0) {11         // TODO Auto-generated method stub12         return null;13     }14 15     @Override16     public Uri insert(Uri arg0, ContentValues arg1) {17         // TODO Auto-generated method stub18         return null;19     }20 21     // 创建数据库,建表和插入数据22     @Override23     public boolean onCreate() {24         // TODO Auto-generated method stub25         SQLiteDatabase db =this.getContext().openOrCreateDatabase("mydb.db", Context.MODE_PRIVATE, null);26         db.execSQL("create table tab(_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL)");27         ContentValues values =new ContentValues();28         values.put("name", "Hello ContentProvider!");29         db.insert("tab", "_id", values);30         db.close();31         return true;32     }33     34     // 查询35     @Override36     public Cursor query(Uri arg0, String[] arg1, String arg2, String[] arg3,37             String arg4) {38         // TODO Auto-generated method stub39          SQLiteDatabase db =this.getContext().openOrCreateDatabase("mydb.db", Context.MODE_PRIVATE, null);40          Cursor c = db.query("tab", null, null, null, null, null,null);41          return c;42     }43 44     @Override45     public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) {46         // TODO Auto-generated method stub47         return 0;48     }

 这里为了演示方便只实现创建和查询两个简单的方法

 

2、在当前应用程序的AndroidManifest.xml中注册此ContentProvider

1 

 

3、其他应用程序通过ContentResolver和Uri来获取此ContentProvider的数据

1 protected void onCreate(Bundle savedInstanceState) { 2         super.onCreate(savedInstanceState); 3         setContentView(R.layout.activity_main); 4          5         // 获取当前context 6         Context context = MainActivity.this; 7          8         // 得到ContentResolver对象 9         ContentResolver resolver = context.getContentResolver();10         11         // uri格式 "content://"、数据的路径、标示ID(可选)12         Uri uri = Uri.parse("content://com.example.contentprovider.MyProvider");13         Cursor c = resolver.query(uri, null, null, null, null);14         15         // 打印获取数据16         c.moveToFirst();17         for(int i=0; i

日志打印:

 

 

上面MyProvider代码和应用程序MainActivity代码不放在同一个包下是想说明ContentProvider不同程序间的数据共享,

但是注册获取权限那段代码要放在调用的程序包里。

其实通过代码可以看出为了共享数据库.可以让数据库披上ContentProvider外衣,主要还是通过SQLiteDatabase去操作数据库。

当然对于已封装的共享数据。我们只要设置获取权限,通过ContentResolver就可以直接调用。

数据附录是获取本地联系人信息代码:

1 public String getContactInfo(){ 2         String result=""; 3         ContentResolver resolver=getContentResolver(); 4         //查询联系人 5         Cursor cursor=resolver.query(Contacts.CONTENT_URI, null, null, null, null); 6         int idIndex=cursor.getColumnIndex(Contacts._ID); 7         // 取得联系人名字 (显示出来的名字),实际内容在 ContactsContract.Contacts中 8         int nameIndex=cursor.getColumnIndex(Contacts.DISPLAY_NAME); 9         for (cursor.moveToFirst();(!cursor.isAfterLast());cursor.moveToNext()) {10             //获取联系人ID11             String contactId =cursor.getString(idIndex);12             result=result+contactId+"\t\t\t";13             result=result+cursor.getString(nameIndex)+"\t\t\t";14              // 根据联系人ID查询对应的电话号码  15             Cursor phoneNumbers = resolver.query(CommonDataKinds.Phone.CONTENT_URI, null,16                     CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, null, null);   17             // 取得电话号码(可能存在多个号码)    18             while (phoneNumbers.moveToNext())     19             {  20                 String strPhoneNumber = phoneNumbers.getString(phoneNumbers.getColumnIndex(CommonDataKinds.Phone.NUMBER));     21                 result=result+strPhoneNumber+"\t\t\t";22             }23             phoneNumbers.close();24             25             // 根据联系人ID查询对应的email  26             Cursor emails = resolver.query(CommonDataKinds.Email.CONTENT_URI, null, 27                     CommonDataKinds.Email.CONTACT_ID + " = " + contactId, null, null);               28             // 取得email(可能存在多个email)    29             while (emails.moveToNext())     30             {  31                 String strEmail = emails.getString(emails.getColumnIndex(CommonDataKinds.Email.DATA));     32                 result=result+strEmail+"\t\t\t";33             }     34             emails.close(); 35             result=result+"\n";36         }37         cursor.close();38         return result;39     }
 
 
 

转载地址:http://uvffa.baihongyu.com/

你可能感兴趣的文章
淘宝的几个架构图
查看>>
linux后台运行程序
查看>>
Python异步IO --- 轻松管理10k+并发连接
查看>>
Oracle中drop user和drop user cascade的区别
查看>>
登记申请汇总
查看>>
Android Jni调用浅述
查看>>
CodeCombat森林关卡Python代码
查看>>
第一个应用程序HelloWorld
查看>>
(二)Spring Boot 起步入门(翻译自Spring Boot官方教程文档)1.5.9.RELEASE
查看>>
Java并发编程73道面试题及答案
查看>>
企业级负载平衡简介(转)
查看>>
Shell基础之-正则表达式
查看>>
JavaScript异步之Generator、async、await
查看>>
讲讲吸顶效果与react-sticky
查看>>
c++面向对象的一些问题1 0
查看>>
售前工程师的成长---一个老员工的经验之谈
查看>>
Get到的优秀博客网址
查看>>
老男孩教育每日一题-第107天-简述你对***的理解,常见的有哪几种?
查看>>
Python学习--time
查看>>
在OSCHINA上的第一篇博文,以后好好学习吧
查看>>