【问题标题】:How to Update SQLite database when user add Contacts in Android Phone?用户在 Android 手机中添加联系人时如何更新 SQLite 数据库?
【发布时间】:2015-09-01 07:59:46
【问题描述】:

我正在为我的移动应用创建 SQLite 数据库。应用程序数据库将存储存储在 Android 手机中的联系人副本。下面的代码用于从数据库中复制联系人。我的问题是,每次打开 App 时,都会将整个数据复制到 SQLite 数据库中,从而导致大量重复条目。如果我在将记录复制到 SQLite 数据库之前尝试检查条目是否存在,那么每次启动应用程序时,它都会检查重复性导致应用程序过载。

为了解决我想的问题,如果用户添加联系人成功后有任何响应,那么我们可以使用该响应将联系人添加到 SQLite 数据库中,然后我们可以在启动 App 时取出数据库复制。由于我是 Android 世界的新手,因此请您提出解决此问题的最佳方法。

    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button prd = (Button) findViewById(R.id.duct);
    prd.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            load_contacts();
            display_cotacts();
            Log.i("Activity Main", "Completed Displaying List");
        }
    });
}
private void load_contacts(){
    openDB();
    ContentResolver cr = getContentResolver();
    Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,null,null,null,null);
    //String[] from = {ContactsContract.Phone.DISPLAY_NAME,ContactsContract.CommonDataKinds.Phone.NUMBER,ContactsContract.CommonDataKinds.Phone_ID};
    if(cur.getCount()>0) {
        while(cur.moveToNext()){
            String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
            String name = cur.getString((cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)));
            if(Integer.parseInt(cur.getString(
                    cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) >0){
                Cursor pCur = cr.query(
                        ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                        null,
                        ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?",
                        new String[]{id},null);
                while(pCur.moveToNext()){
                    Integer mobile = pCur.getInt(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                    String email = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.ADDRESS));
                    Integer imageID = pCur.getInt(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Photo.PHOTO_FILE_ID));
                    String status = "available";
                    String time = "now";
                    long newId = myDb.insertRow(name,mobile,email,imageID,status,time);
                    Toast.makeText(MainActivity.this, "Name: " + name + "Phone no:" + mobile + "Email:" + email + "image:" + imageID + "image_thumbnail:" + status, Toast.LENGTH_LONG).show();
                }
                //closeDB();
                pCur.close();
            }
        }

    }

}

【问题讨论】:

  • 您不能使用CONTACT_ID 或RAW_CONTACT_ID 作为数据库的主键或唯一键约束吗?从而阻止任何重复的插入?
  • 如果您使用 CursorLoader,它应该在数据更改时收到更新。如果联系人提供程序使用 notifyUri。它可能不会。但是,如果是这样,您可以使用 CursorLoader 加载联系人提供程序并在联系人更改时收到通知(您甚至可以将其放入服务中)。
  • 感谢克诺索斯的帮助。是否可以提供几行代码以更好地理解您的上述陈述。提前感谢您的帮助。
  • 查看此链接,对我很有用。 stackoverflow.com/questions/19829803/…

标签: android sqlite sql-insert


【解决方案1】:

我建议使用INSERT OR IGNORE INTO exampletable (UserId, UserName, ContactName) VALUES('1','UserName','ContactName'); // the variables are just examples;

或INSERT OR REPLACE INTO exampletable (UserId, UserName, ContactName) VALUES('1','UserName','ContactName');

替换将使用新的变量值更新现有条目,而忽略是不言自明的。

这将解决您的双重条目问题,并且检查将由您的 sqlite 数据库完成。

要检查最后修改日期,您应该查看此stackoverflow answer。

您可以简单地检索此日期并检查它是否与上次修改联系人的时间不同。但这也适用于每个联系人,因此根本不是一个完美的解决方案。

【讨论】:

  • 感谢回答。这将有助于检查重复性,但会在每次启动应用程序时扫描 SQLite,即使用户没有添加新联系人也是如此。我正在寻找电话通讯录中的任何更新也可以更新 SQLite 的方法。这将避免在启动活动时不必要地查找 SQLite。希望我说清楚了。请告诉我。
  • 但我建议检查 BackgroundActivity 中的更改以避免过度使用主线程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-01
相关资源
最近更新 更多