Core Data et iCloud ajoutant un file sqlite pré-rempli

Je travaille sur une application qui utilise Core Data et iCloud pour synchroniser datatables entre plusieurs iPads. Tout cela fonctionne très bien et je peux append des données à chaque iPad et il se synchronisera entre eux tous.

J'ai un file sqlite Core Data qui est pré-rempli avec une list de pays et je veux copyr cela dans la zone des documents lors de la première exécution de l'application. J'ai eu ce travail, mais j'ai changé mon implémentation persistentStoreCoordinator pour tester le support d'iCloud ou non et quelques autres petits changements.

Cependant maintenant, quand je vérifie pour voir si le file sqlite existe et copyz le file sqlite pré-rempli si ce n'est pas le cas, je reçois l'erreur suivante à

[psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[NSURL fileURLWithPath:iCloudData] options:options error:&persistentStoreError]; 

NSPersistentStoreCoordinator addPersistentStoreWithType: configuration: URL: options: erreur :: CoreData: Ubiquity: Une erreur est survenue lors de la configuration de l'intégration d'ubiquity: Error Domain = NSCocoaErrorDomain Code = 134316 "Le conteneur d'ubiquité ne semble pas correspondre à ce magasin persistant, il est possible est causé par le basculement vers un autre count iCloud ou la déconnection complète d'iCloud Le magasin doit être rouvert avec des attributes en lecture seule ou supprimé de la synchronisation iCloud en permanence. " UserInfo = 0x1cb590 {storeUUID = 31381598-EAFA-4550-9B96-F501800974D5, conteneurUUID = E3A8DC7D-41FD-405A-8D8A-C06C8B467CA2, NSLocalizedDescription = Le conteneur d'ubiquité ne semble pas correspondre à ce magasin persistant, il est possible que cela soit causé par la commutation à un autre count iCloud, ou de se déconnecter entièrement d'iCloud. Le magasin doit être rouvert avec des attributes en lecture seule ou supprimé définitivement de la synchronisation iCloud.

Est-ce parce qu'il existe encore des references dans iCloud à un autre file Core Data sqlite ou à un file journal de transactions? Si oui, comment les supprimer?

Vous n'êtes pas censé copyr un magasin de données core pré-créé dans le conteneur ubiquity. L'ancienne méthode consistait à créer un file SQLite sur le simulateur / périphérique / ordinateur et à le copyr à sa place lors de la première exécution. Si vous utilisez iCloud, vous ne pouvez plus le faire. iCloud fonctionne par chaque périphérique recevant une list de modifications en tant que «journaux de transactions», qu'il applique ensuite à son propre magasin SQLite. Il a besoin de savoir ce qui a changé, et get un file .sqlite en un seul morceau ne le dira pas.

La manière d'iCloud de faire ceci est soit:

  • Créez datatables initiales à partir de votre code (par exemple une méthode insertStartData: . Vous pouvez l'append à partir d'un plist, ou ce que vous voulez. Vous devrez vérifier que datatables ne sont pas déjà là en premier.
  • Utilisez NSPersistentStoreCoordinator de migratePersistentStore:toURL:options:withType:error pour copyr votre magasin initial.

Voici les docs:

Vous ne devez pas semer le contenu initial avec un file de database pré-packagé. Au lieu de cela, vous devez créer les éléments par défaut dans le code ou utiliser migratePersistentStore de NSPersistentStoreCoordinator: toURL: options: withType: error: méthode pour migrer une database pré-packagée vers l'location requirejs.