es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Existe una buena solución para encontrar contactos duplicados por número?

Intenté buscar duplicados utilizando este código:

var contactsByNumber = [CNLabeledValue<cnphonenumber>:[CNContact]]()

try self.store.enumerateContacts(with: fetchRequest) { [weak self] contact, stopPointerIfYouWantToStopEnumeration in

    //Check contact for matching number with other contacts
    for contactNumber in contact.phoneNumbers {
        var contactsForNumber = contactsByNumber[contactNumber,default: []]
        contactsForNumber.append(contact)
        contactsByNumber[contactNumber] = contactsForNumber
        print("Cantidad de contactos para el número \(contactNumber.value.stringValue): \(contactsByNumber[contactNumber]!.count)")
        print("Dueño \(formatter.string(from: contact))")
    }
}

Y también he creado dos contactos con el mismo número pero imprime que hay solo un contacto para cada número en la consola:

Cantidad de contactos para el número (408) 555-3514: 1
Dueño Optional("Daniel Higgins Jr.")
Cantidad de contactos para el número 888-555-5512: 1
Dueño Optional("John Appleseed")
Cantidad de contactos para el número 888-555-1212: 1
Dueño Optional("John Appleseed")
Cantidad de contactos para el número 555-522-8243: 1
Dueño Optional("Anna Haro")
Cantidad de contactos para el número (555) 766-4823: 1
Dueño Optional("Hank M. Zakroff")
Cantidad de contactos para el número (707) 555-1854: 1
Dueño Optional("Hank M. Zakroff")
Cantidad de contactos para el número 555-610-6679: 1
Dueño Optional("David Taylor")
Cantidad de contactos para el número +7 (898) 222-55-22: 1
Dueño Optional("FirstMatchingNumber")
Cantidad de contactos para el número +7 (898) 222-55-22: 1
Dueño Optional("SecondMatchingNumber")

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El código anterior utiliza un array para almacenar contactos que tienen números de teléfono coincidentes. Recorre cada contacto devuelto por la consulta fetchRequest y verifica sus números de teléfono en busca de duplicados. Si un contacto tiene un número de teléfono que coincide con un contacto existente, se agrega el nuevo contacto al array correspondiente a ese número.

    Sin embargo, parece que los duplicados no se detectan correctamente. El código imprime que solo hay un contacto por número, aunque se han agregado dos contactos con el mismo número.

    Una posible razón es que los números de teléfono en los objetos CNPhoneNumber no se están comparando correctamente. Es posible que el operador == no se esté utilizando correctamente para comparar los números de teléfono, o que la propiedad hashValue no se esté calculando correctamente para los números de teléfono.

    Para solucionar esto, debemos asegurarnos de que la comparación entre los números de teléfono se realice correctamente. Una opción es convertir el número de teléfono en una cadena y comparar las cadenas. Esto se puede hacer utilizando la propiedad value.stringValue del objeto CNPhoneNumber.

    Entonces, el código actualizado para buscar duplicados sería:

    var contactsByNumber = [String:[CNContact]]()
    
    try self.store.enumerateContacts(with: fetchRequest) { [weak self] contact, stopPointerIfYouWantToStopEnumeration in
    
        //Verifica el contacto para detectar números idénticos a otros contactos
        for contactNumber in contact.phoneNumbers {
            let phoneNumber = contactNumber.value.stringValue
            var contactsForNumber = contactsByNumber[phoneNumber,default: []]
            contactsForNumber.append(contact)
            contactsByNumber[phoneNumber] = contactsForNumber
            print("Cantidad de contactos para el número \(phoneNumber): \(contactsByNumber[phoneNumber]!.count)")
            print("Dueño \(formatter.string(from: contact))")
        }
    }
    

    Este código utiliza un diccionario con números de teléfono almacenados como cadenas en lugar de objetos CNPhoneNumber. Convierte cada número de teléfono en una cadena utilizando la propiedad stringValue, lo que permite la comparación correcta de los números de teléfono. El resto del código sigue siendo el mismo.

Comments are closed.