我正在编写基于Sam Steele 的演示的 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 上似乎总是正确的。我究竟做错了什么?
更新:显然,它有时会为几个联系人(> 100个中的1-5个)编写,所以我现在更加困惑......
更新:我检查了 ContactProvider SQL db 并且 sync2 字段确实是空的,所以这似乎是我如何编写时间戳的问题。