Android入门(49)——第四章 四大组件之ContentProvider
来源:互联网 发布:手机游戏优化工具 编辑:程序博客网 时间:2024/04/29 22:29
1. 简介:
上面的几种方法有问题,所以用ContentProvider:
2. 案例一:手机联系人存储和联系人读取两个应用程序:
File Expoler --- data --- data --- com.android.providers.contacts --- database --- contacts2.db(系统联系人数据库)
下载以后可以通过第三方软件查看该数据库,该数据库中包含很多的表,表的内容出于安全性是不会让你轻易看懂的:
3. 因此我们就需要用ContentProvider来进行对数据的增删查改:
第一点:如何实现ContentProvider:
package com.imooc.contentproviderdemo1;import android.content.ContentProvider;import android.content.ContentValues;import android.database.Cursor;import android.net.Uri;// 自己写一个类来继承ContentProvider,第三方对你的数据的访问权限,完全取决于你当前这个继承类里面写了什么功能public class MyContentProvider extends ContentProvider{/* * 根据Uri删除selection指定的条件所匹配的全部记录 * */@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {// TODO Auto-generated method stubreturn 0;}/* * 返回当前uri的MIME类型. * 如果该URI对应的数据可能包括多条记录,那么MIME类型字符串 就是以vnd.android.dir/开头 * 如果该URI对应的数据只有一条记录 该MIME类型字符串 就是以vnd.android.cursor.item/开头 * */@Overridepublic String getType(Uri uri) {// TODO Auto-generated method stubreturn null;}/* * 根据Uri插入Values对应的数据 * */@Overridepublic Uri insert(Uri uri, ContentValues values) {// TODO Auto-generated method stubreturn null;}/* * 在ContetnProvider创建后被调用 * */@Overridepublic boolean onCreate() {// TODO Auto-generated method stubreturn false;}/* * 根据uri查询出selection指定的条件所匹配的全部记录,并且可以指定查询哪些列 以什么方式(order)排序 * */@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {// TODO Auto-generated method stubreturn null;}/* * 根据uri修改selection指定的条件所匹配的全部记录 * */@Overridepublic int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {// TODO Auto-generated method stubreturn 0;}}
第二点:何为Uri?
第三点:UriMatche类:
第四点:ContentResolver:
第五点:这里说的相同签名的四个方法指的是这四个方法的它们对应在ContentProvider和ContentResolver类中的参数完全相同:
4. 案例一:
注意:自定义ContentProvider对于新手来说实际意义不大,现在只要学好系统提供的ContentProvider即可。
第一步:
添加联系人访问权限:<uses-permission android:name="android.permission.READ_CONTACTS"/>
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.imooc.contentproviderdemo1" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="10" /> <uses-permission android:name="android.permission.READ_CONTACTS"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.imooc.contentproviderdemo1.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application></manifest>第二步:直接在MainActivity中写:
package com.imooc.contentproviderdemo1;import android.app.Activity;import android.content.ContentResolver;import android.database.Cursor;import android.os.Bundle;import android.provider.ContactsContract;import android.provider.ContactsContract.CommonDataKinds.Phone;import android.provider.ContactsContract.CommonDataKinds.Email;import android.provider.ContactsContract.Contacts;import android.provider.ContactsContract.Contacts.Data;import android.util.Log;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 获取ContentResolver对象ContentResolver cr = getContentResolver();// 查询,第一个参数是Uri,这个值是已经给我们写死的。返回值也是一个游标:Cursor c = cr.query(Contacts.CONTENT_URI, new String[] { Contacts._ID,Contacts.DISPLAY_NAME }, null, null, null);if (c != null) {while (c.moveToNext()) {int id = c.getInt(c.getColumnIndex("_id"));Log.i("info", "_id:" + id);// 这个display_name如果名字不知道,可以直接用上面的那个:DISPLAY_NAMELog.i("info","name:" + c.getString(c.getColumnIndex("display_name")));Cursor c1 = cr.query(Phone.CONTENT_URI, new String[] {Phone.NUMBER, Phone.TYPE },Phone.CONTACT_ID + "=" + id, null, null);// 根据联系人ID查询出联系人的电话号码if (c1 != null) {while (c1.moveToNext()) {int type = c1.getInt(c1.getColumnIndex(Phone.TYPE));if (type == Phone.TYPE_HOME) {Log.i("info","家庭电话:"+ c1.getString(c1.getColumnIndex(Phone.NUMBER)));} else if (type == Phone.TYPE_MOBILE) {Log.i("info","手机:"+ c1.getString(c1.getColumnIndex(Phone.NUMBER)));}}c1.close();}// 根据联系人的ID去查询出联系人的邮箱地址Cursor c2 = cr.query(Email.CONTENT_URI, new String[] {Email.DATA, Email.TYPE }, Email.CONTACT_ID + "=" + id,null, null);if (c2 != null) {while (c2.moveToNext()) {// Data.MIMETYPE应该是Data.Type或者Emile.DATAint type = c2.getInt(c2.getColumnIndex(Data.MIMETYPE));if (type == Email.TYPE_WORK) {Log.i("info","工作邮箱:"+ c2.getString(c2.getColumnIndex(Data.MIMETYPE)));}}c2.close();}}c.close();}}}效果图:受宠若惊啊
5. 案例二:添加联系人:
第一步:添加权限:
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.imooc.contentproviderdemo2" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="10" /> <uses-permission android:name="android.permission.WRITE_CONTACTS"/> <uses-permission android:name="android.permission.READ_CONTACTS"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.imooc.contentproviderdemo2.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application></manifest>第二步:写MainActivity:
package com.imooc.contentproviderdemo2;import android.app.Activity;import android.content.ContentResolver;import android.content.ContentUris;import android.content.ContentValues;import android.net.Uri;import android.os.Bundle;import android.provider.ContactsContract.CommonDataKinds.Phone;import android.provider.ContactsContract.CommonDataKinds.StructuredName;import android.provider.ContactsContract.Data;import android.provider.ContactsContract.RawContacts;public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ContentResolver cr = getContentResolver(); //向联系人中 插入一行数据 ContentValues values = new ContentValues(); Uri uri = cr.insert(RawContacts.CONTENT_URI, values); Long raw_contact_id = ContentUris.parseId(uri); values.clear(); //插入人名 values.put(StructuredName.RAW_CONTACT_ID, raw_contact_id); values.put(StructuredName.DISPLAY_NAME, "张三三"); values.put(StructuredName.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE); // 向电话簿增加张三三这个人 uri = cr.insert(Data.CONTENT_URI, values); //插入电话信息 values.clear(); values.put(Phone.RAW_CONTACT_ID,raw_contact_id); values.put(Phone.NUMBER,"13333333333"); values.put(Phone.MIMETYPE, Phone.CONTENT_ITEM_TYPE); uri = cr.insert(Data.CONTENT_URI, values); }}效果图:受宠若惊:
0 0
- Android入门(49)——第四章 四大组件之ContentProvider
- Android四大组件—ContentProvider
- Android四大组件—ContentProvider
- Android四大组件—ContentProvider
- Android四大组件之ContentProvider(上)
- Android四大组件之ContentProvider(下)
- Android基础——四大组件之ContentProvider
- Android四大组件之ContentProvider
- android四大组件之ContentProvider
- android四大组件之 ContentProvider
- Android四大组件之ContentProvider
- Android四大组件之ContentProvider
- android 四大组件之ContentProvider
- Android四大组件之ContentProvider
- Android四大组件之ContentProvider
- android四大组件之ContentProvider
- android四大组件之ContentProvider
- Android四大组件之ContentProvider
- 计蒜之道 测试赛【作弊揭发者】
- VB 工程提示不能加载mscomctl.ocx控件错误解决办法
- leetCode(37):Implement Queue using Stacks
- Android 显示gif动画
- Android签名机制:生成keystore、签名、查看签名信息
- Android入门(49)——第四章 四大组件之ContentProvider
- cocopods安装指南
- KVO(Key Value Observing)
- day01
- HDU 1052 Tian Ji -- The Horse Racing
- leetcode Power of Two java--代码小白开始苟延残喘第五天的刷题
- day02
- 简单易用的倒计时js代码
- POJ 3320 Jessica's Reading Problem(尺取)