领域返回错误的数据

时间:2018-03-06 12:41:00

标签: swift realm

我是新手。我有两个对象,餐厅和地址。

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餐厅列表并将其保存到领域。

现在我有2个记录列表保存在我的数据库中。 地址包含不完整的餐馆信息,餐厅包含完整信息。

现在,我想使用 Address.restaurant.identifier 的标识符获取包含完整信息的餐厅。所以代码是这样的。

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

我的预期输出是餐厅,其中包含完整的详细信息,因为我正在过滤餐厅课程,而是将餐厅放在地址对象内,但餐厅的详细信息不完整。

有人可以帮我查询餐厅的详细信息吗?谢谢。

3 个答案:

答案 0 :(得分:1)

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

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

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

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

此外,您可以拥有2个表,一个用于餐馆,另一个用于地址。地址将有餐馆标识符,餐厅将只有一个地址标识符。

希望对你有帮助

答案 1 :(得分:0)

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

因此,只有访问Restaurant对象时,领域才会获取Address对象的Restaurants个对象。因此,我不会尝试通过在Realm数据库中使用2 cross join来优化提取。

答案 2 :(得分:0)

您是否需要进行查询?

而不是:

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