【问题标题】:fatal error at runtime with Realm using LInkingOjbects使用 LINKingOjbects 的 Realm 在运行时出现致命错误
【发布时间】:2017-03-27 07:09:05
【问题描述】:

收到以下致命错误。

致命错误:“试试!”表达式意外引发错误:错误 Domain=io.realm Code=1 "Schema 验证失败,原因如下 错误: - 属性“GearModel.category”声明为链接对象属性“CategoryRepository.gearList”链接到类型“CategoryModel”的来源 UserInfo={NSLocalizedDescription=Schema 验证失败,因为 以下错误: - 属性“GearModel.category”声明为链接对象属性“CategoryRepository.gearList”链接到类型“CategoryModel”的来源, 错误代码=1}:

此处的对象模型:齿轮模型仅分配给一个类别

import Foundation
import RealmSwift

class GearModel: Object{

    dynamic var gearID = NSUUID().uuidString
    dynamic var name = ""
    dynamic var manufacturer = ""
    dynamic var sortOrder = 0
    dynamic var category: CategoryModel?

    override class func primaryKey() -> String? {return "gearID"}
    }

Category Model:试图获取所有 GearModel 项目的列表,并分配了 Category。

    import Foundation
    import RealmSwift

    class CategoryModel: Object{

        dynamic var categoryID = NSUUID().uuidString
        dynamic var sortOrder = 0
        dynamic var name = ""
        let gearList = LinkingObjects(fromType: GearModel.self, property: "category")

override class func primaryKey() -> String? {return "categoryID"}
    }

Category Repository 类:在 allCategories() func 中的“let realm =....”行发生致命错误

import Foundation
import RealmSwift

class CategoryRepository: CategoryModel{

    class func GetGearItemsForCategory(CategoryID: String) -> Results<GearModel>
    {
        let realm = try! Realm()

        var gearItems = realm.objects(GearModel.self)

        let predicate = NSPredicate(format: "categoryID = %@", CategoryID)
        gearItems = gearItems.filter(predicate)
        return gearItems
    }

    class func GetCountOfGearItems(CategoryID: String) -> Int
    {
        let realm = try! Realm()

        var gearItems = realm.objects(GearModel.self)

        let predicate = NSPredicate(format: "categoryID = %@", CategoryID)
        gearItems = gearItems.filter(predicate)
        return gearItems.count
    }

    class func AddCategory(CategoryID: String, Name: String, SortOrder: Int){

        let realm = try! Realm()

        let category = CategoryModel(name: CategoryID, categoryID: Name, sortOrder: SortOrder)

        try! realm.write {
            realm.add(category)
        }
    }

    class func allCategories() -> Results<CategoryModel> {

        let realm = try! Realm()


        return realm.objects(CategoryModel.self).sorted(byProperty: "SortOrder")
    }

【问题讨论】:

  • 错误Property 'GearModel.categories'... 表明您在 GearModel 中有另一个名为 categories 的属性。这是哪里?
  • 很好,我在一次尝试修复问题时错误地复制到错误与代码不匹配。在上面的代码中修复。我已将关系从 1 - Many 更改为 Many - Many。这就是类别变成类别的原因。但这也没有用。
  • 你也可以分享CategoryRepository的课程吗?
  • 添加了 CategoryRepository 类。注意:应用程序在添加 LinkingObjects 之前按预期运行。所以剩下的班级应该没问题,(我认为:))

标签: swift realm fatal-error


【解决方案1】:

不支持从具有LinkingObjects 属性的类继承。

Realm 中的 Object 和 List 属性不是协变的,这意味着它们只能指向指定的类,而不是该类的子类。这意味着GearModel.category 无法链接到CategoryRepository 对象,但CategoryRepository 具有继承的gearList 属性,该属性试图列出链接到它的GearModel 对象。

在您的具体情况下,尚不清楚为什么 CategoryRepository 继承自 CategoryModel

【讨论】:

  • 老实说,我是 Swift 新手,CategoryRepository 代码基于 Xamarin 上的教程,然后我将 Realm 添加为我的数据存储。今晚我会改变它,并标记答案应该如我们所愿。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-16
  • 1970-01-01
  • 2021-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-20
相关资源
最近更新 更多