2014-09-21 94 views
5

我的应用程序有一个按照Android developer site显示的结构创建的同步适配器。该onPerformSync()方法从互联网获取数据,并与大容量插入其插入在数据库上:有冲突的交易时onPerformSync()多次调用

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

onPerformSync()只有在使用“requestSync”api强制调用时才会被调用,并且在使用空包创建账户时会被调用一次。

0

我被卡住了同样的问题,毕竟我发现我也多次呼吁ContentResolver.requestSync()(每onPerformSync()之前)。换句话说,requestSync()导致onPerformSync()呼叫。这是我的错误,我应该重新考虑逻辑。

尝试在您的代码中登录requestSync()调用,并且您可能会发现错误。