mob*_*bob 31 android crud contactscontract contentobserver
我能够得到一个通用通知"联系人数据库发生了变化",但我想知道插入,更新或删除的特定记录.以下是注册并获取onChange通知的代码.不幸的是,它并不具体,这使得我的处理功能详尽且效率低下.
这是代码存根:
if ((mNativeContactsObserver == null) && (mHandler == null)) {
mHandler = new Handler(this.getMainLooper()) {
};
mNativeContactsObserver = new ContentObserver(mHandler) {
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
Bundle data = null;
Message message = mHandler.obtainMessage();
if (message != null) {
data = message.getData();
if (data != null) {
Logs.d(TAG, "Message = [" + message.toString() + "] data=[" + data.toString() + "]");
Logs.d(TAG, "Contents = [" + message.describeContents() + "]");
}
}
if (!selfChange) {
final Account accountListen = MySyncAdapter.lookupAccount(TAG, getApplicationContext(), getUserProfile().getAccountId(), AUTHORITY_MY_SYNC);
Logs.d(TAG, "onChange!? account: " + accountListen.name);
if (!ContentResolver.isSyncPending(account, ContactsContract.AUTHORITY)
&& (!ContentResolver.isSyncActive(account, ContactsContract.AUTHORITY))) {
Bundle extras = new Bundle();
extras.putInt(MySyncAdapter.EXTRA_SYNC_TYPE, MySyncAdapter.REQUEST_SYNC_NATIVE_CHANGED);
ContentResolver.requestSync(accountListen, ContactsContract.AUTHORITY, extras);
} else {
Logs.w(TAG, "There is a pending sync. This request is ignored.");
}
}
}
};
}
Uri uriContactsListen = ContactsContract.Contacts.CONTENT_URI.buildUpon().appendEncodedPath("#").build();
Logs.i(TAG, "Register listening for native contacts changes. [" + uriContactsListen + "]");
cr.registerContentObserver(uriContactsListen, true, mNativeContactsObserver);
Run Code Online (Sandbox Code Playgroud)
最后至少我能够检测到这个更新/删除/插入看看我的OnChange方法如下
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
Log.e("ContactChangeObserver", "onChange");
// 0 Update , 1 Delete , 2 Added
// Get count from phone contacts
final int currentCount = contactDBOperaion.getContactsCountFromPhone();
// Get count from your sqlite database
int mContactCount= DbContacts.getInstance().getContactsCount();
if (currentCount < mContactCount) {
// DELETE HAPPEN.
Log.e("Status", "Deletion");
contactDBOperaion.SyncContacts(1);
} else if (currentCount == mContactCount) {
// UPDATE HAPPEN.
contactDBOperaion.SyncContacts(0);
} else {
// INSERT HAPPEN.
Log.e("Status", "Insertion");
contactDBOperaion.SyncContacts(2);
}
}
Run Code Online (Sandbox Code Playgroud)
发生更新时我更新所有联系人
当插入发生时,我在检查现有数据库中的 isExist 后插入新添加的行
当删除发生时尚未找到解决方案
首先,您必须注册您的 contentObserver 才能接收更改通知。
通过调用以下命令来执行此操作:
registerContentObserver();
Run Code Online (Sandbox Code Playgroud)
之后,您需要在发生修改时通知所有侦听器:
contentResolver.notifyChange();
Run Code Online (Sandbox Code Playgroud)
这是该产品的规格:notifyChange
希望能帮助到你 ;)
干杯!
| 归档时间: |
|
| 查看次数: |
15097 次 |
| 最近记录: |