http://llb988.blog.51cto.com/1940549/516909
Android内容提供者源码,我不想说多,只讲一些实用的代码,增删改查。通过contentProvider向数据进行操作。大家可以下载,通过日志与LogCat打印出来的信息作为参考!

package com.smart;


import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.util.Log;

public class ContentProvider extends Activity {
private static final String TAG = "ContentProvider";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 通过这个类,方问DB项目
ContentResolver contentResolver = this.getContentResolver();
Uri alluri = Uri.parse("content://com.smart.provider.personprovider/person");
// Uri uri = Uri.parse("content://com.smart.provider.personprovider/person");
ContentValues values = new ContentValues();
values.put("name", "smart99"); // 这里更改就可以了。/
values.put("age", (short)44);
// contentResolver.insert(uri, values); //增加

Uri uri = Uri.parse("content://com.smart.provider.personprovider/person/5");
// contentResolver.update(uri, values, null, null);//更新
// contentResolver.delete(uri, null, null);//删除



//查询
// Cursor cursor = contentResolver.query(uri, new String[] {
// "personid", "name", "age" }, null, null, "personid desc");
// while (cursor.moveToNext()) {
// Log.i(TAG,
// "personid=" + cursor.getInt(0) + ",name="
// + cursor.getString(1) + ",age="
// + cursor.getShort(2));
// }
// cursor.close();
// 记得要关掉数据

//01:19

contactMethod();
}
//读取通迅里的人员。
public void contactMethod(){
//联系人,/媒体库/
ContentResolver contentResolver = this.getContentResolver();
Cursor cursor = contentResolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);

while (cursor.moveToNext()) {

int contactId=cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts._ID));
String name=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
Log.i(TAG,"contactId=" + contactId + ",name="
+ name);


Cursor phones=getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID+"="+contactId, null, null);
StringBuffer sb=new StringBuffer();
while(phones.moveToNext()){
String phoneNumber=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
sb.append(phoneNumber).append(",");

}
//电话号码可以得到
Log.i(TAG, sb.toString());

}

cursor.close();

}


}





package com.smart.dh;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.text.TextUtils;

import com.smart.service.DataBaseOpenHelper;

/**
* 使用内容提供者
ContentProvider共享数据
当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法
就可以向其它应用共享其数据。虽然使用其它方法对外共享数据,但是数据访问
方式 会因数据存储的方式而不同。,而采用文件操作读写数据,采用sharedoreferences共享数据的需要使用sharedpreferences API读写数据,而使用ContentProvider共享数据的好处
好处是统一了数据访问方式,当应用需要通过ContentProvider对外共享 数据时,第一步需要继承ContentProvider并重写下面的方法。
Public class PersonContentProvider extends ContentProvider{
Public boolean onCreate();
Public Uri insert(Uri uri,ContentValues values);
Public int delete(Uri uri,String selection,String[] selectionArgs);
Public int update(Uri uri,ContentValues values,String selection,String selectionArgs);
Pullic Cursor query(Uri uri,String[] projection,String selection,String[] selectionArgs,String softOrder);
Public String getType(Uri uri);
}

第二步需要在AndroidMandifest.xml使用<provider>对该ContentProvider进行配置,为了能让其它应用找到该ContentProvider,ContentProvider采用了authorites(主机名、域名)对它进行唯一标识,你可以把ContentProvider看作是一个网站(想想,网站也是提供数据者),authorites就是他的域名:
下面是在要注册信息
<appli…>
<provider android:name=”.类名” android:authorities=”con.smart.provider.包名”>

</appli>

注意:一旦应用继承了ContentProvider类,后面我们就会把这个应用称为ContentProvider内容提供者

* ContentProvider来自于文件与数据库都可以
*
* Uri介绍
* Uri代表了要操作的数据,Uri主要包含了两部信息:1》
* 需要操作的ContentProvider,2>
* 对ContentProvider中的,什么数据进行操作, 一个Uri由以下几个部分组成。
* content:// com.smart.provider.personperovider/person/988
* content:// 指 scheme
* om.smart.provider.personperovider指 主机名或authority
* person 指路径
* 988 指ID
* */
public class PersonContentProvider extends ContentProvider {
// 另一个工程,方问这一个类。

private DataBaseOpenHelper dbOpenHelper;
private static final int ALLPERSON = 1;
private static final int PERSON = 2;
private static UriMatcher sMatcher = new UriMatcher(UriMatcher.NO_MATCH);// 任何不匹配的时候,返回为-1
static {
//
sMatcher.addURI("com.smart.provider.personprovider", "person",ALLPERSON);

sMatcher.addURI("com.smart.provider.personprovider", "person/#", PERSON);
}
//删除
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
int count = 0;// 返回的行数
switch (sMatcher.match(uri)) {
case ALLPERSON:
count = db.delete("person", selection, selectionArgs);
break;
case PERSON:
long personid = ContentUris.parseId(uri);
String where = TextUtils.isEmpty(selection) ? "personid=?"
: selection + " and personid=?";
String[] params = new String[] { String.valueOf(personid) };
if (!TextUtils.isEmpty(selection) && selectionArgs != null) {
params = new String[selectionArgs.length + 1];
for (int i = 0; i < selectionArgs.length; i++) {
params[i] = selectionArgs[i];
}
params[selectionArgs.length + 1] = String.valueOf(personid);
}
count = db.delete("person", where, params);
break;
default:
throw new IllegalArgumentException("Unkow Uri:" + uri);
}
return count;
}

