2015-04-03 1 views
1

Savez-vous comment partager des données de base avec deux applications (dont vous êtes le propriétaire) permettant de lire et d'écrire dans le même fichier .sqlite?Accès aux données partagées à partir de deux applications

J'ai essayé d'utiliser des groupes App:

1) Bank.xcdatamodeld BankInfo.swift BankDetails.swift

J'ai copié ces fichiers dans le répertoire pour le projet de cette application B (extraient des le projet de l'application A), puis je les ai traînés dans Xcode.

2) Je l'ai récupéré le fichier SQLite à partir du sandbox commun des groupes d'applications

délégué App: Core Data pile [Swift]

lazy var applicationDocumentsDirectory: NSURL = { 

    let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask) 
    return urls[urls.count-1] as NSURL 
    }() 

lazy var managedObjectModel: NSManagedObjectModel = { 

    let modelURL = NSBundle.mainBundle().URLForResource("shareapps", withExtension: "momd")! 
    return NSManagedObjectModel(contentsOfURL: modelURL)! 
    }() 

lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator? = { 


    // Create the coordinator and store 

    var coordinator: NSPersistentStoreCoordinator? = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel) 

    let directory = NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier("com.sd.shareapps"); 

    let url = directory?.URLByAppendingPathComponent("shareapps.sqlite") 

    //Sarting frehs every time 
    NSFileManager.defaultManager().removeItemAtURL(url!, error: nil) 

    var error: NSError? = nil 
    var failureReason = "There was an error creating or loading the application's saved data." 

    if coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: nil, error: &error) == nil { 
     coordinator = nil 
     // Report any error we got. 
     let dict = NSMutableDictionary() 
     dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data" 
     dict[NSLocalizedFailureReasonErrorKey] = failureReason 
     dict[NSUnderlyingErrorKey] = error 
     error = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict) 
     // Replace this with code to handle the error appropriately. 
     // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
     NSLog("Unresolved error \(error), \(error!.userInfo)") 
     abort() 
    } 
    println("\(coordinator?.persistentStores)") 
    return coordinator 
    }()  
lazy var managedObjectContext: NSManagedObjectContext? = { 

    let coordinator = self.persistentStoreCoordinator 
    if coordinator == nil { 
     return nil 
    } 
    var managedObjectContext = NSManagedObjectContext() 
    managedObjectContext.persistentStoreCoordinator = coordinator 
    return managedObjectContext 
}() 

J'ai ce message d'erreur :

"*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+entityForName: nil is not a legal NSPersistentStoreCoordinator for searching for entity name 'Entity'" 

Cordialement

+0

Lorsque vous créez votre contexte d'objet géré, lui attribuez-vous un coordinateur de magasin persistant valide? (Quel est le code pour ce look?) –

+0

'' 'var var managedObjectContext: NSManagedObjectContext? = { laissez le coordinateur = self.persistentStoreCoordinator si coordonnateur == {nul retour nul } var managedObjectContext = NSManagedObjectContext() managedObjectContext.persistentStoreCoordinator = coordinateur retour managedObjectContext }() '' 'Les accidents d'applications sans passer à mon point d'arrêt dans la pile de base de données. Je ne suis pas sûr de procéder au bon chemin. – Hobbes

Répondre

0

Le message d'erreur

"*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+entityForName: nil is not a legal NSPersistentStoreCoordinator for searching for entity name 'Entity'" 

donne la clé pour répondre à cette question. Le message d'erreur est très similaire dans le libellé à is not a legal NSManagedObjectContext..., qui a été répondu dans une question similaire +entityForName: nil is not a legal NSManagedObjectContext parameter searching for entity name 'Account''. Donc bien que le message d'erreur soit cryptique dans les deux cas, dans ce cas le message d'erreur signifie que quelque part dans votre code vous passez nil pour NSPersistentStoreCoordinator. La définition de points d'arrêt devrait aider à déterminer où. J'ai pu reproduire la même erreur en faisant les modifications suivantes à votre code:

lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator? = { 
    // normally we would initialize the persistentStoreCoordinator here 
    // but to reproduce an error, just return nil 
    return nil; 
} 

    lazy var managedObjectContext: NSManagedObjectContext? = { 

    let coordinator = self.persistentStoreCoordinator 
      // normally, we would return nil right away if there is 
      // no coordinator, but to reproduce the error carry on anyway 
//  if coordinator == nil { 
//   return nil 
//  } 
    var managedObjectContext = NSManagedObjectContext() 
    managedObjectContext.persistentStoreCoordinator = coordinator 
    return managedObjectContext 
}() 

Pour toute personne autre lecture de cette réponse, notez que la pile de données de base ne sera jamais utilisé (les variables paresseux ne seront pas initialisés) à moins que nous fassions quelque chose d'utile avec Core Data. Dans l'exemple d'application que j'ai créé pour reproduire ce message d'erreur, je viens de quitter la pile de données de base en place (le modèle de Xcode met dans le délégué App), puis j'ai essayé de créer une entité à l'intérieur didFinishLaunchingWithOptions:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
     // Override point for customization after application launch. 

     var context : NSManagedObjectContext? = self.managedObjectContext 

     // the line below will cause an exception when the 
     // NSPersistentStoreCoordinator is nil 
     var entity : NSEntityDescription? = NSEntityDescription.entityForName("Entity", 
      inManagedObjectContext:context!) 

     return true 
    } 

Notez que le code fourni dans le message d'origine n'a provoqué aucune erreur. Il est possible que le code de la question publiée ne corresponde pas au code réel utilisé dans le projet, ou peut-être ailleurs dans l'application, il existe un contexte d'objet géré créé avec un coordinateur de magasin persistant nul. Peu importe, le message d'erreur cryptique a été déchiffré.

Vous souhaiterez peut-être vous assurer que vous avez correctement configuré votre groupe d'applications partagées. Voir cet article (http://jasoncross-ios-development.blogspot.com/2015/04/accessing-shared-data-between-ios.html) qui couvre la configuration d'un groupe d'applications partagées à l'aide de droits.

+0

Merci pour votre aide :) – Hobbes

+0

Vous êtes les bienvenus. –