【问题标题】:Return value from CoreData with entity.attribute?使用 entity.attribute 从 CoreData 返回值?
【发布时间】:2015-03-10 22:44:46
【问题描述】:

我是 swift 新手,在使用 CoreData 时遇到了问题,我正在寻找一种方法来简化获取和写入值,特别是能够使用类似于以下内容的方式编写它们:

entity.attribute = variable

并使用类似于以下内容的方式检索它们:

variable = entity.attribute

我有一个名为“Studio”的实体,其属性名为“name”(字符串)。 我创建了一个 NSManagedObject 子类 (Studio.swift) 并将该类更新为“testapp.Studio”。

在我下面的示例代码中,IBAction saveData 会将 studioBox.text 写入 CoreData,但是 IBAction 更新会引发一些错误。

var Studio = getStudioData() 

模式变量绑定不能出现在表达式中

nameLabel.text = Studio.name

“Studio.Type”没有名为“name”的成员

最后在 getStudioData 函数中:

return studio

“NSArray”不是“Studio”的子类型

下面是我的完整代码:

import UIKit
import CoreData

class ViewController: UIViewController {

@IBOutlet weak var studioBox: UITextField!

@IBOutlet weak var nameLabel: UILabel!

@IBAction func saveData(sender: AnyObject) {
    var info: String = studioBox.text!
    var Studio = dbconnect()
    Studio.name = info as String
}
@IBAction func Update(sender: AnyObject) {
    var info: String =
    var Studio = getStudioData()
    nameLabel.text = Studio.name
}


func getStudioData() -> Studio {
    let appDelegate =
    UIApplication.sharedApplication().delegate as AppDelegate
    let managedContext = appDelegate.managedObjectContext!
    let request = NSFetchRequest(entityName: "Studio")
    request.returnsObjectsAsFaults = false

    let result = managedContext.executeFetchRequest(request, error: nil)!
    let studio = result
    return studio

}

func dbconnect () -> Studio {
    let appDelegate =
    UIApplication.sharedApplication().delegate as AppDelegate
    let managedContext = appDelegate.managedObjectContext!
    let entityDescription = NSEntityDescription.entityForName("Studio", inManagedObjectContext: managedContext)
    let studio = Studio(entity: entityDescription!, insertIntoManagedObjectContext: managedContext)
    return studio
}

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}
}

【问题讨论】:

    标签: swift core-data


    【解决方案1】:

    首先,获取请求返回一个对象数组。所以如果你想返回一个Studio,你应该返回这个数组的一个对象(例如第一个)。不要忘记将您的 fetch 结果转换为正确的类型数组。

    let result = managedContext.executeFetchRequest(request, error: nil) as [Studio]
    // check if result.count > 0
    return result[0]
    

    这解释了第一个和第三个错误。第二个似乎是由于大写的Studio 指的是类,而不是实例,即托管对象。虽然使用带有大写首字母的变量名是“合法的”,但这是一种不好的做法,因为它会降低代码的可读性。类名使用Studio,变量名使用studio

    nameLabel.text = studio.name
    

    【讨论】:

    • 这解决了错误,谢谢。但是它返回了一个意外的结果(至少不是我所期望的)当我将一个值加载到 studio.name 中时,它会正确地持续存在,但是如果我退出并重新加载应用程序并在 studio.name 中输入一个不同的值,则操作“更新” ' 在我输入的第一个和第二个值之间循环标签。如果 name 属性被声明为字符串,为什么它看起来像一个数组?
    • 你的问题不清楚,我觉得太复杂了,无法通过cmets来回答。这实际上是一个不同的问题。您应该通过勾选复选标记来接受上述答案并开始一个新的 SOF 问题,包括您的特定意外行为的代码。
    猜你喜欢
    • 2021-08-10
    • 2016-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-06
    • 1970-01-01
    • 2017-07-07
    相关资源
    最近更新 更多