<application android:label="@string/calendar_storage"
android:icon="@drawable/app_icon">
<!-- TODO: Remove dependency of application on the test runner
(android.test) library. -->
<uses-library android:name="android.test.runner" />
<provider android:name="CalendarProvider2" android:authorities="com.android.calendar"
android:label="@string/provider_label"
android:multiprocess="false"
android:readPermission="android.permission.READ_CALENDAR"
android:writePermission="android.permission.WRITE_CALENDAR" />
这里在配置文件里面的Application里面定义了(指定了)每个.java文件所能用到的数据库。这样当你contentResolver实例时,就是取这个指定数据库的各个方法接口的实例。
通过android:authorities="com.android.calendar"这个权限,指定了该从属于哪个provider;
在代码中通过:
定义URI: public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/calendars");
定义AUTHORITY: public static final String AUTHORITY = "com.android.calendar";
使用URI: mQueryHandler.startQuery(0, null, Calendars. CONTENT_URI , CALENDARS_PROJECTION,
CALENDARS_WHERE, null /* selection args */, null /* sort order */);
系统根据URI查找到数据库的实现:1.根据AUTHORITY = "com.android.calendar";到配置文件Manifest.xml文件的<provider标签里面找〉
如下:<provider android:name="CalendarProvider2" android:authorities="com.android.calendar"
从而我们知道,authorities="com.android.calendar"对应的数据库是CalendarProvider2,从而我们找CalendarProvider2.java ;
注:有些时候不会明确的制定是哪个数据库,但是根下去会发现一般都是指本应用所使用的数据库;
mQueryHandler = new QueryHandler(getContentResolver());
public ContentResolver getContentResolver() {
return mBase.getContentResolver();
}
这里mBase就是指本应用的数据库;
而具体是哪张表呢??
这时就用到 Uri.parse("content://" + AUTHORITY + "/calendars");最后一个参数了,其代表表名;即calendars这张表:
具体的查询数据库中的某张表,1。定义一个 该种数据库 的contentResolver实例,
2.通过该实例对象使用该数据库实现好的query方法。
3.跳到该数据库实现的query方法里面,从而走里面的代码流程,(一般都是根据你提供的URI,来分段解析,最后一段解析为数据库的具体的一张表)
注:在上面第3步的解析中,一般会有一个专门的解析函数,uri.match方法;
然后选择具体哪张表在走,switch()语句;
如下:
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
String sortOrder) {
if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.v(TAG, "query uri - " + uri);
}
final SQLiteDatabase db = mDbHelper.getReadableDatabase();
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
String groupBy = null;
String limit = null; // Not currently implemented
final int match = sUriMatcher.match(uri);
switch (match) {
case SYNCSTATE:
return mDbHelper.getSyncState().query(db, projection, selection, selectionArgs,
sortOrder);
case EVENTS:
qb.setTables(CalendarDatabaseHelper.Views.EVENTS);
qb.setProjectionMap(sEventsProjectionMap);
appendAccountFromParameter(qb, uri);
break;
case EVENTS_ID:
qb.setTables(CalendarDatabaseHelper.Views.EVENTS);
qb.setProjectionMap(sEventsProjectionMap);
selectionArgs = insertSelectionArg(selectionArgs, uri.getPathSegments().get(1));
qb.appendWhere("_id=?");
break;
contentResolver是取当前数据库的接口的一个实例,通过这个接口,我们可以调用数据库里面实现的具体方法(query,delete);
并且通过URI,找到制定的表;
android:icon="@drawable/app_icon">
<!-- TODO: Remove dependency of application on the test runner
(android.test) library. -->
<uses-library android:name="android.test.runner" />
<provider android:name="CalendarProvider2" android:authorities="com.android.calendar"
android:label="@string/provider_label"
android:multiprocess="false"
android:readPermission="android.permission.READ_CALENDAR"
android:writePermission="android.permission.WRITE_CALENDAR" />
这里在配置文件里面的Application里面定义了(指定了)每个.java文件所能用到的数据库。这样当你contentResolver实例时,就是取这个指定数据库的各个方法接口的实例。
通过android:authorities="com.android.calendar"这个权限,指定了该从属于哪个provider;
在代码中通过:
定义URI: public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/calendars");
定义AUTHORITY: public static final String AUTHORITY = "com.android.calendar";
使用URI: mQueryHandler.startQuery(0, null, Calendars. CONTENT_URI , CALENDARS_PROJECTION,
CALENDARS_WHERE, null /* selection args */, null /* sort order */);
系统根据URI查找到数据库的实现:1.根据AUTHORITY = "com.android.calendar";到配置文件Manifest.xml文件的<provider标签里面找〉
如下:<provider android:name="CalendarProvider2" android:authorities="com.android.calendar"
从而我们知道,authorities="com.android.calendar"对应的数据库是CalendarProvider2,从而我们找CalendarProvider2.java ;
注:有些时候不会明确的制定是哪个数据库,但是根下去会发现一般都是指本应用所使用的数据库;
mQueryHandler = new QueryHandler(getContentResolver());
public ContentResolver getContentResolver() {
return mBase.getContentResolver();
}
这里mBase就是指本应用的数据库;
而具体是哪张表呢??
这时就用到 Uri.parse("content://" + AUTHORITY + "/calendars");最后一个参数了,其代表表名;即calendars这张表:
具体的查询数据库中的某张表,1。定义一个 该种数据库 的contentResolver实例,
2.通过该实例对象使用该数据库实现好的query方法。
3.跳到该数据库实现的query方法里面,从而走里面的代码流程,(一般都是根据你提供的URI,来分段解析,最后一段解析为数据库的具体的一张表)
注:在上面第3步的解析中,一般会有一个专门的解析函数,uri.match方法;
然后选择具体哪张表在走,switch()语句;
如下:
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
String sortOrder) {
if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.v(TAG, "query uri - " + uri);
}
final SQLiteDatabase db = mDbHelper.getReadableDatabase();
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
String groupBy = null;
String limit = null; // Not currently implemented
final int match = sUriMatcher.match(uri);
switch (match) {
case SYNCSTATE:
return mDbHelper.getSyncState().query(db, projection, selection, selectionArgs,
sortOrder);
case EVENTS:
qb.setTables(CalendarDatabaseHelper.Views.EVENTS);
qb.setProjectionMap(sEventsProjectionMap);
appendAccountFromParameter(qb, uri);
break;
case EVENTS_ID:
qb.setTables(CalendarDatabaseHelper.Views.EVENTS);
qb.setProjectionMap(sEventsProjectionMap);
selectionArgs = insertSelectionArg(selectionArgs, uri.getPathSegments().get(1));
qb.appendWhere("_id=?");
break;
contentResolver是取当前数据库的接口的一个实例,通过这个接口,我们可以调用数据库里面实现的具体方法(query,delete);
并且通过URI,找到制定的表;