【问题标题】:Use core data index to fetch a specific item from core data使用核心数据索引从核心数据中获取特定项目
【发布时间】:2020-01-16 12:01:19
【问题描述】:

我下面的 swift 代码在加载时将 3 个项目放在名为“UserName”的核心数据实体中。当用户在文本字段 enterT 中输入数字时,我希望标签 labelName 显示它。因此,当用户输入 1 时,标签应显示 jessica biel,因为 Jesical Biel 是输入的名字。有人提出以下建议来解决这个问题。我不知道该怎么做。我在下面添加了一个 gif。

将输入的数字转换为 Int。如果成功,则将整数传递给笑话并获取与 idx 属性匹配的记录。

https://github.com/redrock34/index-fetch

导入 UIKit 导入核心数据

  class ViewController: UIViewController,UITextFieldDelegate {
@IBOutlet var labelName : UILabel!
@IBOutlet var enterT : UITextField!

lazy var context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

override func viewDidLoad() {
    super.viewDidLoad()

    openDatabse()
    fetchData()
    enterT.delegate = self


}

func textFieldDidEndEditing(_ textField: UITextField) {
    guard let index = Int(textField.text!) else {
        // display an alert about invalid text
        return
    }
    joke(at: index - 1)
}

func joke(at index : Int) {
    let fetchRequest = NSFetchRequest<Users>(entityName: "Users")
    fetchRequest.predicate = NSPredicate(format: "idx == %d", Int32(index))
    do {
        if let user = try context.fetch(fetchRequest).first {
            labelName.text = user.username
        }
    } catch {
        print("Could not fetch \(error) ")
    }
}
func openDatabse()
{
    let names = ["kim kardashian", "jessica biel", "Hailey Rienhart"]
    for i in 0..<names.count {
        let newUser = Users(context: context)
        newUser.username = names[i]
        newUser.idx = Int32(i + 1)
    }
    print("Storing Data..")
    do {
        try context.save()
    } catch {
        print("Storing data Failed", error)
    }
}
func fetchData()
{
    print("Fetching Data..")
    let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Users")
    request.returnsObjectsAsFaults = false
    do {
        let result = try context.fetch(request)
        for data in result as! [NSManagedObject] {
            let userName = data.value(forKey: "username") as! String

            print("User Name is : "+userName)
        }
    } catch {
        print("Fetching data Failed")
    }
}}

【问题讨论】:

    标签: swift core-data indexing fetch uitextfielddelegate


    【解决方案1】:

    当然,您必须为idx 属性分配值,并且您必须将获取的结果分配给标签。

    先替换

    let appDelegate = UIApplication.shared.delegate as! AppDelegate //Singlton instanc
    var context:NSManagedObjectContext!
    

    lazy var context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
    

    然后将openDatabse saveData都替换为

    func openDatabse()
    {
        let names = ["kim kardashian", "jessica biel", "Hailey Rienhart"]
        for i in 0..<names.count {
            let newUser = Users(context: context)
            newUser.name = names[i]
            newUser.idx = Int32(i + 1)
        }
        print("Storing Data..")
        do {
            try context.save()
        } catch {
            print("Storing data Failed", error)
        }
    }
    

    最后在joke中添加一行来显示值

    func joke(at index : Int) {
        let fetchRequest = NSFetchRequest<Users>(entityName: "Users")
        fetchRequest.predicate = NSPredicate(format: "idx == %d", Int32(index))
        do {
            if let user = try context.fetch(fetchRequest).first {
                labelName.text = user.username
            }
        } catch {
            print("Could not fetch \(error) ")
        }
    }
    

    它创建记录并分配适当的索引。然后在文本字段中输入一个数字应该可以工作。

    但是 - 再一次 - 在每次启动应用时,都会再次插入 3 条具有相同名称和索引的记录。请注意这一点!

    【讨论】:

    • 我用你的代码编辑了我上面的代码。当我在文本字段中输入数字时,仍然有同样的问题没有任何反应。什么都没发生。标签上没有任何变化。感谢您迄今为止的帮助!。
    • 请不要使用答案中的代码编辑问题。这个问题对其他人来说已经没有意义了。您是否将 Interface Builder 中的文本字段的委托连接到控制器?您必须否则不会调用委托方法。
    • 如果我按住控件然后单击文本字段,然后将其拖到故事的左上角按钮并单击委托。没有任何变化。
    • 我在 videodidload 中添加了 enterT.delegate = self ,但仍然没有任何变化。
    • 我将文本字段方法更改为 shouldChangeCharactersIn 并且可以正常工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多