Использовать индекс основных данных для извлечения определенного элемента c из основных данных - PullRequest
0 голосов
/ 15 января 2020

Мой код swift ниже при загрузке помещает 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!

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

1 Ответ

0 голосов
/ 15 января 2020

Конечно, вы должны присвоить значения атрибуту 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 записи с одинаковыми именами и индексами. Знайте об этом!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...