什么是内容提供者:内容提供者是Android中的四大组件之一,可以将应用程序中的数据对外共享,我们创建一个内容提供者,通过通用的接口将数据共享。
首先要继承类 ContentProvider 对父类的方法进行重新实现
package com.example.contentprovider;
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 MyContentProvider extends ContentProvider {
// 自己实现的数据库操作帮助类
private MyOpenHelper myOpenHelper;
// 数据库相关类
private SQLiteDatabase sqLiteDatabase;
// uri匹配相关
private static UriMatcher uriMatcher;
// 主机名称(这一部分是可以随便取得)
private static final String authority = "com.example.contentprovider";
// 数据表名
private final String Table_Name = "Content";
// 注册该内容提供者匹配的uri
static {
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
/*
* path_chenzheng部分的字符串是随便取得,1代表着如果请求的uri与当前加入
* 的匹配uri正好吻合,uriMathcher.match()方法返回的值.#代表任意数字,*代表任意字符串
*/
uriMatcher.addURI(authority, "add", 1);// 代表当前表中的所有的记录
uriMatcher.addURI(authority, "add/#", 2);// 代表当前表中的某条特定的记录
}
// 数据表中的列名映射
private static final String _id = "id";
private static final String name = "name";
private static final String age = "age";
private static final String isMan = "isMan";
// 版本号
private final int Version_1 = 1;
@Override
public boolean onCreate() {
try {
myOpenHelper = new MyOpenHelper(getContext(), "TestDB", null,Version_1);
} catch (Exception e) {
return false;
}
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
sqLiteDatabase = myOpenHelper.getWritableDatabase();
Cursor c = sqLiteDatabase.query(Table_Name, new String[]{"id","name","age"}, null, null, null, null, null);
return c;
}
/**
* @description 获取当前内容提供者的MIME类型 集合类型必须添加前缀vnd.android.cursor.dir/(该部分随意)
* 单条记录类型添加前缀vnd,android.cursor.item/(该部分随意)
* 定义了该方法之后,系统会在第一次请求时进行验证,验证通过则执行crub方法时不再重复进行验证,
* 否则如果没有定义该方法或者验证失败,crub方法执行的时候系统会默认的为其添加类型验证代码。
*/
@Override
public String getType(Uri uri) {
int code = uriMatcher.match(uri);
switch (code) {
case 1:
return "vnd.android.cursor.dir/chenzheng_java";
case 2:
return "vnd.android.cursor.item/chenzheng_java";
default:
throw new IllegalArgumentException("异常参数");
}
}
@Override
public Uri insert(Uri uri, ContentValues values) {
sqLiteDatabase = myOpenHelper.getWritableDatabase();
int code = uriMatcher.match(uri);
switch (code) {
case 1:
sqLiteDatabase.insert(Table_Name, name, values);
break;
default:
throw new IllegalArgumentException("异常参数");
}
return uri;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
return 0;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
int num = 0;
sqLiteDatabase = myOpenHelper.getWritableDatabase();
int code = uriMatcher.match(uri);
switch (code) {
case 1:
num = sqLiteDatabase.update(Table_Name, values, selection, selectionArgs);
break;
case 2:
long id = ContentUris.parseId(uri);
selection = (selection == null || "".equals(selection.trim())) ? _id
+ "=" + id
: selection + " and " + _id + "=" + id;
num = sqLiteDatabase.update(Table_Name, values, selection, selectionArgs);
break;
default:
throw new IllegalArgumentException("异常参数");
}
return num;
}
}
Activity 代码
package com.example.contentprovider;
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.util.Log;
import android.view.View;
import android.widget.TextView;
public class ContentProviderActivity extends Activity {
ContentResolver reslover;
Uri uri;
String result = "结果:/n";
private final static String tag = "通知";
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textView = (TextView) findViewById(R.id.textView);
uri = Uri.parse("content://com.example.contentprovider/add");
reslover = getContentResolver();
}
public void insertContent(View view){
insert(reslover,uri);
}
public void updateContent(View view){
update(reslover,uri);
}
public void queryContent(View view) {
Cursor cursor = query(reslover, uri);
while(cursor.moveToNext()){
System.out.println(cursor.getInt(cursor.getColumnIndex("id")));
System.out.println(cursor.getString(cursor.getColumnIndex("name")));
System.out.println(cursor.getString(cursor.getColumnIndex("age")));
}
}
private Cursor query(ContentResolver resolver, Uri uri){
Cursor cursor = resolver.query(uri, null, null, null, null);
return cursor;
}
private void update(ContentResolver resolver, Uri uri){
ContentValues contentValues = new ContentValues();
contentValues.put("age", 122);
int number = resolver.update(uri, contentValues, null, null);
Log.i(tag, "更新成功!");
result += "成功更新了" + number+"条记录";
textView.setText(result);
result = "";
}
private void insert(ContentResolver resolver, Uri uri) {
ContentValues contentValues = new ContentValues();
contentValues.put("id", 1);
contentValues.put("name", "张大凡");
contentValues.put("age", 30);
contentValues.put("isMan", true);
Uri uri2 = resolver.insert(uri, contentValues);
Log.i(tag, "插入成功!");
result += "成功插入了一条记录,uri为" + uri2;
textView.setText(result);
result = "";
}
}