ContentProvider是不同应用程序之间进行交换数据的标志API
也就是说:一个应用程序通过ContentProvider暴露自己的数据操作接口,那么无论该应用是否启动(一定部署),其它应用程序能够通过该接口来操作该应用的内部数据,包含添加数据,删除数据,改动数据。查询数据等。
当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就能够向其它应用共享其数据。
尽管使用其它方法也能够对外共享数据,但数据訪问方式会因数据存储的方式而不同
如:採用文件方式对外共享数据,须要进行文件操作读写数据。
採用sharedpreferences共享数据。须要使用sharedpreferences API读写数据。
而使用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)
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
public String getType(Uri uri)
}
public boolean onCreate()
在UserContentProvider创建之后,就会被调用,当其它应用程序第一次訪问contentPrivider时。该ContentProvider就会被创建出来
public String getType(Uri uri)
返回操作的类型 假设操作多条记录那么MINE类型vnd.android.cursor.dir/开头
假设操作的数据仅仅有一条记录那么MINE类型vnd.android.cursor.item/开头
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)
改动操作
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
查询操作
为了能让其它应用找到该ContentProvider 。 ContentProvider 採用了authorities(主机名/域名)对它进行唯一标识,你能够把 ContentProvider看作是一个站点(想想,站点也是提供数据者),authorities 就是他的域名:
<manifest .... >注意:一旦应用继承了ContentProvider类,后面我们就会把这个应用称为ContentProvider(内容提供者)。
package com.example.android_sqlite.provider;
import com.example.android_sqlite.database.DatabaseHelper;
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;
public class UserContentProvider extends ContentProvider {
// 1.操作的标志
private static final String AUTHORITIE = "www.csdn.com.provider.userContentProvider";
// 2.定义uri解析返回的匹配码
private static final int QUERY = 1;
private static final int INSERT = 2;
private static final int UPDATE = 3;
private static final int DELETE = 4;
private static UriMatcher uriMatcher;
private DatabaseHelper dh;
// 3.使用UriMatcher类匹配Uri
static {
//实例化UriMatcher对象。常量UriMatcher.NO_MATCH表示不匹配不论什么路径的返回码
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
// 匹配的结果码
uriMatcher.addURI(AUTHORITIE, "query", QUERY);
uriMatcher.addURI(AUTHORITIE, "insert", INSERT);
uriMatcher.addURI(AUTHORITIE, "update", UPDATE);
uriMatcher.addURI(AUTHORITIE, "delete", DELETE);
}
/**
* 在UserContentProvider创建之后,就会被调用,当其它应用程序第一次訪问contentPrivider时。
* 该ContentProvider就会被创建出来
*/
@Override
public boolean onCreate() {
dh = new DatabaseHelper(getContext());
return false;
}
/**
* URL:http://www.baidu.com/index.html http://: http协议訪问站点
* www.baidu.com:域名部分 /index.html:站点资源
*
* URI:content://www.csdn.com.provider.userContentProvider/user
* content://android的ContentProvider的规定
* www.csdn.com.provider.userContentProvider:文件汇中自己配置的authorities
* user:资源部分(数据部分)当訪问者须要訪问不同的资源时,这个部分是动态改变.这个部分能够自定义
*
* UriMatcher:匹配uri
*/
/**
* 查询方法
*/
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
Cursor c = null;
// 匹配URI 进行推断
if (uriMatcher.match(uri) == QUERY) {
SQLiteDatabase db = dh.getReadableDatabase();
c = db.query("users", projection, selection, selectionArgs, null,
null, sortOrder);
} else {
System.out.println("查询操作的uri不匹配");
}
return c;
}
/**
* 返回操作的类型 假设操作多条记录那么MINE类型vnd.android.cursor.div/开头
* 假设操作的数据仅仅有一条记录那么MINE类型vnd.android.cursor.item/开头
*/
@Override
public String getType(Uri arg0) {
return null;
}
/**
* 插入操作
*/
@Override
public Uri insert(Uri uri, ContentValues values) {
long rowId = 0;
if (uriMatcher.match(uri) == INSERT) {
SQLiteDatabase db = dh.getReadableDatabase();
rowId = db.insert("users", null, values);
db.close();
} else {
System.out.println("插入不匹配");
}
//通过ContentUris.withAppendedId增加唯一的id值
return ContentUris.withAppendedId(uri, rowId);
}
/**
* 更新操作
*/
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
//更新几行
int count = 0;
if (uriMatcher.match(uri) == UPDATE) {
SQLiteDatabase db = dh.getWritableDatabase();
count = db.update("users", values, selection, selectionArgs);
db.close();
}
return count;
}
/**
* 删除操作
*/
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
//删除几行
int count = 0;
if (uriMatcher.match(uri) == DELETE) {
SQLiteDatabase db = dh.getWritableDatabase();
count = db.delete("users", selection, selectionArgs);
db.close();
}
return count;
}
}
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.android_sqlite" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.example.android_sqlite" > </instrumentation> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.android_sqlite.MainActivitysss" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <uses-library android:name="android.test.runner" /> <!-- 配置ContentProvider --> <provider android:name=".provider.UserContentProvider" android:authorities="www.csdn.com.provider.userContentProvider" android:exported="true" > </provider> </application> </manifest>
原文:http://www.cnblogs.com/mengfanrong/p/5336906.html