2017-01-31 35 views
3

我以前,我更新我的一個應用程序到iOS 10,我得到它的工作,從那時起我一直在我的手機上使用它(安裝時不刪除舊應用程序,新應用程序替換舊應用程序)。現在,當我從iPhone中刪除應用程序並重新安裝相同的應用程序時,它不起作用。核心數據fetchRequest給executeFetchRequest:錯誤:<null>不是一個有效的NSFetchRequest

我一直在嘗試通過不同的改變來解決這個問題,並試圖理解發生了什麼問題。我也在Google和Stack Overflow上搜索,沒有任何成功。

我得到的錯誤是這樣的:

終止應用程序由於未捕獲的異常「NSInvalidArgumentException」,理由是:「executeFetchRequest:錯誤:不是有效的NSFetchRequest」

這裏是我的代碼,它是在應用程序啓動非常早的進行:

 let allItemFetchRequest: NSFetchRequest<Item> 
    if #available(iOS 10.0, *) { 
     allItemFetchRequest = Item.fetchRequest() as! NSFetchRequest<Item> 
    } else { 
     // Fallback on earlier versions 
     allItemFetchRequest = NSFetchRequest(entityName:"Item") 
    } 

    do { 
     let searchItems = try self.managedObjectContext.fetch(allItemFetchRequest) 

     if searchItems.count == 0 { 
      return true 
     } 
    } catch let error as NSError { 
     print("\(#file):\(#function): \(error)::\(error.userInfo)") 
    } catch { 
     print("\(String(describing: self)):\(#function): fatal error") 
     // Remove before release 
     fatalError() 
    } 

它總是在let searchItems = try self.persistentContainer.viewContext.fetch(allItemFetchRequest)行崩潰。

該代碼用於檢查自上次啓動以來是否存在任何數據,如果沒有,我從文件向Core Data SQLite數據庫添加一些數據。所以,以前如果因爲我有來自iOS 10以前版本應用程序的數據庫中的數據,我想。

如果我繞過此功能並使用let newItem = (NSEntityDescription.insertNewObject(forEntityName: "Item", into: self.managedObjectContext) as! Item)將數據導入數據庫,它確實會導入我的所有數據。對我來說,這感覺就像是我做的第一個取消請求失敗 - 插入似乎工作正常。

我在AppDelegate中使用了Apple原始Core數據堆棧函數的遷移版本。

我在做什麼錯?任何幫助或提示將不勝感激!

回答

4

編輯

我得到它的工作時,我簡化fetchRequest的聲明。而不是使用:

let allItemFetchRequest: NSFetchRequest<Item> 
if #available(iOS 10.0, *) { 
    allItemFetchRequest = Item.fetchRequest() as! NSFetchRequest<Item> 
} else { 
    // Fallback on earlier versions 
    allItemFetchRequest = NSFetchRequest(entityName:"Item") 
} 

嘗試使用:

let entityName = String(describing: Item.self) 
let request = NSFetchRequest<Item>(entityName: entityName) 

乾杯!

+0

我其實確實喜歡你的建議,而我已經開始工作了。不管怎樣,謝謝你! – mberg

相關問題