【问题标题】:Fetch Request execution method returns nothingFetch Request 执行方法不返回任何内容
【发布时间】:2015-12-29 13:57:55
【问题描述】:

在我的应用程序中,我使用 Core Data 来保存有关用户的一些基本信息并轻松获取数据,我创建了一个 Assistant 类,该类具有一些静态函数。其中之一是:

static func fetchData(forEntity name: String) -> AnyObject{

        var result: AnyObject!

        let dataController = DataController().managedObjectContext
        let fetchRequest = NSFetchRequest(entityName: name)

        do{
            result = try dataController.executeFetchRequest(fetchRequest)
        }catch{
            print("Failed to execute fetch request for \(name) entity")
        }
        print("Returning result: \(result.description)")

        return result
    }

问题是当我使用它时print("Returning result: \(result.description)") 打印“返回结果:()”并且它不是零,它只是一个空的AnyObject 我假设。无论如何,如果我在这种方法中使用它:

static func getName() -> String{

        let fetched = fetchData(forEntity: "UserData") as! [UserData]

        if fetched.count > 0{
            print("Returning found value: \(fetched.first!.username!)")
            return fetched.first!.username!
        }else{
            print("Did not find any data, returning an empty string")
            return ""
        }

    }

它返回一个空字符串。但是,如果我在另一个类中使用以下方法:

func initialize(){

        do{
            let fetch = NSFetchRequest(entityName: "UserData")
            let entities = try dataController.executeFetchRequest(fetch) as! [UserData]
            if entities.count > 0{
                dispatch_async(dispatch_get_main_queue(), {self.fld_name.text = entities[0].username})
            }else{
                dispatch_async(dispatch_get_main_queue(), {self.fld_name.text = ""})
            }
        }catch{
            print("Nope, nothing's here")
        }

    }

它运行良好,数据被正确读取。 这里是你需要知道的:我在AppDelegateapplication(application:, didFinishLaunchingWithOptions launchOptions:)方法中使用了getName()方法。所以可能是 CoreData 在那一刻不能正常工作(我严重怀疑)

好的,这是我的假设:

  1. 是否会因为返回 AnyObject 而出现此问题,因此我会丢失所有数据?
  2. 可能是因为此时 CoreData 尚未(不知何故)激活?
  3. 这只是我犯的另一个愚蠢的错误吗?

请提出您的解决方案。提前谢谢!

【问题讨论】:

    标签: ios database swift core-data appdelegate


    【解决方案1】:

    您遇到了一些可能会导致麻烦的问题。首先,我会重写你的 fetchData 函数。

    static func fetchData(forEntity name: String) -> [AnyObject] {
    
        let dataController = DataController().managedObjectContext
        let fetchRequest = NSFetchRequest(entityName: name)
    
        do{
            let results = try dataController.executeFetchRequest(fetchRequest)
            print("Returning result: \(results.description)")
            return results
        } catch {
            print("Failed to execute fetch request for \(name) entity")
            return []
        }
    }
    

    exexuteFetchRequest 的返回类型是 ArrayAnyObject,而不仅仅是一个。

    对于您的getName() 函数,我将执行以下操作。它使用 if let 绑定来安全地处理您的结果。

    static func getName() -> String {
    
        if let 
            fetched = fetchData(forEntity: "UserData") as? [UserData],
            userData = fetched.first,
            username = userData.username {
            print("Returning found value: \(username)")
            return username  
        } else {
            print("Did not find any data, returning an empty string")
            return ""
        }
    }
    

    试一试,看看是否有帮助。至少,如果出现任何问题,这段代码更安全,崩溃的可能性也更小。

    【讨论】:

    • 嗯,首先你会得到一个警告,将 AnyObject 转换为 [AnyObject] 是多余的。问题是我不应该创建另一个 ManagedObjectContext 实例。不过还是谢谢你的关注
    【解决方案2】:

    问题在于,每次我需要获取数据时,我都会创建一个 DataController().managedObjectContext 的新实例,并且以某种方式在没有任何异常的情况下逃脱。我的解决方案(有效)是将一个实例放入委托中并使用它。它起作用了,但是,正如我所说,我不知道为什么它会以这种方式起作用,而在其他情况下却不会。我很抱歉我的无知,但我很高兴我刚刚修复了它,如果你能给我一个解释,我想得到一个解释。

    【讨论】:

      猜你喜欢
      • 2020-04-16
      • 2013-02-18
      • 2019-10-23
      • 2020-01-26
      • 2018-10-21
      • 1970-01-01
      • 2013-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多