Sam Steele の demoに基づいて SyncProvider を作成しています。
しかし、私は大きな問題に遭遇しました。タイムスタンプを ContactsContract.RawContacts.SYNC2 フィールドに書き込みます。SDK エミュレーターでは、これは問題なく機能します。ただし、私のGalaxy Nexusではそうではありません...理由や修正方法を知っている人はいますか?
これが私のコードです:
タイムスタンプの書き込み:
builder = ContentProviderOperation.newUpdate(ContactsContract.RawContacts.CONTENT_URI);
builder.withSelection(ContactsContract.RawContacts.CONTACT_ID + " = '" + rawContactId + "'", null);
builder.withValue(ContactsContract.RawContacts.SYNC2, String.valueOf(timestamp));
operationList.add(builder.build());
mContentResolver.applyBatch(ContactsContract.AUTHORITY, operationList);
それを読む:
Uri rawContactUri = RawContacts.CONTENT_URI.buildUpon()
.appendQueryParameter(RawContacts.ACCOUNT_NAME, account.name)
.appendQueryParameter(RawContacts.ACCOUNT_TYPE, account.type)
.build();
mContentResolver = context.getContentResolver();
Cursor c1 = mContentResolver.query(rawContactUri, new String[] { BaseColumns._ID, UsernameColumn, ContactsContract.RawContacts.SYNC2 }, null, null, null);
while (c1.moveToNext()) {
SyncEntry entry = new SyncEntry();
entry.raw_id = c1.getLong(c1.getColumnIndex(BaseColumns._ID));
long oldTimestamp = -1;
if (!c1.isNull(c1.getColumnIndex(ContactsContract.RawContacts.SYNC2))){
oldTimestamp = Long.valueOf(c1.getString(c1.getColumnIndex(ContactsContract.RawContacts.SYNC2)));
Log.i("READ TIMESTAMP", String.valueOf(oldTimestamp));
}
entry.photo_timestamp = oldTimestamp;
localContacts.put(c1.getString(1), entry);
}
c1.close();
何らかの理由で、c1.isNull は Galaxy Nexus では常に true のようです。私は何を間違っていますか?
更新:どうやら、いくつかの連絡先 (100 を超えるうちの 1-5) に対して書き込まれることがあるため、さらに混乱しています...
更新: ContactProvider SQL db を確認しましたが、sync2 フィールドが実際には空であるため、タイムスタンプの書き方に問題があるようです。