共计 4226 个字符,预计需要花费 11 分钟才能阅读完成。
定义
ContentProvider
顾名思义就是内容提供者,通过屏蔽底层过程间通信的具体实现,为不同利用之间的数据共享提供对立的接口。用户能够灵便的实现 ContentProvider
封装的数据存储和增删改查接口。
-
ContentProvider
中应用URI
拜访数据,URI 格局如下:[scheme://][host:port][path][?query]
content://com.example.provider/person
应用
1. 在 AndroidManifest.xml 注册
<provider
android:authorities="com.example.provider"
android:name=".ExampleContentProvider"
android:exported="true"/>
- 其中
authorities
字段即为以后ContentProvider
的惟一标识,拜访 URI 为 content://com.example.provider
2. 代码实现
(1)定义数据库操作类
public class DbHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "person.db";
private static final int DB_VERSION = 1;
private static final String TABLE_NAME = "person";
private static final String ID = "_id";
private static final String NAME = "name";
public DbHelper(Context context) {super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "CREATE TABLE" + TABLE_NAME + "(" + ID
+ "INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL" + "," + NAME
+ "CHAR(10) )";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}}
(2)实现ContentProvider
public class ExampleContentProvider extends ContentProvider {
private SQLiteDatabase db;
private static final String MAUTHORITIESNAME = "com.example.provider";
private static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
private static final int PERSON = 1;
private static final int PERSON_NUMBER = 2;
private static final int PERSON_TEXT = 3;
private static final String TABLE_NAME = "person";
// 构建 URI
static {
// content://com.example.provider/person
matcher.addURI(MAUTHORITIESNAME, "person", PERSON);
// # 代表任意数字 content://com.example.provider/person/1
matcher.addURI(MAUTHORITIESNAME, "person/#", PERSON_NUMBER);
// * 代表任意文本 content://com.example.provider/person/filter/personXxx
matcher.addURI(MAUTHORITIESNAME, "person/filter/*", PERSON_TEXT);
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// Implement this to handle requests to delete one or more rows.
return 0;
}
@Override
public String getType(Uri uri) {
// Implement this to handle requests for the MIME type of the data
// at the given URI.
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
// Implement this to handle requests to insert a new row.
int match = matcher.match(uri);
switch (match) {
case PERSON:
long id = db.insert(TABLE_NAME, null, values);
return ContentUris.withAppendedId(uri, id);
case PERSON_NUMBER:
case PERSON_TEXT:
default:
break;
}
return null;
}
@Override
public boolean onCreate() {
// Implement this to initialize your content provider on startup.
DbHelper dbHelper = new DbHelper(getContext());
db = dbHelper.getWritableDatabase();
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// Implement this to handle query requests from clients.
int match = matcher.match(uri);
switch (match) {
case PERSON:
db.query(TABLE_NAME, projection, selection, selectionArgs, null ,null, sortOrder);
case PERSON_NUMBER:
case PERSON_TEXT:
default:
break;
}
return null;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
// Implement this to handle requests to update one or more rows.
return 0;
}
}
(3)通过 ContentResolver
调用 ContentProvider
拜访数据库
private String uri = "content://com.example.provider/person";
public String queryPersonName() {
String name = null;
Cursor cursor = getContentResolver().query(Uri.parse(uri), null, null, null, null);
while (cursor.moveToNext()) {name = cursor.getString(cursor.getColumnIndex("name"));
}
return name;
}
public void insertPerson(String name) {ContentValues values = new ContentValues();
values.put("name", name);
Uri result = getContentResolver().insert(Uri.parse(uri), values);
long parseid = ContentUris.parseId(result);
if (parseid > 0) {// insert success}
}
内容解决者 ContentResolver
ContentResolver
通过 URI
调用 getContentResolver()
获取ContentProvider
提供的数据接口,进而进行增删改查等操作。
getContentResolver().query(Uri.parse(uri), null, null, null, null);
内容观察者 ContentObserver
ContentObserver
内容观察者通过指定 URI
监听ContentProvider
数据是否扭转。
1. 注册 ContentObserver
private void registerContentObserver() {Uri uri = Uri.parse("content://com.example.provider/person");
getContentResolver().registerContentObserver(uri, true,
new ExampleContentObserver(new Handler()));
}
2. 监听内容变动
public class ExampleContentObserver extends ContentObserver {private static final String TAG = ExampleContentObserver.class.getSimpleName();
public ExampleContentObserver(Handler handler) {super(handler);
}
@Override
public void onChange(boolean selfChange) {super.onChange(selfChange);
Log.i(TAG, "content has been changed");
}
}
正文完