代码之家  ›  专栏  ›  技术社区  ›  Alvin John

域返回错误数据

  •  0
  • Alvin John  · 技术社区  · 7 年前

    我是个新手。我有两个目标,餐厅和地址。

    class Address: Object {
    
        @objc dynamic var identifier: Int = 0
        @objc dynamic var name: String!
        @objc dynamic var restaurant: Restaurant!
    }
    

    请注意,地址和餐厅有关系。

    class Restaurant: Object {
    
        @objc dynamic var identifier: Int = 0
        @objc dynamic var name: String!
        @objc dynamic var location: String!
        @objc dynamic var images: String!
    }
    

    现在,在我的api方面,我将请求地址,它将返回餐厅的地址列表,但餐厅只有一个标识符值,其他餐厅为零,以节省加载时间。我会把它保存到我的王国里。

    现在,为了获得其他餐厅的详细信息,如名称和位置等,我将再次向api请求餐厅列表,并将其保存到realm。

    现在,我在数据库中保存了两个记录列表。 住址 餐厅信息不完整 餐厅 信息完整。

    现在我想得到 餐馆 使用 住址餐馆标识符 。代码是这样的。

    let realm = try! Realm()
    let predicate = NSPredicate(format: "identifier = %i", address.restaurant.identifier)
    let restaurant =  realm.objects(Restaurant.self).filter(predicate).first!
    

    我的预期输出是具有完整详细信息的餐厅,因为我正在过滤餐厅类,而不是将餐厅放在 住址 餐厅详细信息不完整的对象。

    有人能帮我查询一下餐厅的详细情况吗?非常感谢。

    3 回复  |  直到 7 年前
        1
  •  1
  •   Nosov Pavel    7 年前

    正如您所说,您提出了两个请求,一个是简短地址,另一个是餐厅详细信息,在第一个请求中,您在地址和餐厅之间建立了关系,但当您获得餐厅详细信息时,您会将其保存为新对象。

    我认为在您的情况下,需要为要保存在DB中的每个类提供primaryKey,如:

    override static func primaryKey() -> String? {
        return "identifier"
    }
    

    之后,来自餐厅详细信息请求的数据将在DB中用相同的id更新您的餐厅,并且只有一个唯一的对象。

    此外,您可以有两张桌子,一张用于餐厅,另一张用于地址。地址将有餐厅标识符,餐厅将只有一个地址标识符。

    希望对你有帮助

        2
  •  0
  •   Mika    7 年前

    从…起 Realm Swift documentation for relationships :“例如,rex.owner?.address.country将遍历对象图,并根据需要自动从领域中提取每个对象。”

    所以realm将获取 Restaurant 的对象 Address 仅当对象被访问时。因此,我不会试图通过使用2 Restaurants 在领域数据库中。

        3
  •  0
  •   ast    7 年前

    您必须进行查询吗?

    而不是执行以下操作:

    let realm = try! Realm()
    let predicate = NSPredicate(format: "identifier = %i", address.restaurant.identifier)
    let restaurant =  realm.objects(Restaurant.self).filter(predicate).first!
    

    你就不能这样做吗(考虑到你有 Address 对象):

    let restaurant = address.restaurant