Доступ к общим данным из двух приложений

Знаете ли вы, как делиться основными данными с двумя приложениями (владельцем которых вы являетесь), позволяющими читать и записывать в один и тот же.sqlite?

Я пытался использовать группы приложений:

1) Bank.xcdatamodeld BankInfo.swift BankDetails.swift

Я скопировал эти файлы в каталог для проекта этого приложения B (извлечь из проекта приложения A), а затем перетащил их в Xcode.

2) Я получил файл sqlite из общей песочницы групп приложений.

Делегат приложения: базовый стек данных [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
}()

Я получил это сообщение об ошибке:

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

С уважением

1 ответ

Решение

Сообщение об ошибке

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

дает ключ к ответу на этот вопрос. Сообщение об ошибке очень похоже на формулировку is not a legal NSManagedObjectContext..., на который был дан ответ в аналогичном вопросе +entityForName: nil не является допустимым параметром NSManagedObjectContext, ищущим имя сущности 'Account' '.

Таким образом, хотя сообщение об ошибке является загадочным в обоих случаях, в этом случае сообщение об ошибке означает, что где-то в вашем коде вы передаете nil для NSPersistentStoreCoordinator, Установка точек останова должна помочь определить, где. Я смог воспроизвести ту же ошибку, внеся следующие изменения в ваш код:

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
}()

Для всех, кто читает этот ответ, обратите внимание, что стек Core Data никогда не будет использоваться (ленивые переменные не будут инициализированы), если мы не сделаем что-то полезное с Core Data. В образце приложения, которое я создал для воспроизведения этого сообщения об ошибке, я просто оставил стек основных данных на месте (шаблон Xcode помещает его в делегат приложения), а затем попытался создать сущность внутри 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
    } 

Обратите внимание, что код, указанный в оригинальном сообщении, не вызвал ошибок. Возможно, код в опубликованном вопросе не соответствует фактическому коду, используемому в проекте, или, возможно, в другом месте приложения существует контекст управляемого объекта, созданный с помощью координатора хранилища с нулевым постоянным хранением. Несмотря на это, загадочное сообщение об ошибке было расшифровано.

Вы можете убедиться, что правильно настроили группу общих приложений. См. Эту статью ( http://jasoncross-ios-development.blogspot.com/2015/04/accessing-shared-data-between-ios.html), в которой описывается настройка группы общих приложений с использованием прав.

Другие вопросы по тегам