我正在开发一个Android应用程序,需要知道何时添加/更新/删除联系人.
所以我读了几篇帖子.我知道,只要联系人发生变更,我们就可以通过内容观察员获得通知,但我们无法获得添加/更新/删除的联系人.所以我已阅读官方API并准备我的设计如何捕获该特定联系人.
所以我一开始就想到了什么
我还了解到,如果用户删除了联系人,Android不会删除联系人,但是在删除的标志上设置为0.因此在这些情况下,行数将相同.
如官方文档中所述,Android还会多次更改联系人的行ID.那么我们如何能够像查询uri一样唯一地识别它们,如果没有,那么我们也必须为它设置观察者.
所以我想知道以上是否正确?并且在添加联系人的情况下,它将被添加到游标的最后一行或不意味着如果我检查系统数据库的最后一行是否接触,它将给我添加或不添加联系人.
我能够得到一个通用通知"联系人数据库发生了变化",但我想知道插入,更新或删除的特定记录.
我不想使用查找URI概念,因为我不想单独为每个联系人设置查找URI.我想要一个通用的解决方案,我可以知道何时更新或删除任何联系人.
我正在尝试使用内容观察器在我的应用程序中的sqlite数据库发生任何更改时更新服务.
我很困惑该怎么做,所以我把下面的代码放在一起.通常,内容观察者与联系人或媒体播放器一起使用后台服务.在我的研究中,我读到它可以与手机上的sqlite数据库一起使用.
问题:1.由于SQLite数据库没有一个URI,我更换了什么信息People.CONTENT_URI在
this.getContentResolver().registerContentObserver (People.CONTENT_URI, true, contentObserver);
Run Code Online (Sandbox Code Playgroud)
2.在我的研究中,我没有发现任何会进入数据库类的代码会提醒ContentObserver.Content Observer的所有代码都在服务类中工作吗?
请注意,此问题类似于Android SQLite数据库通知以及 如何监听联系人数据库中的更改 这两个问题都没有明确回答我的问题.如果您有解释此问题的代码,那将非常有帮助.
这是我下面的半pusedo代码.这是行不通的.我正在使用它来了解如何在数据库信息更改时更新服务.
package com.example.com.test.content.observer;
import java.sql.Date;
import java.util.Calendar;
import java.util.List;
import com.google.android.gcm.demo.app.Alerts.AlarmsService;
import com.google.android.gcm.demo.app.Alerts.Alerts;
import com.google.android.gcm.demo.app.sqllite.DatabaseSqlite;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.provider.Contacts.People;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.database.ContentObserver;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
import android.support.v4.app.NavUtils;
public class AlarmService extends Service
{
Handler mHandler = new Handler();
DatabaseSqlite db = new DatabaseSqlite(this);
List<Alerts> listAlerts; …Run Code Online (Sandbox Code Playgroud) 我正在尝试在成功保存联系电话簿中的机器人联系后启动应用程序.所以我想知道,是否有任何广播接收器用于电话簿中的更新以及在电话簿中添加新联系人.
或者在电话簿中找到添加或更新事件的任何其他方式.
我正在尝试检索所有联系人的显示名称和电话号码,但我希望它只返回有号码的行.
目前我有这样的它,它的工作原理:
ContentResolver cr = getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null,null, null, ContactsContract.Contacts.DISPLAY_NAME+ " COLLATE NOCASE");
while (cur.moveToNext())
{
if ( Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0)
{
String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
contacts[index] = name;
Cursor pCur = cr.query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", new String[]{id}, null);
pCur.moveToFirst();
numbers[index] = pCur.getString( pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
index++;
pCur.close();
}
Run Code Online (Sandbox Code Playgroud)
事情是它需要4-5秒才能加载,因为它运行了cr.query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", new String[]{id}, null);400次.
现在我的理解是,联系人的姓名和号码保存在不同的表中,您需要名称的ID才能获得该号码.
这可以更快地以任何其他方式完成吗?
提前致谢