android - 在 android 联系人中导入重复项

标签 android android-contacts android-contentprovider

我在 android 中导入 .vcf 文件,但它导入了重复的记录。

代码: 导入联系人的方法:

 public void doImport(final String fileName, final boolean replace) {
    try {

            File vcfFile = new File(fileName);

            final BufferedReader vcfBuffer = new BufferedReader(new FileReader(fileName));



            final long maxlen = vcfFile.length();

    // Start lengthy operation in a background thread
            new Thread(new Runnable() {
         public void run() {
            long importStatus = 0;

            synchronized (syncMonitor) {
                    mAction = Action.IMPORT;
                    syncFileName = fileName;
                    }

            SQLiteDatabase db = mOpenHelper.getWritableDatabase();
            SQLiteStatement querySyncId = db.compileStatement("SELECT " + SYNCID + " FROM " + SYNCDATA_TABLE_NAME + " WHERE " + PERSONID + "=?");
            SQLiteStatement queryPersonId = db.compileStatement("SELECT " + PERSONID + " FROM " + SYNCDATA_TABLE_NAME + " WHERE " + SYNCID + "=?");
            SQLiteStatement insertSyncId = db.compileStatement("INSERT INTO  " + SYNCDATA_TABLE_NAME + " (" + PERSONID + "," + SYNCID + ") VALUES (?,?)");
            Contact parseContact = new Contact(querySyncId, queryPersonId, insertSyncId);
                    try {
                            long ret = 0;
                            do  {
                                    ret = parseContact.parseVCard(vcfBuffer);
                                    if (ret >= 0) {
                                            parseContact.addContact(getApplicationContext(), 0, replace);
                                            importStatus += parseContact.getParseLen();

                                            // Update the progress bar
                      //   app.updateProgress((int) (100 * importStatus / maxlen));
                                    }
                            } while (ret > 0);

                            db.close();
                        //    app.updateProgress(100);
                    synchronized (syncMonitor) {
                            mAction = Action.IDLE;
                          //  showNotification();
                    }
                 //   stopSelf();
                    } catch (IOException e) {
                    }
         }
     }).start();


    } catch (FileNotFoundException e) {
         //   app.updateStatus("File not found: " + e.getMessage());
    }
    Toast.makeText(mContext, "Import", Toast.LENGTH_LONG).show();

    }

    private static class DatabaseHelper extends SQLiteOpenHelper {

        DatabaseHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL("CREATE TABLE " + SYNCDATA_TABLE_NAME + " ("
                    + PERSONID + " INTEGER PRIMARY KEY,"
                    + SYNCID + " TEXT UNIQUE"
                    +");");
        }

                @Override
                public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                        // No need to do anything --- this is version 1

                }
    }

联系人.java : Click here Contact.java

代码链接:Click here to get whole code of contact import and export

如何在上面的代码中限制导入重复项

感谢 Adv.

最佳答案

请检查VCard中的“X-IRMC-LUID”字段是否与通讯录中保存的字段不一致。如果相同,则 VCard 条目重复。

没有关于如何生成此类字段的规范,并且 AFAIK 以不同的方式完成,主要是复制 UID 字段或 VCard 中的位置。此开源应用程序包含一些可能有用的代码示例:http://code.google.com/p/vcardio/

关于android - 在 android 联系人中导入重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9784950/

相关文章:

android - 安卓联系人图标存储技巧

android - 在另一个应用程序中向我自己的 ContentProvider 请求读取权限

android - 我如何在 android 日历中解析 "Event values must include an eventTimezone"?

android - EditText的drawableRight上的点击事件无法正常工作?

android - ConstraintLayout 在底部工作 TableView 中无法正常工作

android - 完全断开蓝牙低功耗设备

android - 释放 Android 内存的最佳方法

java - 如何在android中检索包含特定单词的联系人姓名?

android - 如何将我所有的短信标记为未读?

android - Canvas 不在自定义 View 中绘制