2016-07-23 48 views
1

我想在當前窗口小部件擴展中讀取核心數據屬性。我在這裏搜索了很多網站和問題,但我找不到解決方案!到目前爲止,我添加的應用組到我的應用程序,然後改變這一行中App Delegate訪問來自窗口小部件擴展的核心數據

lazy var applicationDocumentsDirectory: NSURL = { 
    // file. This code uses a directory named "compony.AppName" in the application's documents Application Support directory. 
    let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask) 
    return urls[urls.count-1] 
}() 

到:

lazy var applicationDocumentsDirectory: NSURL? = { 
    return NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier("group.com.myDomain.appgroupID") ?? nil 
}() 

那麼什麼是下一個步驟?我怎樣才能訪問上下文實體等從小部件中心?如果有人幫助我,我將不勝感激。

我只有一個entity與幾個attributes

編輯

  • 我創建了一個CoreDataStack.swiftAppDelegate複製的所有核心數據文件到新的文件。

  • 增加我的數據模型,以小部件擴展:

enter image description here

  • 在擴展viewDidLoad我累檢索模型,但沒有任何反應數據,當我運行的窗口小部件:

    context = CoreDataStack.defaultStack.managedObjectContext 
    
    do { 
    
        request = NSFetchRequest(entityName: "Event") 
        results = try context.executeFetchRequest(request) 
        print(results.count) 
    
        if results.count > 0 { 
    
         for item in results as! [NSManagedObject] { 
    
          let name = item.valueForKey("title") 
    
          print(name!) 
         } 
    
        }//end if 
    
    
    } catch { 
    
        print("there is an error for saving") 
    } 
    
+1

您是否遵循了所有需要的步驟?例如https://www.invasivecode.com/weblog/sharing-data-between-apps-並且他們的擴展/ –

+0

@LorenzoBoaro這是我見過的最愚蠢的教程!標題是關於核心數據和今天的擴展,但是當你按照最後一步!它說,核心數據並不總是很好!!!!! !!!使用NSUserDefualts !!!!!!!!!!!!!! –

回答

4

由於小部件沒有應用程序委託,因此您可能希望將核心數據堆棧代碼移出主應用程序中的應用程序委託類。

我通常使用一個名爲CoreDataStack的類。只是所有的方法複製到這個新的類,改變lazystatic

class CoreDataStack { 
    static var applicationDocumentsDirectory: NSURL? = { ... }() 
    static var managedObjectModel: NSManagedObjectModel = { ... }() 
    static var persistentStoreCoordinator: NSPersistentStoreCoordinator? = { ... }() 
    static var managedObjectContext: NSManagedObjectContext? = { ... }() 
} 

由於這些都是static變量,可以使用下面的語法來訪問管理方面:

let ctx = CoreDataStack.managedObjectContext 

。 ..代替通過您的應用程序代理的典型訪問。

你應該將這個文件添加到你的主應用程序目標和你的widget目標,使用「Target Membership」下的右側邊欄。這樣,你將在兩個地方以相同的方式訪問你的Core Data堆棧。以確保它們在擴展中可用

+0

@ Mc.Lover很抱歉...我沒有收到您的評論通知。確保你直接使用CoreDataStack類,而不是實例化它的一個實例。如果你粘貼了班級,並告訴我它在哪裏出錯,我可能會在幾分鐘內幫助你。 –

+0

還要確保你沒有忘記每個靜態變量聲明末尾的()( –

+0

)這個類不是一個單獨的(儘管這是一個可能的解決方案)。你不用CoreDataStack.defaultStack.managedObjectContext訪問它,你只需要使用CoreDataStack.managedObjectContext @ Mc.Lover –

相關問題