ContentProvider:
ContentProvider的接口充当应用程序之间的桥梁,通过它可以实现应用程序之间的数据共享和改变,首先你需要在AndroidManifest XML文件中设置权限许可,并且可以通过简单的URI模型进行访问,每个内容提供提都有一个唯一的统一的资源标识符(URI),通常其URI可以有ContentProvider的authority和数据表名字组成。
应用程序需要通过ContentResolver实例访问内容提供器,如
ContentResolver crInstance = getContentResolver();
crInstance.query(People.CONTENT_URI,null,null,null,null,);
ContentValues new_values = new ContentValues();
crInstance.insert(People.CONTENT_URI,new_values);
crInstance.delete(People.CONTEN_URI,null,null);
crInstance.update(People_URI,null,null);
先介绍一下Android系统的原生数据库
- Browser
- CallLog
- Contacts
- LiveFolders
- MediaStore
- Setting
- SearchRecentSuggestion
- SyncStateContact
- UserDictionary
要想在其他应用程序中访问数据库,首先你需要创建一个ContentProvider的继承类,然后 继承其方法,当你在另一个应用程序中得到 ContentResolver时,则可以调用这些方法。可以选择性override方法有:
- query
- insert
- update
- delete
- getType
- onCreate
先介绍一个UriMatcher这个类,用来辅助实现在ContentProvider中URI的匹配操作 。首先你可以先定义一些code,这些code可以呈tree装,用于匹配成功时的返回值。
private static final int PEOPLE = 1;
private static final int PEOPLE_ID = 2;
private static final int PEOPLE_PHONES = 3;
private static final int PEOPLE_PHONES_ID = 4;
private static final int PEOPLE_CONTACTMETHODS = 7;
private static final int PEOPLE_CONTACTMETHODS_ID = 8;
private static final int DELETED_PEOPLE = 20;
private static final int PHONES = 9;
private static final int PHONES_ID = 10;
private static final int PHONES_FILTER = 14;
private static final int CONTACTMETHODS = 18;
private static final int CONTACTMETHODS_ID = 19;
private static final int CALLS = 11;
private static final int CALLS_ID = 12;
private static final int CALLS_FILTER = 15;
然后定义你的UriMatcher实例。
private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);
static
{
sURIMatcher.addURI("contacts", "people", PEOPLE);
sURIMatcher.addURI("contacts", "people/#", PEOPLE_ID);
sURIMatcher.addURI("contacts", "people/#/phones", PEOPLE_PHONES);
sURIMatcher.addURI("contacts", "people/#/phones/#", PEOPLE_PHONES_ID);
sURIMatcher.addURI("contacts", "people/#/contact_methods", PEOPLE_CONTACTMETHODS);
sURIMatcher.addURI("contacts", "people/#/contact_methods/#", PEOPLE_CONTACTMETHODS_ID);
sURIMatcher.addURI("contacts", "deleted_people", DELETED_PEOPLE);
sURIMatcher.addURI("contacts", "phones", PHONES);
sURIMatcher.addURI("contacts", "phones/filter/*", PHONES_FILTER);
sURIMatcher.addURI("contacts", "phones/#", PHONES_ID);
sURIMatcher.addURI("contacts", "contact_methods", CONTACTMETHODS);
sURIMatcher.addURI("contacts", "contact_methods/#", CONTACTMETHODS_ID);
sURIMatcher.addURI("call_log", "calls", CALLS);
sURIMatcher.addURI("call_log", "calls/filter/*", CALLS_FILTER);
sURIMatcher.addURI("call_log", "calls/#", CALLS_ID);
}
这样改UriMather实例就具有了匹配多个URI功能,其中#表示任意number,*表示任意字母。
public void addURI(String authority, String path, int code)将一个Uri添加到该UriMatcher中,并确定成功匹配后的返回值。
public int match(Uri uri)实现匹配功能,返回code。
public class DiaryContentProvider extends ContentProvider {
private MyDB dba;
private static final UriMatcher sUriMatcher;
private static final int DIARIES = 1;
public static final String AUTHORITY = "com.example.almoliu.mydbtest";
static {
sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
sUriMatcher.addURI(AUTHORITY,Constants.TABLE_NAME,DIARIES);
}
@Override
public boolean onCreate() {
dba = new MyDB(this.getContext());
dba.openW();
return false;
}
@Nullable
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
Cursor c= null;
// dba.openW();
switch (sUriMatcher.match(uri)) {
case DIARIES:
c = dba.getdiaries();
break;
default:
throw new IllegalArgumentException("Unknow URI"+uri);
}
c.setNotificationUri(getContext().getContentResolver(),uri);
return c;
}
public DiaryContentProvider() {
super();
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
return 0;
}
@Nullable
@Override
public String getType(Uri uri) {
return null;
}
@Nullable
@Override
public Uri insert(Uri uri, ContentValues values) {
return null;
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
return 0;
}
}
在另一个应用程序的activity中:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView)findViewById(R.id.output);
String myUri = "content://com.example.almoliu.mydbtest/diaries";
Uri CONTENT_URI = Uri.parse(myUri);
ContentResolver crInstance = getContentResolver();
Cursor c = crInstance.query(CONTENT_URI, null, null, null, null);
StringBuilder sb = new StringBuilder();
if(c.moveToFirst()) {
do{
sb.append(c.getString(1)).append("\n");
}while(c.moveToNext());
}
tv.setText(sb.toString());
}