我的应用程序按照Android developer site显示的结构创建了同步适配器。 onPerformSync()
方法从Internet获取数据并使用批量插入将其插入数据库:
Vector<ContentValues> cVVector = new Vector<ContentValues>(rssItems.size());
for(RssItem rssItem : rssItems) {
ContentValues newsValues = new ContentValues();
// Get data from the remote server
// Fill all the values
newsValues.put(...);
// Add the values to a vector, at the end a BulkInsert will be called
cVVector.add(newsValues);
}
mContext.getContentResolver().bulkInsert(NewsEntry.CONTENT_URI, cvArray);
数据库在处理冲突时有一个IGNORE政治:
final String SQL_CREATE_NEWS_TABLE = "CREATE TABLE " + NewsEntry.TABLE_NAME + " (" +
NewsEntry._ID + " INTEGER PRIMARY KEY," +
NewsEntry.COLUMN_NEWS_TITTLE + " TEXT UNIQUE NOT NULL, " +
NewsEntry.COLUMN_NEWS_CONTENT + " TEXT NOT NULL, " +
NewsEntry.COLUMN_NEWS_DESCRIPTION + " TEXT NOT NULL, " +
NewsEntry.COLUMN_NEWS_IMAGE + " TEXT, " +
NewsEntry.COLUMN_NEWS_DATE + " TEXT NOT NULL, " +
NewsEntry.COLUMN_NEWS_LINK + " TEXT NOT NULL, " +
"UNIQUE (" + NewsEntry.COLUMN_NEWS_TITTLE +") ON CONFLICT IGNORE"+
" );";
同步适配器配置为每86400秒执行一次同步
/**
* Helper method to schedule the sync adapter periodic execution
*/
public static void configurePeriodicSync(Context context, int syncInterval, int flexTime) {
Account account = getSyncAccount(context);
String authority = context.getString(R.string.content_authority);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
// we can enable inexact timers in our periodic sync
SyncRequest request = new SyncRequest.Builder().
syncPeriodic(syncInterval, flexTime).
setSyncAdapter(account, authority).build();
ContentResolver.requestSync(request);
} else {
ContentResolver.addPeriodicSync(account,
authority, new Bundle(), syncInterval);
}
}
然而,它被连续调用。
答案 0 :(得分:0)
onPerformSync()只有在使用&#34; requestSync&#34;强制调用时才会被调用。 api和一次创建帐户时使用空捆绑。
答案 1 :(得分:0)
我遇到了同样的问题,毕竟我发现我也多次调用ContentResolver.requestSync()
(在每onPerformSync()
之前)。换句话说,requestSync()
会导致onPerformSync()
来电。这是我的错误,我应该重新考虑逻辑。
尝试在代码中记录requestSync()
次来电,并且您可能会发现错误。