ContentProvider调用关系
在创建ContentProvider前,首先要实现底层的数据源,数据源包括数据库、文件系统或网络等,然后继承ContentProvider类中实现基本数据操作的接口函数。调用者不能直接调用ContentProvider的接口函数,需要通过ContentResolver对象,通过URI间接调用ContentProvider
创建数据提供者
1,创建一个类让其继承ContentProvider,并重载6个函数
onCreate()
一般用来初始化底层数据集和建立数据连接等工作
getType()
用来返回指定URI的MIME数据类型,若URI是单条数据,则返回的MIME数据类型以vnd.android.cursor.item开头;若URI是多条数据,则返回的MIME数据类型以vnd.android.cursor.dir/开头。
insert()、delete()、update()、query()
用于对数据集的增删改查操作。
我们来实现一个小demo
1,首先写一个类继承ContentProvider
package com.zking.provider;
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.support.annotation.Nullable;
import android.util.Log;
import com.zking.db.DbHelper;
/**
* Created by hgz on 2017/2/14.
*/
public class MyProvider extends ContentProvider{
private SQLiteDatabase database;
private static final int PERSONS=1;
private static final int PERSON=2;
private UriMatcher uriMatcher;
@Override
public boolean onCreate() {
Log.i("test","onCreate");
DbHelper dbHelper= new DbHelper(getContext(),"G150831.db",null,1);
database = dbHelper.getWritableDatabase();
//实例化URI匹配器
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
//添加匹配规则
uriMatcher.addURI("com.zking.hgz_android_24_contentprovider","persons",MyProvider.PERSONS);
uriMatcher.addURI("com.zking.hgz_android_24_contentprovider","person/#",MyProvider.PERSON);
return false;
}
@Nullable
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
Log.i("test","query");
int code=uriMatcher.match(uri);
switch (code){
case MyProvider.PERSONS:
return database.query(true,"person",projection,selection,selectionArgs,null,null,sortOrder,null);
case MyProvider.PERSON:
//获取#的值
long id=ContentUris.parseId(uri);
return database.rawQuery("select * from person where _id=?",new String[]{id+""});
}
return null;
}
@Nullable
@Override
public String getType(Uri uri) {
Log.i("test","getType");
return null;
}
@Nullable
@Override
public Uri insert(Uri uri, ContentValues values) {
Log.i("test","insert");
return null;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
Log.i("test","delete");
return 0;
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
Log.i("test","update");
return 0;
}
}
再次说明一下,必须要自己写数据源,我这里是建了一个person表存在数据库里面的。
AndroidManifest.xml
<provider
android:authorities="com.zking.hgz_android_24_contentprovider"
android:name="com.zking.provider.MyProvider"
android:exported="true"></provider>
一个类我们的数据提供者就写完了,当然不要忘记配置
2,我们想要拿数据首先要获得ContentResolver
package com.zking.hgz_android_24_2contentresolver;
import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private ContentResolver contentResolver;
private Uri uri;
private EditText et_main;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_main = (EditText) findViewById(R.id.et_main);
//首先得到内容访问者
contentResolver = getContentResolver();
}
public void getdata(View view){
if(TextUtils.isEmpty(et_main.getText())){
//查询所有
uri = Uri.parse("content://com.zking.hgz_android_24_contentprovider/persons");
}else{
//查询单个
String id=et_main.getText().toString();
uri = Uri.parse("content://com.zking.hgz_android_24_contentprovider/persons/"+id);
}
Cursor cursor=contentResolver.query(uri,null,null,null,null);
while (cursor.moveToNext()){
int id=cursor.getInt(cursor.getColumnIndex("_id"));
String name=cursor.getString(cursor.getColumnIndex("name"));
int age=cursor.getInt(cursor.getColumnIndex("age"));
Log.i("test",""+id+","+name+","+age);
}
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main"
android:layout_width="match_parent" android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context="com.zking.hgz_android_24_2contentresolver.MainActivity">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/et_main"
android:hint="请输入ID"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="查询"
android:onClick="getdata"/>
</LinearLayout>