android之数据存储3
2016-08-18 21:19
183 查看
Content Provider
定义:提供了我们在应用程序之间共享数据的一种机制(Sqlite数据库)
程序实现通讯原理:
甲方提供一个数据库暴露出来给别人使用(ContentProvider),乙方就可以通过 ContentResolver这个类去操作甲方的数据库(对甲方的数据库进行增删改查)
读取写入自带联系人通讯录所需的权限:
<!-- 写权限 -->
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<!-- 读权限 -->
<uses-permission android:name="android.permission.READ_CONTACTS" />
注意:如果在模拟器上进行联系人操作,然后可以在file explorer查看
data/data/目录下面的/com.providers.contacts下面的contacts2.db数据库里(没有进行操作之前是查看不到的)
(1)查询联系人的信息
1.获得ContentResolver对象
ContentResolver contentResolver = getContentResolver();
获得Uri对象
private String uri_contacts_data = "content://com.android.contacts/data";
private String uri_contacts_phones = "content://com.android.contacts/data/phones";
2.Uri uri = Uri.parse(uri_contacts_data);
3.调用提供的query方法(返回的是联系人id和名字)调用提供的query方法(返回的是联系人id和名字)
// 要查询指定的字段,需要同时查询“_id”字段,否则会报错,“display_name”这个字段表示联系人的姓名
Cursor cursor = resolver.query(uri, new String[] { "_id","display_name" }, null, null, null);
4.再次调用提供的query方法--用上次返回的id作为参数,取得联系人号码
query(uri, projection, selection, selectionArgs, sortOrder)
"raw_contact_id = ?"
在"raw_contacts"表中查到的_id字段和“data”表中查到的“raw_contact_id”是一一对应的,所以可以根据“raw_contact_id”这个字段在“data”表中去查询“data1”
data1和data2
data1属性存放总数据;
data2属性:
-如果此记录存放姓名,则data2存放名;
-如果此记录存放电话,则data2存放类型,比如手机、家电;
-如果此记录存放组织,则data2存放类型,比如公司、其他;
-如果此记录存放地址,则data2存放类型,比如住宅,单位等;
//遍历查询出来的用户名
while (cursor.moveToNext()) {
Log.e("bm", "_id: " + cursor.getString(0) + "display_name: "
+ cursor.getString(1));
Cursor cursor_phone = resolver.query(
Uri.parse(uri_contacts_phones), new String[] { "data1" },
"raw_contact_id=?",
new String[] { cursor.getString(0) + "" }, null);
while (cursor_phone.moveToNext()) {
Log.e("bm", cursor_phone.getString(0));
}
//读完游标里面的数据,需要关闭游标
cursor_phone.close();
}
//读完游标里面的数据,需要关闭游标
cursor.close();
(2)查询指定联系人:
"content://com.android.contacts/data/phones/filter/" + number
代码示例:
//定义要查询的电话号码
String number="180**********";
//去联系人表中要查询的地址
String str="content://com.android.contacts/data/phones/filter/" + number;
ContentResolver resolver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//得到contentResolver对象
resolver=getContentResolver();
Uri uri=Uri.parse(str);
Cursor cursor=resolver.query(uri, new String[]{"display_name"}, null, null, null);
if (cursor.moveToFirst()) {
Log.e("bm", "姓名:"+cursor.getString(0));
}
cursor.close();
}
ContentProvider进程间通讯(Sqlite数据库)
1.所要操作的数据库所在程序:
自定义一个MyProvider类
1.定义一个类继承ContentProvider
2.重写里面的方法 -->自动重写(需要定义一个Uri匹配器来匹配Uri)
需要进行哪些操作就去对应的方法里面
在onCreate()方法里(类生成时就执行)
代码示例:
MySqlUtils utils;
UriMatcher matcher;
//得到工具类对象-->上下文对象getContext()
utils =new MySqlUtils(getContext());
//得到matcher匹配器对象
matcher=new UriMatcher(UriMatcher.NO_MATCH);
//添加girl表的URi
matcher.addURI(authorities, table_name, code);
//添加boy表的uri
matcher.addURI("com.xx.content", "boy", 2);
query()方法//用来查询
insert()方法//用来插入数据
@Override
public Uri insert(Uri uri, ContentValues values) {
switch (matcher.match(uri)) {
case 1://添加数据到girl表
utils.addGirl(values);
break;
case 2://添加数据到boy表
utils.addBoy(values);
break;
default:
break;
}
return null;
}
delete()方法//用来删除数据
update()放法//用来修改数据
3.在清单文件里面进行注册
<!-- 注册ContentProvider
(1)name="包名.类名"
(2) authorities = "com.公司名.项目名"
(3)exported="true" 在安卓4.2之后必须设置这个属性-->
2.客户端使用ContentResolver操作ContentProvider中的数据
I.获取ContentResolver 对象
II.获取Uri
III.使用ContentValues来装数据
IV.用ContentResolver操作ContentValues
代码示例:
setContentView(R.layout.activity_main);
//1.得到ContentResolver对象
ContentResolver resolver=getContentResolver();
//2.得到URi对象
//content://甲方在清单文件里面注册的授权/表名
Uri uri=Uri.parse("content://com.xx.content/girl");
//3.实例化一个Contentvalues对象
ContentValues values=new ContentValues();
values.put("_id", 1);
values.put("name", "小明");
values.put("age",21);
//4.插入该数据到甲方的数据库中去
resolver.insert(uri, values);
---------------------------------------------------------------------<
cde2
/div>
Uri
Uri概念粗解:
Uri是指通用资源标志符
例子:content://com.example.Mycontentproviderdemo/employee/1
A:前缀表明数据受控于一个内容提供者。它从不修改,也就是schema
B:是指在AndroidMainfest.xml中我们注册的provider中的android:authorities属性所对应
C:具体操作于哪个条目
D:具体指定到哪个条目下的哪条记录
经常需要解析Uri,并从Uri中获取数据。
Android系统提供了两个用于操作Uri的工具类
UriMatcher()用来匹配Uri。
使用方法步骤:
1.初始化
UriMatcher sMatcher = new UriMatcher(UriMatcher.NO_MATCH);// UriMatcher.NO_MATCH 表示不匹配任何路径的返回码
2.注册需要的Uri
sMatcher.addURI(“com.jiahui.provider.myprovider”, “person”, 1);
sMatcher.addURI(“com.jiahui.provider.myprovider”, “person/#”, 2);//#号为通配符
sMatcher.addURI(“com.jiahui.provider.myprovider”, “person/*”, 3);//* 号为任意字符
3.与已经注册的Uri进行匹配
sMatcher.match(uri)
ContentUris它用于在Uri后面追加一个ID或者解析出传入的Uri所带上的ID值
使用:
withAppendedId (Uri contentUri, long id)---用于为路径加上ID部分
parseId (Uri contentUri)----从路径中获取ID部分
定义:提供了我们在应用程序之间共享数据的一种机制(Sqlite数据库)
程序实现通讯原理:
甲方提供一个数据库暴露出来给别人使用(ContentProvider),乙方就可以通过 ContentResolver这个类去操作甲方的数据库(对甲方的数据库进行增删改查)
读取写入自带联系人通讯录所需的权限:
<!-- 写权限 -->
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<!-- 读权限 -->
<uses-permission android:name="android.permission.READ_CONTACTS" />
注意:如果在模拟器上进行联系人操作,然后可以在file explorer查看
data/data/目录下面的/com.providers.contacts下面的contacts2.db数据库里(没有进行操作之前是查看不到的)
(1)查询联系人的信息
1.获得ContentResolver对象
ContentResolver contentResolver = getContentResolver();
获得Uri对象
private String uri_contacts_data = "content://com.android.contacts/data";
private String uri_contacts_phones = "content://com.android.contacts/data/phones";
2.Uri uri = Uri.parse(uri_contacts_data);
3.调用提供的query方法(返回的是联系人id和名字)调用提供的query方法(返回的是联系人id和名字)
// 要查询指定的字段,需要同时查询“_id”字段,否则会报错,“display_name”这个字段表示联系人的姓名
Cursor cursor = resolver.query(uri, new String[] { "_id","display_name" }, null, null, null);
4.再次调用提供的query方法--用上次返回的id作为参数,取得联系人号码
query(uri, projection, selection, selectionArgs, sortOrder)
"raw_contact_id = ?"
在"raw_contacts"表中查到的_id字段和“data”表中查到的“raw_contact_id”是一一对应的,所以可以根据“raw_contact_id”这个字段在“data”表中去查询“data1”
data1和data2
data1属性存放总数据;
data2属性:
-如果此记录存放姓名,则data2存放名;
-如果此记录存放电话,则data2存放类型,比如手机、家电;
-如果此记录存放组织,则data2存放类型,比如公司、其他;
-如果此记录存放地址,则data2存放类型,比如住宅,单位等;
//遍历查询出来的用户名
while (cursor.moveToNext()) {
Log.e("bm", "_id: " + cursor.getString(0) + "display_name: "
+ cursor.getString(1));
Cursor cursor_phone = resolver.query(
Uri.parse(uri_contacts_phones), new String[] { "data1" },
"raw_contact_id=?",
new String[] { cursor.getString(0) + "" }, null);
while (cursor_phone.moveToNext()) {
Log.e("bm", cursor_phone.getString(0));
}
//读完游标里面的数据,需要关闭游标
cursor_phone.close();
}
//读完游标里面的数据,需要关闭游标
cursor.close();
(2)查询指定联系人:
"content://com.android.contacts/data/phones/filter/" + number
代码示例:
//定义要查询的电话号码
String number="180**********";
//去联系人表中要查询的地址
String str="content://com.android.contacts/data/phones/filter/" + number;
ContentResolver resolver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//得到contentResolver对象
resolver=getContentResolver();
Uri uri=Uri.parse(str);
Cursor cursor=resolver.query(uri, new String[]{"display_name"}, null, null, null);
if (cursor.moveToFirst()) {
Log.e("bm", "姓名:"+cursor.getString(0));
}
cursor.close();
}
ContentProvider进程间通讯(Sqlite数据库)
1.所要操作的数据库所在程序:
自定义一个MyProvider类
1.定义一个类继承ContentProvider
2.重写里面的方法 -->自动重写(需要定义一个Uri匹配器来匹配Uri)
需要进行哪些操作就去对应的方法里面
在onCreate()方法里(类生成时就执行)
代码示例:
MySqlUtils utils;
UriMatcher matcher;
//得到工具类对象-->上下文对象getContext()
utils =new MySqlUtils(getContext());
//得到matcher匹配器对象
matcher=new UriMatcher(UriMatcher.NO_MATCH);
//添加girl表的URi
matcher.addURI(authorities, table_name, code);
//添加boy表的uri
matcher.addURI("com.xx.content", "boy", 2);
query()方法//用来查询
insert()方法//用来插入数据
@Override
public Uri insert(Uri uri, ContentValues values) {
switch (matcher.match(uri)) {
case 1://添加数据到girl表
utils.addGirl(values);
break;
case 2://添加数据到boy表
utils.addBoy(values);
break;
default:
break;
}
return null;
}
delete()方法//用来删除数据
update()放法//用来修改数据
3.在清单文件里面进行注册
<!-- 注册ContentProvider
(1)name="包名.类名"
(2) authorities = "com.公司名.项目名"
(3)exported="true" 在安卓4.2之后必须设置这个属性-->
2.客户端使用ContentResolver操作ContentProvider中的数据
I.获取ContentResolver 对象
II.获取Uri
III.使用ContentValues来装数据
IV.用ContentResolver操作ContentValues
代码示例:
setContentView(R.layout.activity_main);
//1.得到ContentResolver对象
ContentResolver resolver=getContentResolver();
//2.得到URi对象
//content://甲方在清单文件里面注册的授权/表名
Uri uri=Uri.parse("content://com.xx.content/girl");
//3.实例化一个Contentvalues对象
ContentValues values=new ContentValues();
values.put("_id", 1);
values.put("name", "小明");
values.put("age",21);
//4.插入该数据到甲方的数据库中去
resolver.insert(uri, values);
---------------------------------------------------------------------<
cde2
/div>
Uri
Uri概念粗解:
Uri是指通用资源标志符
例子:content://com.example.Mycontentproviderdemo/employee/1
A:前缀表明数据受控于一个内容提供者。它从不修改,也就是schema
B:是指在AndroidMainfest.xml中我们注册的provider中的android:authorities属性所对应
C:具体操作于哪个条目
D:具体指定到哪个条目下的哪条记录
经常需要解析Uri,并从Uri中获取数据。
Android系统提供了两个用于操作Uri的工具类
UriMatcher()用来匹配Uri。
使用方法步骤:
1.初始化
UriMatcher sMatcher = new UriMatcher(UriMatcher.NO_MATCH);// UriMatcher.NO_MATCH 表示不匹配任何路径的返回码
2.注册需要的Uri
sMatcher.addURI(“com.jiahui.provider.myprovider”, “person”, 1);
sMatcher.addURI(“com.jiahui.provider.myprovider”, “person/#”, 2);//#号为通配符
sMatcher.addURI(“com.jiahui.provider.myprovider”, “person/*”, 3);//* 号为任意字符
3.与已经注册的Uri进行匹配
sMatcher.match(uri)
ContentUris它用于在Uri后面追加一个ID或者解析出传入的Uri所带上的ID值
使用:
withAppendedId (Uri contentUri, long id)---用于为路径加上ID部分
parseId (Uri contentUri)----从路径中获取ID部分
相关文章推荐
- Android开发指南-框架主题-数据存储
- Android数据存储
- Android(四)数据存储之四ContentProvider
- Android 数据存储
- Android数据存储——Shared Preferences
- Android学习——数据存储
- Android数据存储
- Android(三)数据存储之三SQLite嵌入式数据库
- Android(三)数据存储之XML解析技术
- Android数据存储
- Android数据存储(总结篇)
- Android数据存储
- android数据存储ContentProvider数据获取ContentResolver
- Android(三) 数据存储之二 SharedPreferences
- Android数据存储之文件存储
- Android的数据存储
- Android存储数据的方式
- Android的数据存储
- Android(五)数据存储之五网络数据交互
- Android之SharedPreference轻量级数据存储