- 资料来源 《第一行代码》
1、内容URI的格式分两种:
content://com.wj.meme.provider/table1
查询com.wj.meme这个应用下的table1表所有数据。content://com.wj.meme.provider/table1/1
查询table1表里id=1的数据。
2、 使用通配符表示:
“*” 表示匹配任意长度的任意字符
“#” 表示匹配任意长度的数字
- 一个能够匹配任意表的内容URI格式就可以写成:
content://com.wj.meme.provider/* - 一个能够匹配table1表中任意一行数据的内容URI格式就可以写成:
content://com.wj.meme.provider/table1/#
3、MIME类型
一个内容URI所对应的MIME字符串主要由3部分组成,Android对这3个部分做了如下规定:
必须以vnd开头。
如果内容URI以路径结尾,则后接android.cursor.dir/,如果内容URI以id结尾,则后接android.cursor.item/。
最后,接上“vnd..”。
比如:
TABLE1_DIR:
return “vnd.android.cursor.dir/vnd.com.wj.meme.provider.table1”;
TABLE1_ITEM:
return “vnd.android.cursor.item/vnd.com.wj.meme.provider.table1”;
TABLE2_DIR:
return “vnd.android.cursor.dir/vnd.com.wj.meme.provider.table2”;
TABLE2_ITEM:
return “vnd.android.cursor.item/vnd.com.wj.meme.provider.table2”;
4.数据库结合内容提供者,为外界提供接口
**
* 自定义内容提供者
*/
public class DatabaseProvider extends ContentProvider {
public DatabaseProvider() {
}
public static final int MEME_DIR = 0;
public static final int MEME_ITEM = 1;
public static final int PAO_DIR = 2;
public static final int PAO_ITEM = 3;
public static final String AUTHORITY = "com.wj.meme.provider";
private static UriMatcher uriMatcher;
private MyDatabaseHelper dbHelper;
static {
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI(AUTHORITY, "meme", MEME_DIR);
uriMatcher.addURI(AUTHORITY, "meme/#", MEME_ITEM);
uriMatcher.addURI(AUTHORITY, "paopao", PAO_DIR);
uriMatcher.addURI(AUTHORITY, "paopao/#", PAO_ITEM);
}
/**
* 创建数据库
*
* @return true 表示创建数据库成功
*/
@Override
public boolean onCreate() {
dbHelper = new MyDatabaseHelper(getContext());
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
SQLiteDatabase db = dbHelper.getReadableDatabase();
Cursor cursor = null;
switch (uriMatcher.match(uri)) {
case MEME_DIR:
cursor = db.query("meme", projection, selection, selectionArgs, null, null, sortOrder);
break;
case MEME_ITEM:
String memeId = uri.getPathSegments().get(1);
cursor = db.query("meme", projection, "id=?", new String[]{memeId}, null, null, sortOrder);
break;
case PAO_DIR:
cursor = db.query("paopao", projection, selection, selectionArgs, null, null, sortOrder);
break;
case PAO_ITEM:
String paopaoId = uri.getPathSegments().get(1);
cursor = db.query("paopao", projection, "id=?", new String[]{paopaoId}, null, null, sortOrder);
break;
}
return cursor;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
SQLiteDatabase db = dbHelper.getReadableDatabase();
Uri uriReturn = null;
switch (uriMatcher.match(uri)) {
case MEME_DIR:
case MEME_ITEM:
long newMemeId = db.insert("meme", null, values);
uriReturn = Uri.parse("content://" + AUTHORITY + "/meme/" + newMemeId);
break;
case PAO_DIR:
case PAO_ITEM:
long newPaopaoId = db.insert("meme", null, values);
uriReturn = Uri.parse("content://" + AUTHORITY + "/paopao/" + newPaopaoId);
break;
}
return uriReturn;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
SQLiteDatabase db = dbHelper.getReadableDatabase();
int updateRows = 0;
switch (uriMatcher.match(uri)) {
case MEME_DIR:
updateRows = db.update("meme", values, selection, selectionArgs);
break;
case MEME_ITEM:
String memeId = uri.getPathSegments().get(1);
updateRows = db.update("meme", values, "id=?", new String[]{memeId});
break;
case PAO_DIR:
updateRows = db.update("paopao", values, selection, selectionArgs);
break;
case PAO_ITEM:
String paopaoId = uri.getPathSegments().get(1);
updateRows = db.update("paopao", values, "id=?", new String[]{paopaoId});
break;
}
return updateRows;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
SQLiteDatabase db = dbHelper.getReadableDatabase();
int deleteRows = 0;
switch (uriMatcher.match(uri)) {
case MEME_DIR:
deleteRows = db.delete("meme",selection,selectionArgs);
break;
case MEME_ITEM:
String memeId = uri.getPathSegments().get(1);
deleteRows = db.delete("meme","i=?",new String[]{memeId});
break;
case PAO_DIR:
deleteRows = db.delete("paopao",selection,selectionArgs);
break;
case PAO_ITEM:
String paopaoId = uri.getPathSegments().get(1);
deleteRows = db.delete("meme","i=?",new String[]{paopaoId});
break;
}
return deleteRows;
}
@Override
public String getType(Uri uri) {
switch (uriMatcher.match(uri)){
case MEME_DIR:
return "vnd.android.cursor.dir/vnd."+AUTHORITY+"meme";
case MEME_ITEM:
return "vnd.android.cursor.item/vnd."+AUTHORITY+"meme";
case PAO_DIR:
return "vnd.android.cursor.dir/vnd."+AUTHORITY+"paopao";
case PAO_ITEM:
return "vnd.android.cursor.item/vnd."+AUTHORITY+"paopao";
}
return null;
}
}
5.外界调用自定义的内容提供者
public class SecondActivity extends AppCompatActivity {
private String newId;
public static final String URI = "content://com.wj.meme.provider/meme";
@Override
public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
super.onCreate(savedInstanceState, persistentState);
}
public void insert(){
Uri uri = Uri.parse(URI);
ContentValues values = new ContentValues();
values.put("name","aaaa");
Uri newUri = getContentResolver().insert(uri, values);
newId = newUri.getPathSegments().get(1);
}
public void query() {
Uri uri = Uri.parse(URI);
Cursor cursor = getContentResolver().query(uri, null, null, null, null);
if (cursor != null) {
while (cursor.moveToNext()) {
//
}
cursor.close();
}
}
public void update(){
Uri uri = Uri.parse(URI+"/"+newId);
ContentValues values = new ContentValues();
values.put("name","bbbbb");
getContentResolver().update(uri,values,null,null);
}
public void delete(){
Uri uri = Uri.parse(URI+"/"+newId);
getContentResolver().delete(uri,null,null);
}