/**
* public String getType(Uri uri)
* 方法用于返回URI所代表数据的MIME类型,如果操作的数据发球集合类型,哪么MIME类型
* 字符串应该以vnd.android.cursor.dir/开头,要得到所有的person记录Uri为,
* ontent//com.smart.domain/person 哪么返回MIME类型字符串应该为,
* vnd.android.cursor.item/开头,比如,得到的ID为1的person记录,URI为
* ontent//com.smart.domain/person/10 ,哪么返回的MIME类型字符串应该为
* vnd.android.cursor.item/person
* */
// 操作数据类型
@Override //这个方法,不实现也可以的。
public String getType(Uri uri) {
switch (sMatcher.match(uri)) {
case ALLPERSON:
//多条
return "vnd.android.cursor.dir/personprovider.person";
case PERSON:
//personprovider.person 内容提供表的
//单条
return "vnd.android.cursor.item/personprovider.person";
default:
throw new IllegalArgumentException("Unkow Uri:" + uri);
}
}

/**
* UriMatcher类的使用介绍 因为URI代表了要操作的数据,所以我们很经常需要解析URI,并从URI中获得取数据,ANDROID系统
* 提供了两个用于操作URI的工具类,分别为URIMATCHER和CONTENTURIS。掌握它们的使用,会便于我们的开发工作,
* URIMATCHER类于匹配URI。它的用法如下。 首先第一步把你需要匹配路径全部给注册上,如下 常量
* UriMatcher.NO_MATCH表示不匹配任何路径的返回码 Urimatcher sMatcher=new
* UriMatcher(UriMatcher.NO_MATCH);
* 如果match()方法匹配content//com.smart.domain/person 路径,返回匹配为1
* sMatcher.addURI(content//com.smart.domain/person/1);
* 如果match()方法匹配content//com.smart.domain/person/230 路径,返回匹配为2
* sMatcher.addURI(content//com.smart.domain/person/#,2); /#为通配符
*
* 这里讲一下,parse方法为任何的一个字符串转换为Uri地址
* switch(sMatcher.match(Uri.parse("content//com.smart.domain/person/10"))){
*
* }
*
*
* 注册完需要匹配的URI后,就可以使用sMatcher.match(Uri)方法对输入进行匹配 ,如果匹配就返回匹配码
* 匹配码是调用ADDRUI()方法传入第三个参数,假设匹配 content//com.smart.domain/person 路径,返回的匹配码为1
*
* **/
//增加
@Override
public Uri insert(Uri uri, ContentValues values) {
// 返回的类型为,返回一路径,
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
long id = 0;
// com.smart.domain/person/100
switch (sMatcher.match(uri)) {
case ALLPERSON:
// com.smart.domain/person/
id = db.insert("person", "name", values);// 记是记录的行号,主健INT类,就是主健,
return ContentUris.withAppendedId(uri, id);

case PERSON:
// com.smart.domain/person/20
db.insert("person", "name", values);
String path = uri.toString();
// 从0个开始,取到,com.smart.domain/person/20 前面20的一个'/'
return Uri.parse(path.substring(0, path.lastIndexOf('/')) + id);
default:
// 返回一个参数
throw new IllegalArgumentException("Unkow Uri:" + uri);
}

}



