ContentProvider(内容提供者)是安卓四大组件之一,用来共享应用程序内的数据,当你需要把你的应用程序的数据共享给其他应用程序的时候,才需要用它该组件对外提供了其他应用可以直接访问的增删改查方法。
一般像底层做法就是:一是先需要内容提供者。写一个提供者的类继承 ContentProvider,重写这个类的增删改查的方法。进而就可以进行你先要的操作。其代码如下:
package com.example.an_sqlite.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.an_sqlite.db.DbHelper;
/**
* Created by Administrator on 2017/2/16.
*/
public class MyProvider extends ContentProvider {
private DbHelper dbHelper;
private SQLiteDatabase db;
private UriMatcher uriMatcher;
private Cursor c;
private static final int PERSONS = 1;
private static final int PERSON = 2;
@Override
public boolean onCreate() {
Log.i("test", "onCreate");
dbHelper = new DbHelper(getContext(), "questions.db", null, 2);
db = dbHelper.getReadableDatabase();
//实例化URI匹配器
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
//给匹配器中添加匹配规则
uriMatcher.addURI("com.example.an_sqlite.person", "persons", MyProvider.PERSONS);
uriMatcher.addURI("com.example.an_sqlite.person", "persons/#", MyProvider.PERSON);
return false;
}
@Nullable
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
Log.i("test", "query");
return db.query(true,"person",projection,selection,selectionArgs,null,null, sortOrder,null);
//开始匹配
// int code = uriMatcher.match(uri);
// switch (code) {
// case MyProvider.PERSONS:
// //查询所有
// c = db.query(true, "person", projection, selection, selectionArgs, null, null, sortOrder, null);
// Log.i("test", "所有");
// return c;
// case MyProvider.PERSON:
// //得到#的值
// long id = ContentUris.parseId(uri);
// Log.i("test", "单个");
// //查询单个:
// c = db.rawQuery("select * from person where _id=?",new String[]{id+""});
// return c;
// }
// 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;
}
}
其次便是内容的访问者,先获取内容的访问者,在进行接下来的操作,博主进行的是查询的操作。其代码如下:
package com.example.an_contentresolver;
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;
public class MainActivity extends AppCompatActivity {
private EditText et_main_id;
private ContentResolver cr;
private Uri uri;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_main_id = (EditText) findViewById(R.id.et_main_id);
//获取内容访问者
cr = getContentResolver();
}
public void getData(View view) {
//路径
Uri uri=Uri.parse("content://com.example.an_sqlite.data");
uri = Uri.parse("content://com.example.an_sqlite.person/persons");
// if (TextUtils.isEmpty(et_main_id.getText())) {
// uri = Uri.parse(“content://com.example.an_sqlite.person/persons”);
//
// } else {
// String id = et_main_id.getText().toString();
// uri = Uri.parse(“content://com.example.an_sqlite.person/persons/” + id);
// }
// Cursor cursor = cr.query(uri, null, null, null, null);
//
//
// while (cursor.moveToNext()) {
// int id = cursor.getInt(cursor.getColumnIndex(“_id”));
// String name = cursor.getString(cursor.getColumnIndex(“pname”));
// int age = cursor.getInt(cursor.getColumnIndex(“page”));
// Log.i(“test”, id + “” + name + “” + age);
}
}
当然别忘了配置内容提供者的清单文件,其代码如下:
<provider
android:authorities="com.example.an_sqlite.data"
android:name=".provider.MyProvider"
android:exported="true"
>
</provider>
虽然现在一般都是只需拿数据,不需要去提供了,但是了解一些底层的做法也是好的。