«Невозможно выполнить сортировку по ключевому пути, свойство не существует» — RealmSwift

Итак, я получаю эту фатальную ошибку:

Завершение работы приложения из-за неперехваченного исключения «RLMException», причина: «Невозможно выполнить сортировку по ключевому пути «заголовок»: свойство «Item.title» не существует».

У меня есть категория класса, которая содержит список моих элементов класса, и у них есть отношения связывающих объектов. Я использую Realm и получаю сообщение об ошибке при нажатии на ячейку категории в моем табличном представлении, которое должно привести меня к табличному представлению всех элементов в выбранной категории. Вот функция (две переменные находятся в начале моего файла, я поместил их здесь, чтобы вы могли видеть):

var toDoItems : Results<Item>?

var selectedCategory : Category? {
    didSet {
        loadItems()
    }
}


func loadItems() {

    toDoItems = selectedCategory?.items.sorted(byKeyPath: "title", ascending: true)
    
    tableView.reloadData()
}

Просто для ясности: selectedCategory устанавливается в моем CategoryViewController через свойство tableView.indexPathForSelectedRow, именно так оно получает свое значение в моем ToDoListViewController, где находится функция loadItems(). А вот мои классы категорий и предметов (конечно, в своих файлах):

import Foundation
import RealmSwift

class Category: Object {
    dynamic var name: String = ""
    let items = List<Item>()
}

import Foundation
import RealmSwift

class Item: Object {
    dynamic var title: String = ""
    dynamic var done: Bool = false
    dynamic var dateCreated: Double = 0.0
    var parentCategory = LinkingObjects(fromType: Category.self, property: "items")
}

Почему я получаю сообщение об ошибке, что свойство Item.title не существует? Это явно так. Я стер и перезаписал переменную, перезапустил Xcode и т. д., но ошибка осталась. Заранее благодарю за любую помощь!


person Community    schedule 21.07.2020    source источник


Ответы (2)


Ваш объект Realm построен неправильно. Вам либо нужно пометить отдельные свойства как @objc

class Item: Object {
    @objc dynamic var title: String = ""

или отметьте весь объект как @objmembers

@objcMembers class Item: Object {
    dynamic var title: String = ""

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

person Jay    schedule 21.07.2020
comment
спасибо, я попробовал это, но затем я получил эту ошибку: Тема 1: Неустранимая ошибка: «попробуйте!» выражение неожиданно вызвало ошибку: Error Domain=io.realm Code=10 Требуется миграция из-за следующих ошибок: - Добавлено свойство «Category.name». - Добавлено свойство Item.title. - Добавлено свойство «Item.done». - Добавлено свойство Item.dateCreated. UserInfo={NSLocalizedDescription=Миграция требуется из-за следующих ошибок: - Добавлено свойство 'Category.name'. - Добавлено свойство Item.title. - Свойство «Item.done» было - person ; 21.07.2020
comment
Любая идея, как исправить эту ошибку или что это значит? Приложение даже не смогло запуститься до того, как возникла ошибка - person ; 21.07.2020
comment
@derek Конечно, это означает, что вы изменили схему ваших объектов Realm и вам нужно добавить Блок миграции, чтобы справиться с этим. Если вы находитесь в разработке, иногда проще удалить все данные Realm и начать заново. Обратите внимание, что миграции обрабатываются по-разному в зависимости от того, как вы используете область, локальную или синхронизированную, а затем новая БЕТА-сфера MongoDB также отличается от них. - person Jay; 21.07.2020
comment
У меня почти нет данных в моей Realm Studio, и даже если они есть, я не думаю, что какие-либо из них будут конфликтовать с новым форматированием, как описано в прикрепленной вами ссылке, хотя, если удаление данных является хорошим вариантом, как мне сделай это? (извините, я очень новичок в Realm). Кроме того, я вставил большой блок кода из этой ссылки в свой didFinishLaunchingWithOptions, и у меня та же ошибка, что и раньше. Я как-то неправильно это реализую? единственное изменение, которое я вношу в код, - это добавление @objc к каждому свойству, я не меняю саму модель, как в примере из отправленной вами ссылки. Благодарность - person ; 21.07.2020
comment
@derek У вас может быть, но вы не можете сказать, не видя фактического кода. Здесь на SO есть ряд вопросов о блоках миграции, поэтому между документацией, на которую я ссылался выше, и небольшим поиском здесь, вы найдете много хороших и разнообразных примеров. Если вы просто хотите удалить все свои данные, вы можете удалить файлы вручную или использовать одну из новых функций, которая сделает это за вас. См. мой ответ на Удаление данных сферы. Обязательно выйдите из Realm Studio перед удалением. - person Jay; 21.07.2020
comment
хорошо, спасибо, я проведу еще несколько исследований и вернусь с решением, если найду его - person ; 21.07.2020
comment
@derek Если этот ответ помог с этим вопросом, обязательно примите его, чтобы он мог помочь другим. Миграция — это отдельный вопрос, поэтому не стесняйтесь задавать вопросы об этом, если вы застряли. Как принять - person Jay; 21.07.2020

Чтобы ответить на часть ниже о том, почему приложение все еще дает сбой, все, что мне нужно было сделать, это зайти в свой симулятор и удалить приложение в симуляторе, а затем перезапустить его. Исправлено!

person Community    schedule 21.07.2020