2015-04-03 3 views
1

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

Я пытался использовать App группу:

1) Bank.xcdatamodeld BankInfo.swift BankDetails.swift

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

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

App Делегат: стек основных данных [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'" 

С уважением

+0

Когда вы создаете контекст управляемого объекта, назначаете ли вы его действительным постоянным координатором хранилища? (Какой код для этого выглядит?) –

+0

'' 'lazy var managedObjectContext: NSManagedObjectContext? = { let координатор = self.persistentStoreCoordinator если координатор == ноль { возврата ноля } вар managedObjectContext = NSManagedObjectContext() managedObjectContext.persistentStoreCoordinator = координатор возвращение managedObjectContext }() '' 'В приложении падает без прохода к моей точке останову в Core Data Stack. Я не уверен, чтобы перейти к хорошему. – Hobbes

ответ

0

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

"*** 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 is not a legal NSManagedObjectContext parameter searching for entity name '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. В примере приложения я создал, чтобы воспроизвести это сообщение об ошибке, я только что вышел из стека ядра данных на месте (шаблон Xcode помещает его в App делегат), а затем я попытался создать объект внутри 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 
    } 

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

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

+0

Благодарим за помощь :) – Hobbes

+0

Добро пожаловать. –

Смежные вопросы