使用核心数据索引从核心数据中获取特定项目

问题描述 投票:0回答:1

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

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

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

enter image description here

enter image description here

import UIKit
import CoreData

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

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

override func viewDidLoad() {
    super.viewDidLoad()

    openDatabse()




}

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

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 {
            print(user.username)
        }
    } catch {
        print("Could not fetch \(error) ")
    }
}


func openDatabse()
{
    context = appDelegate.persistentContainer.viewContext
    let entity = NSEntityDescription.entity(forEntityName: "Users", in: context)
    let newUser = NSManagedObject(entity: entity!, insertInto: context)
    let newUser2 = NSManagedObject(entity: entity!, insertInto: context)
    let newUser3 = NSManagedObject(entity: entity!, insertInto: context)
    saveData(UserDBObj: newUser, UserDBObj2: newUser2, UserDBObj3: newUser3)

}

func saveData(UserDBObj:NSManagedObject,UserDBObj2:NSManagedObject,UserDBObj3:NSManagedObject)
{
    UserDBObj.setValue("kim kardashian", forKey: "username")
    UserDBObj2.setValue("jessica biel", forKey: "username")
    UserDBObj3.setValue("Hailey Rienhart", forKey: "username")




    print("Storing Data..")
    do {
        try context.save()
    } catch {
        print("Storing data Failed")
    }

    fetchData()
}

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个回答
0
投票

当然,您必须为idx属性分配值。

第一次替换

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

with

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")
    }
}

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

但是–再次–每次启动该应用程序时,都会使用相同的名称和索引再次插入3条记录。请注意!

© www.soinside.com 2019 - 2024. All rights reserved.