为什么需要内容提供者
回顾数据库知识:
[1]定义一个类继承SqliteOpenHelper
[2]想要操作数据库必须获取一个SqliteDatabase对象
[3]chmod修改文件的权限 实际应用非root手机是没有办法操作/data/data/目录
内容提供者可以把私有的数据库里面的内容对外提供。不需要修改文件的权限
实现内容提供者步骤
注意[0]内容提供者提供数据,内容解析者访问数据
[1]写一个类继承ContentProvider
[2]去清单文件里面注册 注意:API-18开始 android:exported 默认值是false 需要改为true
[3]给ContentProvider添加一个authorities
[4]在Provider里面添加一个UriMatch类 用来匹配传进来的Uri地址
[5]访问方通过调用ContentReceiver来访问ContentProvider
备份短信案例
sms表:
address:发送人号码
date: 发送时间
read: 已读未读 0代表未读 1代表已读
body: 短信内容
权限:
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.WRITE_SMS"/>
备份:
try {
// [1]获取一个XmlSerializer对象生成XML文件
XmlSerializer serializer = Xml.newSerializer();
// [2]指定存储路径
FileOutputStream fops = new FileOutputStream(Environment.getExternalStorageDirectory().getPath() + "/sms.xml");
// [3]设置输出流
serializer.setOutput(fops, "utf-8");
// [4]文档开始
serializer.startDocument("utf-8", false);
// [5]smss标签开始
serializer.startTag(null, "smss");
// [6]通过ContentResolver获取短信数据
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://sms/");
// [7]利用ContentResolver查询数据
Cursor cursor = resolver.query(uri, new String[] { "address", "date", "read", "body" }, null, null, null);
while (cursor.moveToNext()) {
//[8]封装XML数据
serializer.startTag(null, "sms");
serializer.startTag(null, "address");
String address = cursor.getString(cursor.getColumnIndex("address"));
serializer.text(address);
serializer.endTag(null, "address");
serializer.startTag(null, "date");
String date = cursor.getString(cursor.getColumnIndex("date"));
serializer.text(date);
serializer.endTag(null, "date");
serializer.startTag(null, "read");
String read = cursor.getString(cursor.getColumnIndex("read"));
serializer.text(read);
serializer.endTag(null, "read");
serializer.startTag(null, "body");
String body = cursor.getString(cursor.getColumnIndex("body"));
serializer.text(body);
serializer.endTag(null, "body");
serializer.endTag(null, "sms");
}
serializer.endTag(null, "smss");
serializer.endDocument();
} catch (Exception e) {
e.printStackTrace();
}
把数据写入到短信数据库里面:
ContentResolver resolver = getContentResolver();
Uri url=Uri.parse("content://sms/");
ContentValues values=new ContentValues();
values.put("address", "110");
values.put("body", "话不多说,赶紧来一躺");
values.put("date",System.currentTimeMillis());
values.put("read", "0");
resolver.insert(url, values);
读取联系人案例
联系人信息:data表
data1 联系人信息
raw_contact_id 代表哪个联系人的id 对应 raw_contacts表中的contact_id字段
mimetype_id 代表当前行所对应的信息
联系人:raw_contacts表
contact_id 联系人id
数据类型:mimetype表:
_id mimetype
1 vnd.android.cursor.item/email_v2
2 vnd.android.cursor.item/im
3 vnd.android.cursor.item/nickname
4 vnd.android.cursor.item/organization
5 vnd.android.cursor.item/phone_v2
6 vnd.android.cursor.item/sip_address
7 vnd.android.cursor.item/name
8 vnd.android.cursor.item/postal-address_v2
9 vnd.android.cursor.item/identity
10 vnd.android.cursor.item/photo
11 vnd.android.cursor.item/group_membership
[1]查询raw_contacts表 获取联系人ID
[2]通过联系人ID然后在去data表中查询 data1列中的数据
[3]然后在根据mimetype对应的类型取出对应的数据
查询联系人信息:
// [1]获取一个ContentResolver对象
ContentResolver resolver = getContentResolver();
// [2]创建一个访问联系人的uri对象
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
Uri dataUri = Uri.parse("content://com.android.contacts/data");
// [3]去raw_contacts表中查询contact_id
Cursor contact_cursor = resolver.query(uri, new String[] { "contact_id" }, null, null, null);
while (contact_cursor.moveToNext()) {
// [4]获取contact_id
String contact_id = contact_cursor.getString(contact_cursor.getColumnIndex("contact_id"));
// [5]根据contact_id查询联系人
Cursor data_cursor = resolver.query(dataUri, new String[] { "data1", "mimetype" }, "raw_contact_id=?", new String[] { contact_id }, null);
while (data_cursor.moveToNext()) {
// [6]查询出每一列的数据
String data1 = data_cursor.getString(data_cursor.getColumnIndex("data1"));
String mimetype = data_cursor.getString(data_cursor.getColumnIndex("mimetype"));
System.out.println("data1 = " + data1 + " ~~~ mimetype = " + mimetype);
}
}
对联系人查询进行封装
public static List<Contact> readContacts(Context context) {
// [1]获取一个ContentResolver对象
ContentResolver resolver = context.getContentResolver();
// [2]创建俩个访问联系人的uri对象
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
Uri dataUri = Uri.parse("content://com.android.contacts/data");
// [3]去raw_contacts表中查询contact_id
Cursor contact_cursor = resolver.query(uri, new String[] { "contact_id" }, null, null, null);
while (contact_cursor.moveToNext()) {
// [4]获取contact_id
String contact_id = contact_cursor.getString(contact_cursor.getColumnIndex("contact_id"));
// [4.1]如果contact_id=null 继续下次循环
if (contact_id == null) {
continue;
}
contact = new Contact();
contact.id = contact_id;
// [5]根据contact_id查询联系人
Cursor data_cursor = resolver.query(dataUri, new String[] { "data1", "mimetype" }, "raw_contact_id=?", new String[] { contact_id }, null);
while (data_cursor.moveToNext()) {
// [6]查询出每一列的数据
String data1 = data_cursor.getString(data_cursor.getColumnIndex("data1"));
String mimetype = data_cursor.getString(data_cursor.getColumnIndex("mimetype"));
// [7]根据对应的mimetype找到对应的数据类型
if ("vnd.android.cursor.item/name".equals(mimetype)) {
contact.name = data1;
} else if ("vnd.android.cursor.item/phone_v2".equals(mimetype)) {
contact.phone = data1;
}
}
contacts.add(contact);
}
return contacts;
}
插入联系人
权限:
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
代码:
String name = et_name.getText().toString();
String phone = et_phone.getText().toString();
ContentResolver resolver = getContentResolver();
Uri contact_uri = Uri.parse("content://com.android.contacts/raw_contacts");
Uri data_uri = Uri.parse("content://com.android.contacts/data");
// [1]获取一共有多少了联系人了
Cursor cursor = resolver.query(contact_uri, null, null, null, null);
int contactCount = cursor.getCount() + 1;
// [2]往raw_contacts表中添加一个新的contact_id值
ContentValues values = new ContentValues();
values.put("contact_id", contactCount);
resolver.insert(contact_uri, values);
// [3]往data表中插入联系人信息
values = new ContentValues();
values.put("data1", name);
values.put("raw_contact_id", contactCount);
values.put("mimetype", "vnd.android.cursor.item/name");
resolver.insert(data_uri, values);
// [3]往data表中插入联系人信息
values = new ContentValues();
values.put("data1", phone);
values.put("raw_contact_id", contactCount);
values.put("mimetype", "vnd.android.cursor.item/phone_v2");
resolver.insert(data_uri, values);
内容观察者
[1]内容观察者不是4大组件
getContentResolver().registerContentObserver(uri, true, new MyObserver(new Handler()));
class MyObserver extends ContentObserver {
public MyObserver(Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
System.out.println("~~~~~~~~~~~~~~~内容改变了");
}
}
本文暂时没有评论,来添加一个吧(●'◡'●)