在Android日历中,查询实例表不总是返回最新数据的问题可能是由于缓存数据或异步查询导致的。以下是解决该问题的代码示例:
方法1:使用AsyncQueryHandler进行异步查询
public class MainActivity extends AppCompatActivity {
private static final int QUERY_INSTANCE_TOKEN = 1;
private AsyncQueryHandler queryHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
queryHandler = new MyAsyncQueryHandler(getContentResolver());
// 查询实例表
Uri uri = CalendarContract.Instances.CONTENT_URI;
String[] projection = {CalendarContract.Instances.TITLE, CalendarContract.Instances.BEGIN, CalendarContract.Instances.END};
String selection = null;
String[] selectionArgs = null;
String sortOrder = null;
queryHandler.startQuery(QUERY_INSTANCE_TOKEN, null, uri, projection, selection, selectionArgs, sortOrder);
}
private class MyAsyncQueryHandler extends AsyncQueryHandler {
public MyAsyncQueryHandler(ContentResolver cr) {
super(cr);
}
@Override
protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
super.onQueryComplete(token, cookie, cursor);
if (token == QUERY_INSTANCE_TOKEN) {
// 处理查询结果
if (cursor != null && cursor.moveToFirst()) {
do {
// 获取数据
String title = cursor.getString(cursor.getColumnIndex(CalendarContract.Instances.TITLE));
long beginTime = cursor.getLong(cursor.getColumnIndex(CalendarContract.Instances.BEGIN));
long endTime = cursor.getLong(cursor.getColumnIndex(CalendarContract.Instances.END));
// 处理数据...
} while (cursor.moveToNext());
}
// 关闭游标
if (cursor != null) {
cursor.close();
}
}
}
}
}
方法2:使用ContentObserver监听数据变化
public class MainActivity extends AppCompatActivity {
private static final int QUERY_INSTANCE_TOKEN = 1;
private Cursor cursor;
private ContentObserver contentObserver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 注册ContentObserver
contentObserver = new MyContentObserver();
getContentResolver().registerContentObserver(CalendarContract.Instances.CONTENT_URI, true, contentObserver);
// 查询实例表
Uri uri = CalendarContract.Instances.CONTENT_URI;
String[] projection = {CalendarContract.Instances.TITLE, CalendarContract.Instances.BEGIN, CalendarContract.Instances.END};
String selection = null;
String[] selectionArgs = null;
String sortOrder = null;
cursor = getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder);
if (cursor != null && cursor.moveToFirst()) {
do {
// 获取数据
String title = cursor.getString(cursor.getColumnIndex(CalendarContract.Instances.TITLE));
long beginTime = cursor.getLong(cursor.getColumnIndex(CalendarContract.Instances.BEGIN));
long endTime = cursor.getLong(cursor.getColumnIndex(CalendarContract.Instances.END));
// 处理数据...
} while (cursor.moveToNext());
}
}
@Override
protected void onDestroy() {
super.onDestroy();
// 取消注册ContentObserver
getContentResolver().unregisterContentObserver(contentObserver);
// 关闭游标
if (cursor != null) {
cursor.close();
}
}
private class MyContentObserver extends ContentObserver {
public MyContentObserver() {
super(new Handler());
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
// 查询实例表
Uri uri = CalendarContract.Instances.CONTENT_URI;
String[] projection = {CalendarContract.Instances.TITLE, CalendarContract.Instances.BEGIN, CalendarContract.Instances.END};
String selection = null;
String[] selectionArgs = null;
String sortOrder = null;
Cursor newCursor = getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder);
if (newCursor != null && newCursor.moveToFirst()) {
do {
// 获取数据
String title = newCursor.getString(newCursor.getColumnIndex(CalendarContract.Instances.TITLE));
long beginTime = newCursor.getLong(newCursor.getColumnIndex(CalendarContract.Instances.BEGIN));
long endTime = newCursor.getLong(newCursor.getColumnIndex(CalendarContract.Instances.END));
// 处理数据...
} while (newCursor.moveToNext());
}
// 关闭新游标
if (newCursor != null) {
newCursor.close();
}
}
}
}
这些代码示例演示了两种解决方法:使用AsyncQueryHandler进行异步查询和使用