2016-09-10 1 views
1

J'ai une base de données d'environ 10.000 entités et NSArray dynamique de 50 éléments NSString. Je voudrais vérifier si chacun de ces éléments existe dans la base de données et créer un nouveau tableau de ceux qui existent. Je n'ai pas besoin de renvoyer des entités entières, juste ces titres NSString (qui sont les mêmes que dans le tableau NSString)NSArray comme paramètre dans Core Data fetchRequest

NSPredicate devrait comparer entity.title à l'élément NSString avec EXACT match.


Quelle est la meilleure façon efficace et processeur/mémoire pour le faire?

Répondre

2

Je pense que vous devriez utiliser l'opération 'in' dans votre prédicat pour obtenir votre résultat. Cela vous permet de tirer parti de la base de données pour effectuer la comparaison, au lieu de ramener tous les 10 000 enregistrements pour vous comparer. Si vous adoptez cette approche, votre code pourrait ressembler à ceci:

// Assuming that arrayName is your existing array of values to match, that 
// EntityName is the object in CoreData that you’re looking at, and context 
// is your moc 

var newArray: [String] = [] 

let fetchRequest = NSFetchRequest<EntityName>(entityName: "EntityName") 
fetchRequest.predicate = NSPredicate(format: "title in %@", arrayName) 

do { 
    result = try context.fetch(fetchRequest) 
    for element in result { 
     newArray.append(element.title) 
    } 
} catch { 
    … manage any errors … 
} 

Remarque - je cible Swift 3.0 code compatible - pas sûr si rapide était ce que vous êtes après.

+0

Merci. Justement, je ne veux pas tirer toute la table. Les données de base devraient faire tout le travail. Cette solution est-elle optimale? S'il n'y a plus d'idées, je vais vérifier cela comme une réponse. – elektricni

+0

Il peut également être utile d'ajouter un index sur l'attribut title, si vous n'en avez pas déjà un. – pbasdf

+0

L'index suggéré par pbasdf pourrait être utile, en fonction de l'utilisation des titres dans votre application, mais sinon je ne suis au courant de rien pour augmenter l'efficacité de cette approche. –