下面介绍如何使用content provider去获取另一个应用的数据,例如App2要读取App1的数据。
1. App1先自定义一个provider。
public class MyProvider1 extends ContentProvider {
private final static int CODE_NOPARAM = 1;
private final static int CODE_PARAM = 2;
private MyDBHelp dbHelp;
private ContentResolver contentResolver;
private final static String AUTHORITY = "com.kv.app1.MyProvider1";
private final static String TABLE_INFO = "info";
private final static String DB_NAME = "app1.db";
private static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
static {
uriMatcher.addURI(AUTHORITY, "info", CODE_NOPARAM);
uriMatcher.addURI(AUTHORITY, "info/#", CODE_PARAM);
}
@Override
public boolean onCreate() {
Context context = getContext();
contentResolver = context.getContentResolver();
dbHelp = new MyDBHelp(context, DB_NAME, null, 1);
return true;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
SQLiteDatabase db = dbHelp.getWritableDatabase();
switch (uriMatcher.match(uri)) {
case CODE_NOPARAM:
long d = db.insert(TABLE_INFO, "_id", values);
Uri u = ContentUris.withAppendedId(uri, d);
contentResolver.notifyChange(u, null);
return u;
default:
throw new IllegalArgumentException("this is unkown uri:" + uri);
}
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
SQLiteDatabase db = dbHelp.getWritableDatabase();
switch (uriMatcher.match(uri)) {
case CODE_NOPARAM:
return db.delete(TABLE_INFO, selection, selectionArgs); // 删除所有记录
case CODE_PARAM:
long id = ContentUris.parseId(uri); // 取得跟在URI后面的数字
String where = "_id = " + id;
if (!TextUtils.isEmpty(selection)) {
where += " and " + selection;
}
return db.delete(TABLE_INFO, where, selectionArgs);
default:
throw new IllegalArgumentException("this is unkown uri:" + uri);
}
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
SQLiteDatabase db = dbHelp.getWritableDatabase();
switch (uriMatcher.match(uri)) {
case CODE_NOPARAM:
return db.update(TABLE_INFO, values, selection, selectionArgs); // 更新所有记录
case CODE_PARAM:
long id = ContentUris.parseId(uri); // 取得跟在URI后面的数字
String where = "_id = " + id;
if (!TextUtils.isEmpty(selection)) {
where += " and " + selection;
}
return db.update(TABLE_INFO, values, where, selectionArgs);
default:
throw new IllegalArgumentException("this is unkown uri:" + uri);
}
}
/**
* 返回对应的内容类型
* 如果返回集合的内容类型,必须以vnd.android.cursor.dir开头
* 如果是单个元素,必须以vnd.android.cursor.item开头
*/
@Override
public String getType(Uri uri) {
switch (uriMatcher.match(uri)) {
case CODE_NOPARAM:
return "vnd.android.cursor.dir/info";
case CODE_PARAM:
return "vnd.android.cursor.item/info";
default:
throw new IllegalArgumentException("this is unkown uri:" + uri);
}
}
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
SQLiteDatabase db = dbHelp.getReadableDatabase();
switch (uriMatcher.match(uri)) {
case CODE_NOPARAM:
return db.query(TABLE_INFO, projection, selection, selectionArgs, null, null, sortOrder);
case CODE_PARAM:
long id = ContentUris.parseId(uri); // 取得跟在URI后面的数字
String where = "_id = " + id;
if (!TextUtils.isEmpty(selection)) {
where += " and " + selection;
}
return db.query(TABLE_INFO, projection, where, selectionArgs, null, null, sortOrder);
default:
throw new IllegalArgumentException("this is unkown uri:" + uri);
}
}
private static class MyDBHelp extends SQLiteOpenHelper {
public MyDBHelp(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table info(_id integer primary key autoincrement," +
"name text not null, number text not null);";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
onCreate(db);
}
}
}
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.kv.app1">
<application android:icon="@mipmap/ic_launcher"
android:label="@string/app_name">
<activity android:name=".App1Act1">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<provider
android:name="com.kv.app1.MyProvider1"
android:authorities="com.kv.app1.MyProvider1" android:exported="true" />
</application>
</manifest>
2.app2获取的代码
public class App2Act1 extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.act1);
final TextView tv = (TextView) findViewById(R.id.tv);
final ContentResolver contentResolver = getContentResolver();
findViewById(R.id.btn1).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ContentValues cv = new ContentValues();
cv.put("name", "kevin");
cv.put("number", "30");
Uri uri = contentResolver.insert(Uri.parse("content://com.kv.app1.MyProvider1/info"), cv);
tv.setText("uri=" + uri.toString());
}
});
findViewById(R.id.btn2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String selection = "name=?";
String[] selectionArgs = new String[]{"kevin"};
Cursor cursor = contentResolver.query(Uri.parse("content://com.kv.app1.MyProvider1/info"), null, selection, selectionArgs, null);
if (cursor != null) {
StringBuilder sb = new StringBuilder();
while (cursor.moveToNext()) {
sb.append(cursor.getInt(0) + " " + cursor.getString(1) + " " + cursor.getString(2) + "\n");
}
tv.setText(sb.toString());
cursor.close();
}
}
});
findViewById(R.id.btn3).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int id = contentResolver.delete(Uri.parse("content://com.kv.app1.MyProvider1/info/3"), null, null);
tv.setText("id=" + id);
}
});
}
}