2016-11-13 2 views
1

Получение следующей фатальной ошибки.фатальная ошибка во время выполнения с использованием Realm с использованием LInkingOjbects

fatal error: 'try!' expression unexpectedly raised an error: Error Domain=io.realm Code=1 "Schema validation failed due to the following errors: - Property 'GearModel.category' declared as origin of linking objects property 'CategoryRepository.gearList' links to type 'CategoryModel'" UserInfo={NSLocalizedDescription=Schema validation failed due to the following errors: - Property 'GearModel.category' declared as origin of linking objects property 'CategoryRepository.gearList' links to type 'CategoryModel', Error Code=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"} 
    } 

Категория Модель: Попытка получить список всех GearModel предметов с категорией присвоенной.

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

Категория Класс Repository: фатальная ошибка в строке "пусть область = ...." в allCategories() FUNC

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

Ошибка 'Property 'GearModel.categories' ... ' предполагает, что у вас есть другое свойство в GearModel, называемое категориями. Где это? – Michael

+0

Хороший улов, я скопировал по ошибке одну попытку исправить проблему, чтобы ошибка не соответствовала коду. Исправлено в коде выше. Я изменил отношение к 1 - к многим - многим. Вот почему категория превратилась в категории. Но это тоже не сработало. –

+0

Можете ли вы поделиться классом CategoryRepository? – Dmitry

ответ

0

Наследование от класса, который имеет LinkingObjects свойства не поддерживается.

Свойства объекта и списка в Realm не являются ковариантными, что означает, что они могут указывать только на указанный класс, а не на подклассы этого класса. Это означает, что GearModel.category не может ссылаться на CategoryRepository объектов, но CategoryRepository имеет наследуемое свойство gearList, которое пытается перечислить объекты GearModel, ссылающиеся на него.

В вашем конкретном случае непонятно, почему CategoryRepository наследуется от CategoryModel.

+0

Чтобы быть абсолютно честным, я новичок в Swift, а код CategoryRepository основан на учебнике по Xamarin, в который я затем добавил Realm в качестве хранилища данных. Я изменю это сегодня и отметю, что ответ должен сработать, как мы надеемся. –