ContentPRovider是Android核心组件之一。 ContentProvider表示“内容提供者”, 开发人员在创建它时,需要自定义一个类继承ContentProvider,并重写其中的方法,然后并在Android项目的清单文件(AndroidMainfest.xml)中注册。 注册代码如以下:
<provider android:authorities="com.example.android_contentprovider.PERSON" android:name="com.example.provider.MyContentProvider" android:exported="true" ></provider>authorities表示ContentProvider用于访问数据的URI name则是表示ContentProvider所在的所在项目的路径 exported表示是否可以被访问
一个ContentProvider的例子就是这样:
package com.example.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.example.util.DbUtil;/** * Created by Administrator on 2017/2/7. */public class MyContentProvider extends ContentProvider { private SQLiteDatabase db; private UriMatcher uriMatcher; @Override public boolean onCreate() { DbUtil dbUtil=new DbUtil(getContext(),"G150820.db",null,2); db =dbUtil.getReadableDatabase(); uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); uriMatcher.addURI("com.example.android_contentprovider.PERSON","student",1); uriMatcher.addURI("com.example.android_contentprovider.PERSON","student/#",2); return false; } @Nullable @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { int code=uriMatcher.match(uri); switch (code){ case 1: return db.query(false,"student",projection,selection,selectionArgs,null,null,sortOrder,null); case 2: long id= ContentUris.parseId(uri); return db.rawQuery("select * from student where _id=?",new String[]{id+""}); } return null; } @Nullable @Override public String getType(Uri uri) { return null; } @Nullable @Override public Uri insert(Uri uri, ContentValues values) { return null; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { return 0; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { return 0; }}ContentProvider完成了之后便可以通过ContentResolver进行访问ContentProvider提供的数据。 通过ContextWraper类定义的getContentResolver()方法便可以获取ContentResolver的对象;
public class MainActivity extends AppCompatActivity { private EditText et_main_id; private Uri uri; private ContentResolver contentResolver; private Cursor cursor; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); contentResolver = getContentResolver(); list2= (ListView) findViewById(R.id.list2); et_main_id = (EditText) findViewById(R.id.et_main_id); } public void getData(View view){ if (TextUtils.isEmpty(et_main_id.getText().toString())){ uri = Uri.parse("content://com.example.android_contentprovider.PERSON/student"); }else{ String id= et_main_id.getText().toString(); uri = Uri.parse("content://com.example.android_contentprovider.PERSON/student/"+id); } cursor = contentResolver.query(uri,null,null,null,null); }}新闻热点
疑难解答