@Override
public boolean onCreate() {
dbOpenHelper = new DataBaseOpenHelper(this.getContext());
return true;
}
//查询
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
switch (sMatcher.match(uri)) {
case ALLPERSON:
return db.query("person", projection, selection, selectionArgs,null,null,sortOrder);
case PERSON:
long personid = ContentUris.parseId(uri);
String where = TextUtils.isEmpty(selection) ? "personid=?"
: selection + " and personid=?";
String[] params = new String[] { String.valueOf(personid) };
if (!TextUtils.isEmpty(selection) && selectionArgs != null) {
params = new String[selectionArgs.length + 1];
for (int i = 0; i < selectionArgs.length; i++) {
params[i] = selectionArgs[i];
}
params[selectionArgs.length + 1] = String.valueOf(personid);
}
return db.query("person", projection, where, params,null,null,sortOrder);
default:
throw new IllegalArgumentException("Unkow Uri:" + uri);
}

}
//更新
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
int count = 0;// 返回的行数
switch (sMatcher.match(uri)) {
case ALLPERSON:
count = db.update("person", values, selection, selectionArgs);
break;
case PERSON://com.smart.domain/100
long personid = ContentUris.parseId(uri);//得到100的记录
//判断是否为空,为条件
String where = TextUtils.isEmpty(selection) ? "personid=?"
: selection + " and personid=?";
String[] params = new String[] { String.valueOf(personid) };
if (!TextUtils.isEmpty(selection) && selectionArgs != null) {
params = new String[selectionArgs.length + 1];
for (int i = 0; i < selectionArgs.length; i++) {
params[i] = selectionArgs[i];
}
params[selectionArgs.length + 1] = String.valueOf(personid);
}
count = db.update("person", values, where, params);
break;
default:
throw new IllegalArgumentException("Unkow Uri:" + uri);
}
return count;
}
/*****
* 增加 ContentUris类用于获取Uri 路径后面的ID部分,它有两个实用的方法,
* withAppendedld(Uri,id)用于为路径为上ID部分 Uri
* uri=Uri.parse("content://com.smart.domain/person"); Uri
* resultUri=ContentUris.withAppendedld(uri,10)
* 生成后Uri为:content://com.smart.domain/person/10
*
* 更新的方法 parseld(uri)方法用于从路径中获取ID部分 Uri
* uri=Uri.parse("com.smart.domain/person/10"); long
* personid=ContentUris.parseld(uri);//获取的结果为10
*
*
* **/
}


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.smart.dh"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<uses-library android:name="android.test.runner"/>
<provider android:name=".PersonContentProvider"
android:authorities="com.smart.provider.personprovider"
android:permission="com.smart.provider.personprovider"/>

<activity android:name=".DBActivity"
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>
<uses-sdk android:minSdkVersion="8" />
<instrumentation android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.smart.dh" android:label="Tests for My App"/>
</manifest>






<!-- android:permission="cn.itcast.provider.personprovider"
这行是指权限 android:permission="com.smart.domain"
com.smart.domain
-->

更多相关文章

  1. mybatisplus的坑 insert标签insert into select无参数问题的解决
  2. python起点网月票榜字体反爬案例
  3. 《Android开发从零开始》——25.数据存储(4)
  4. Android系统配置数据库注释(settings.db)
  5. Android中不同应用间实现SharedPreferences数据共享
  6. haproxy根据客户端浏览器进行跳转
  7. android图表ichartjs
  8. Android内容提供者源码
  9. android SharedPreferences

随机推荐

  1. Android中的网络时间同步
  2. Android 简单热修复(上)——Java类加载器
  3. Android AutoLayout全新的适配方式 堪称
  4. 使用GDB调试Android NDK native(C/C++)程
  5. Android 的广播机制
  6. Android(安卓)chrisbanes-PhotoView 使用
  7. Android内存管理的原理--进程管理
  8. Android系统框架总结(好文)
  9. 基于android的远程视频监控系统(已开放源
  10. Android拨号器的实现