Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在android原始联系人中存储隐藏的同步标识符_Android_Android Contacts - Fatal编程技术网

在android原始联系人中存储隐藏的同步标识符

在android原始联系人中存储隐藏的同步标识符,android,android-contacts,Android,Android Contacts,我想创建一个应用程序,同步来自给定服务器的联系人。为了识别这些联系人,我想在android联系人的隐藏字段中存储一个标识符 我已经找到了一个似乎适合这个领域的领域,但我不知道如何正确使用这个领域 我试着用以下方式设置它: ArrayList<ContentProviderOperation> ops = new ArrayList<>(); int rawContactInsertIndex = ops.size(); ops.add(ContentPr

我想创建一个应用程序,同步来自给定服务器的联系人。为了识别这些联系人,我想在android联系人的隐藏字段中存储一个标识符

我已经找到了一个似乎适合这个领域的领域,但我不知道如何正确使用这个领域

我试着用以下方式设置它:

ArrayList<ContentProviderOperation> ops =
        new ArrayList<>();

int rawContactInsertIndex = ops.size();
ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
        .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, accountType)
        .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, ACCOUNT_NAME)
        .withValue(ContactsContract.RawContacts.SYNC1, "myInternalId")
        .build());

ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
        .withValueBackReference(ContactsContract.RawContacts.Data.RAW_CONTACT_ID, rawContactInsertIndex)
        .withValue(ContactsContract.RawContacts.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
        .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, "Test User")
        .build());

getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);

如果我想在原始联系人中设置它,那么在第二批中,我会得到一个异常。

插入值的方式似乎正确,但读取值的方法却不正确

您无法查询
Contacts.CONTENT\u URI
并从
RawContacts
表中获取字段

要读回您的值,请尝试以下操作:

ContentResolver cr = this.getContentResolver();
String[] projection = new String[] { RawContacts._ID, RawContacts.CONTACT_ID, RawContacts.SYNC1 }
String selection = RawContacts.ACCOUNT_TYPE + " = '" + accountType + "' AND " + RawContacts.ACCOUNT_NAME + " = '" + accountName + "'";
Cursor cur = cr.query(ContactsContract.RawContacts.CONTENT_URI, projection, selection, null, null);

while (cur.moveToNext()) {
    Long rawId = cur.getLong(0);
    Long contactId = cur.getLong(1);
    String sync1 = cur.getString(2);

    System.out.println("Contact id=" + contactId + " raw-id=" + rawId + " sync1=" + sync1);
}

cur.close();

插入值的方式似乎正确,但读取值的方法却不正确

您无法查询
Contacts.CONTENT\u URI
并从
RawContacts
表中获取字段

要读回您的值,请尝试以下操作:

ContentResolver cr = this.getContentResolver();
String[] projection = new String[] { RawContacts._ID, RawContacts.CONTACT_ID, RawContacts.SYNC1 }
String selection = RawContacts.ACCOUNT_TYPE + " = '" + accountType + "' AND " + RawContacts.ACCOUNT_NAME + " = '" + accountName + "'";
Cursor cur = cr.query(ContactsContract.RawContacts.CONTENT_URI, projection, selection, null, null);

while (cur.moveToNext()) {
    Long rawId = cur.getLong(0);
    Long contactId = cur.getLong(1);
    String sync1 = cur.getString(2);

    System.out.println("Contact id=" + contactId + " raw-id=" + rawId + " sync1=" + sync1);
}

cur.close();

为空或sync1Index<0。。。将null作为查询的第二个参数传递不是一个好主意。。。最好把你想得到的列传过去。。。此外,您的查询将获得所有联系人,不仅来自您帐户的联系人类型SyncIndex<0,因此结果不包含此列为空或sync1Index<0。。。将null作为查询的第二个参数传递不是一个好主意。。。最好把你想得到的列传过去。。。此外,您的查询将获得所有联系人,不仅来自您帐户的联系人typesyncIndex<0,因此结果不包含此列。谢谢。通过在选择中使用参数
selectionArgs
和占位符
,我改进了查询,使其对于SQL注入是安全的。它成功了,谢谢。通过在选择中使用参数
selectionArgs
和占位符
,我对查询进行了改进,以确保SQL注入的安全性。