Android 未刷新游标加载程序数据
我正在使用Android 未刷新游标加载程序数据,android,android-contentprovider,android-cursor,Android,Android Contentprovider,Android Cursor,我正在使用CursorLoader和ContentProvider将数据提取到游标中。 据我所知,游标加载器注册了一个内容观察者,因此每当游标的基础数据发生变化时,都应该调用加载器的onLoadFinished 在我的代码中,一个新行插入到content://com.example.phonehistory/calluri,每当呼叫状态改变时(例如,呼叫处于传入状态,然后被切断(EXTRA\u state\u IDLEin broadcastReceiver))。每当我得到这个状态改变时,我就插
CursorLoader
和ContentProvider
将数据提取到游标中。
据我所知,游标加载器注册了一个内容观察者,因此每当游标的基础数据发生变化时,都应该调用加载器的onLoadFinished
在我的代码中,一个新行插入到content://com.example.phonehistory/call
uri,每当呼叫状态改变时(例如,呼叫处于传入状态,然后被切断(EXTRA\u state\u IDLE
in broadcastReceiver))。每当我得到这个状态改变时,我就插入数据
问题是插入新行时没有调用加载程序的onLoadFinished
请注意,当我收到此问题时,我的应用程序正在运行
加载器回调
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
Toast.makeText(this, "onCreate for loader", Toast.LENGTH_SHORT).show();
Uri uri1 = Uri.parse("content://com.example.phonehistory/call");
CursorLoader loader = new CursorLoader(
this,
uri1,
null,
null,
null,
null);
return loader;
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
Toast.makeText(this, "onload finished", Toast.LENGTH_SHORT).show();
if(loader.getId()==1){
showDataChanges(cursor);
}
}
要插入数据的广播接收器:
@Override
public void onReceive(Context c, Intent i) {
// TODO Auto-generated method stub
Bundle bundle=i.getExtras();
if(bundle==null)
return;
SharedPreferences sp=c.getSharedPreferences("ZnSoftech", Activity.MODE_PRIVATE);
String s=bundle.getString(TelephonyManager.EXTRA_STATE);
if(i.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL))
{
String number=i.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
sp.edit().putString("number", number).commit();
sp.edit().putString("state", s).commit();
}
else if(s.equals(TelephonyManager.EXTRA_STATE_RINGING))
{
String number=bundle.getString("incoming_number");
sp.edit().putString("number", number).commit();
sp.edit().putString("state", s).commit();
}
else if(s.equals(TelephonyManager.EXTRA_STATE_OFFHOOK))
{
sp.edit().putString("state", s).commit();
}
else if(s.equals(TelephonyManager.EXTRA_STATE_IDLE))
{
String state=sp.getString("state", null);
if(!state.equals(TelephonyManager.EXTRA_STATE_IDLE))
{
sp.edit().putString("state", null).commit();
}
sp.edit().putString("state", s).commit();
getCalldetailsNow(c);
}
}
private void getCalldetailsNow(Context context) {
// TODO Auto-generated method stub
Cursor managedCursor = context.getContentResolver().query(
CallLog.Calls.CONTENT_URI, null, null, null,
android.provider.CallLog.Calls.DATE + " DESC");
int number = managedCursor.getColumnIndex(CallLog.Calls.NUMBER);
int duration1 = managedCursor
.getColumnIndex(CallLog.Calls.DURATION);
int type1 = managedCursor.getColumnIndex(CallLog.Calls.TYPE);
int date1 = managedCursor.getColumnIndex(CallLog.Calls.DATE);
if (managedCursor.moveToFirst() == true) {
String phNumber = managedCursor.getString(number);
String callDuration = managedCursor.getString(duration1);
String type = managedCursor.getString(type1);
String date = managedCursor.getString(date1);
String dir = null;
int dircode = Integer.parseInt(type);
switch (dircode) {
case CallLog.Calls.OUTGOING_TYPE:
dir = "OUTGOING";
break;
case CallLog.Calls.INCOMING_TYPE:
dir = "INCOMING";
break;
case CallLog.Calls.MISSED_TYPE:
dir = "MISSED";
break;
default:
dir = "MISSED";
break;
}
SimpleDateFormat sdf_date = new SimpleDateFormat("dd/MM/yyyy");
SimpleDateFormat sdf_time = new SimpleDateFormat("h:mm a");
// SimpleDateFormat sdf_dur = new SimpleDateFormat("KK:mm:ss");
String dateString = sdf_date.format(new Date(Long
.parseLong(date)));
String timeString = sdf_time.format(new Date(Long
.parseLong(date)));
// String duration_new=sdf_dur.format(new
// Date(Long.parseLong(callDuration)));
ContentValues values = new ContentValues();
values.put("number", phNumber);
values.put("date", dateString);
values.put("time", timeString);
values.put("duration", callDuration);
values.put("type", dir);
Uri uri1 = Uri.parse("content://com.example.phonehistory/call");
context.getContentResolver().insert(uri1, values);
}
managedCursor.close();
}
我已经花了好几个小时,但无法找出问题所在
@Override
public void onReceive(Context c, Intent i) {
// TODO Auto-generated method stub
Bundle bundle=i.getExtras();
if(bundle==null)
return;
SharedPreferences sp=c.getSharedPreferences("ZnSoftech", Activity.MODE_PRIVATE);
String s=bundle.getString(TelephonyManager.EXTRA_STATE);
if(i.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL))
{
String number=i.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
sp.edit().putString("number", number).commit();
sp.edit().putString("state", s).commit();
}
else if(s.equals(TelephonyManager.EXTRA_STATE_RINGING))
{
String number=bundle.getString("incoming_number");
sp.edit().putString("number", number).commit();
sp.edit().putString("state", s).commit();
}
else if(s.equals(TelephonyManager.EXTRA_STATE_OFFHOOK))
{
sp.edit().putString("state", s).commit();
}
else if(s.equals(TelephonyManager.EXTRA_STATE_IDLE))
{
String state=sp.getString("state", null);
if(!state.equals(TelephonyManager.EXTRA_STATE_IDLE))
{
sp.edit().putString("state", null).commit();
}
sp.edit().putString("state", s).commit();
getCalldetailsNow(c);
}
}
private void getCalldetailsNow(Context context) {
// TODO Auto-generated method stub
Cursor managedCursor = context.getContentResolver().query(
CallLog.Calls.CONTENT_URI, null, null, null,
android.provider.CallLog.Calls.DATE + " DESC");
int number = managedCursor.getColumnIndex(CallLog.Calls.NUMBER);
int duration1 = managedCursor
.getColumnIndex(CallLog.Calls.DURATION);
int type1 = managedCursor.getColumnIndex(CallLog.Calls.TYPE);
int date1 = managedCursor.getColumnIndex(CallLog.Calls.DATE);
if (managedCursor.moveToFirst() == true) {
String phNumber = managedCursor.getString(number);
String callDuration = managedCursor.getString(duration1);
String type = managedCursor.getString(type1);
String date = managedCursor.getString(date1);
String dir = null;
int dircode = Integer.parseInt(type);
switch (dircode) {
case CallLog.Calls.OUTGOING_TYPE:
dir = "OUTGOING";
break;
case CallLog.Calls.INCOMING_TYPE:
dir = "INCOMING";
break;
case CallLog.Calls.MISSED_TYPE:
dir = "MISSED";
break;
default:
dir = "MISSED";
break;
}
SimpleDateFormat sdf_date = new SimpleDateFormat("dd/MM/yyyy");
SimpleDateFormat sdf_time = new SimpleDateFormat("h:mm a");
// SimpleDateFormat sdf_dur = new SimpleDateFormat("KK:mm:ss");
String dateString = sdf_date.format(new Date(Long
.parseLong(date)));
String timeString = sdf_time.format(new Date(Long
.parseLong(date)));
// String duration_new=sdf_dur.format(new
// Date(Long.parseLong(callDuration)));
ContentValues values = new ContentValues();
values.put("number", phNumber);
values.put("date", dateString);
values.put("time", timeString);
values.put("duration", callDuration);
values.put("type", dir);
Uri uri1 = Uri.parse("content://com.example.phonehistory/call");
context.getContentResolver().insert(uri1, values);
}
managedCursor.close();
}