Как получить конкретное значение из массива сохраненных данных ядра Swift - PullRequest
0 голосов
/ 24 ноября 2018

По сути, вместо того, чтобы извлекать последний сохраненный объект, я хотел бы извлечь ранее сохраненные объекты.Как бы я поступил так?Код выполняет настройку текста метки в зависимости от текста объекта, извлеченного из массива, но я хочу получить более старые сохранения.

// deleteAllRecords()   // ---- uncomment deleteAllRecords() here to delete all records saved.
    // FETCH BLOCK
    let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Tasks")

    //request.predicate = NSPredicate(format: "age = %@", "12")
    request.returnsObjectsAsFaults = false
    do {
        let result = try context.fetch(request)
        for data in result as! [Tasks] {
            print(data.value(forKey: "taskName"))
            if let reminders = data.value(forKey: "taskName") as? [Reminder] {
                for reminder in reminders {
                    // Now you have your single object Reminder and you can print his variables
                    print("Your reminder description is \(reminder.reminderDescription), and his length is \(reminder.reminderLength)")
                    self.reminderDisplay.text = reminder.reminderDescription
                    if reminderDisplay.text == reminder.reminderDescription {
                        self.testLabel1.text = reminder.reminderDescription
                        reminderCount = 1
                    }
                }
            }
        }

Как бы я поступил так?Заранее спасибо.- Сав.

РЕДАКТИРОВАТЬ:

  // SAVE BLOCK
    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    let context = appDelegate.persistentContainer.viewContext

    let entity = NSEntityDescription.entity(forEntityName: "Tasks", in: context)
    let newTask = Tasks(entity: entity!, insertInto: context)

    newTask.setValue(reminderList, forKey: "taskName")

    do {
        try context.save()

    } catch {
        print("Failed saving")
    }
}

РЕДАКТИРОВАНИЕ2:

request.predicate = NSPredicate(format: "taskName = %@", "Lock the door.")

РЕДАКТИРОВАНИЕ3:

Вот код объекта;

public class Reminder: NSObject, NSCoding {

var reminderDescription : String? = nil
var reminderLength : Int? = nil// in days

public required init?(coder aDecoder: NSCoder) {
    self.reminderDescription = aDecoder.decodeObject(forKey: "reminderDescription") as? String
    self.reminderLength = aDecoder.decodeObject(forKey: "reminderLength") as? Int
}

public func encode(with aCoder: NSCoder) {
    aCoder.encode(reminderDescription, forKey: "reminderDescription")
    aCoder.encode(reminderLength, forKey: "reminderLength")
}

init (chosenReminderDescription: String, chosenReminderLength: Int) {
    reminderDescription = chosenReminderDescription
    reminderLength = chosenReminderLength

}

}

Модель данных

Если возможно, я бы хотел запроситьотносительно того, когда они были сделаны, как первый, затем второй.Должен ли я дать объекту свойство даты и выполнить запрос через него?

EDIT4:

request.predicate = NSPredicate(format: "orderNo = %@", "2")
    request.returnsObjectsAsFaults = false
    do {
        let result = try context.fetch(request)
        for data in result as! [Tasks] {
            print(data.value(forKey: "taskName"))
            if let reminders = data.value(forKey: "taskName") as? [Reminder] {
                for reminder in reminders {
                    // Now you have your single object Reminder and you can print his variables
                    print("Your reminder description is \(reminder.reminderDescription), and his length is \(reminder.reminderLength)")
                    self.reminderDisplay.text = reminder.reminderDescription
                    if reminderDisplay.text == reminder.reminderDescription {
                        self.testLabel1.text = reminder.reminderDescription
                        reminderCount = 1
                    }
                }
            }
        }

1 Ответ

0 голосов
/ 24 ноября 2018

Ваш код, кажется, вызывает запрос на объекте Задача и правильно получает результаты в массиве.Я бы посоветовал вам посмотреть, действительно ли вы сохраняете предыдущие попытки сохранить значение в своей сущности базовых данных Задача , прежде чем запрашивать подобные запросы.

Дон 'не стоит забывать, что иногда Core Data решает отложить фактическое хранение информации в своей БД.

Поэтому попробуйте форсировать сбережения в CoreDB, прежде чем запрашивать.Чтобы это произошло, убедитесь, что вы вызываете ".save ()", чтобы гарантировать, что Core Data сразу отправит (и выполнит) запрос на сохранение.

Пример кода для принудительного сохранения ниже приведен ниже:

do {
        try context.save()
    } catch {
        print("Failure to save context: \(error)")
    }
}

-

Редактировать (24/11/2018 3:07 AM GMT + 01: 00):

Читая ваш комментарий,похоже, вы просто хотите отфильтровать запросы по определенному значению, а не запрашивать самые последние.Для этого просто раскомментируйте код:

  //request.predicate = NSPredicate(format: "age = %@", "12")

Кому:

  request.predicate = NSPredicate(format: "age = %@", "12")

Внутри вызова формата формата NSPredicate предполагается, что вы хотите использовать в качестве выражения вашей фильтрации.Если вы хотите отфильтровать его по возрасту, ваш пример уже готов для вас.

Я также приложу пример других моих кодов.

request.predicate = NSPredicate(format: "(time >= %@) AND (time <= %@)", fromDateUnformatted as NSDate, toDateUnformatted as NSDate)

Теперь, если вы хотите выполнить запросы, связанные с отношениями (двойной или более запросов одновременно, чтобы копать информацию дальше внутриОтношения сущностей), то есть другие способы сделать это.

Дайте мне знать, если я иду в правильном направлении, чтобы найти ответ.

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