2010-10-17 6 views
3

Je veux synchroniser les données de base sur iPhone avec MongoDB sur le serveur Sinatra.Comment définir NSManagedObjectID manuellement?

Lorsque l'iPhone reçoit un message du serveur de discussion Node.js, le message contient l'objet BSON ObjectId de l'expéditeur (une chaîne). Pour l'iPhone pour stocker ce message, je trouve l'utilisateur avec ce même Id dans les données de base. Je veux être en mesure de faire quelque chose comme objectWithID. En d'autres termes, je veux définir les NSManagedObjectID à être les mêmes que les MongoDB BSON ObjectIds. L'autre chose que je vérifierai est s'il n'y a aucun utilisateur avec l'identifiant de l'expéditeur dans le managedObjectContext, je le chercherai dans persistStore, et s'il n'est pas là, je le créerai. C'est beaucoup à faire juste pour maintenir la relation entre Message et Expéditeur. Peut-être que je devrais simplement stocker l'attribut expéditeur de l'objet Message en tant que BSON ObjectId en tant que chaîne au lieu de User NSManagedObject.

Que recommandez-vous? Devrais-je simplement utiliser MongoDB sur l'iPhone aussi? Je viens de réaliser qu'il y a un pilote Objective-C. Mais je commençais juste à avoir le coup de Core Data, et il a des choses sympas (comme le support d'annulation) que je pourrais vouloir utiliser ... En ce moment, je l'utilise juste pour le simple chargement & stockage persistant, donc je pourrait le remplacer. Mais je prévois de mettre en œuvre le soutien de retour à l'avenir, juste parce que je pense que c'est une bonne convivialité. Je préfère l'option d'annuler que d'avoir à répondre à une fenêtre contextuelle de confirmation, par exemple, j'aime comment GMail vous permet d'annuler un envoi ou d'annuler une suppression de messages, etc.

Merci!

Matt

Répondre

3

On ne peut pas définir la objectID d'un noyau de données objet manuellement. Vous voudrez probablement ajouter un attribut appelé externalID ou quelque chose où vous stockez l'ID que vous avez reçu du serveur.

Voir this article pour avoir des idées sur l'utilisation ou non des données de base. Notez que la recommandation de l'auteur est de s'en tenir aux Core Data dans presque tous les cas.

+0

C'est un bon article. J'ai eu un problème similaire à résoudre, et je suis resté avec Core Data avec un attribut 'remoteID' Int32. La performance est définitivement un problème, avec le goulot d'étranglement en train d'effectuer une extraction pour chaque élément saisi sur remoteID pour voir si c'est déjà dans le MOC. Une centaine de ces extractions prend environ 1 seconde sur l'iPhone 3GS mais 5 secondes sur l'iPhone de première génération. Les améliorations possibles consistent à récupérer plusieurs éléments à la fois en utilisant un prédicat 'IN' et en le faisant dans un thread d'arrière-plan. –

+0

Merci, oui, je pense que je vais rester avec Core Data et faire ce que vous suggérez, esp. puisque j'utilise 'NSFetchedResultsController', que j'ai oublié de mentionner dans ma question. – ma11hew28

Questions connexes