2015-04-03 80 views
1

你知道如何分享核心數據與兩個應用程序(你的所有者),允許讀取和寫入相同的.sqlite?從兩個應用程序訪問共享數據

我曾嘗試使用應用程序組:

1) Bank.xcdatamodeld BankInfo.swift BankDetails.swift

我已經複製這些文件到這個應用程序B的項目目錄(從中檢索應用程序A的項目),然後我將它們拖入Xcode。

2)我已經從應用程序組的公共沙箱中檢索到的源碼文件

應用代表:核心數據堆疊[夫特]

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'" 

Regards

+0

當您創建託管對象上下文時,是否爲其分配了有效的持久性存儲協調器? (這是什麼樣的代碼?) – 2015-04-03 13:15:03

+0

'''lazy var managedObjectContext:NSManagedObjectContext? = { 讓協調員=自我。persistentStoreCoordinator 如果協調== {零回報 零 } VAR managedObjectContext =的NSManagedObjectContext() managedObjectContext.persistentStoreCoordinator =協調員 回報managedObjectContext }()'''應用崩潰不傳球給我的核心數據堆棧斷點。我不確定要繼續這個好方法。 – Hobbes 2015-04-03 13:37:07

回答

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 
    } 

請注意,原始帖子中提供的代碼不會導致任何錯誤。可能發佈的問題中的代碼與項目中使用的實際代碼不匹配,或者可能在應用程序中的其他位置存在使用零持久存儲協調器創建的託管對象上下文。無論如何,這個神祕的錯誤信息已被破譯。

您可能希望確保您已正確設置您的共享應用程序組。請參閱本文(http://jasoncross-ios-development.blogspot.com/2015/04/accessing-shared-data-between-ios.html),其中介紹瞭如何使用權利設置共享應用程序組。

+0

謝謝你的幫助:) – Hobbes 2015-04-09 16:09:49

+0

非常歡迎。 – 2015-04-09 18:43:54

相關問題