我正在测试Parse本地数据存储,以评估我是否可以将其用作SQLite的替代品,以用于主要在线下使用的应用程序。我可能发现了一个错误?
考虑产品和订单类:
class Product : PFObject, PFSubclassing {
@NSManaged var productName: String!
}
class Order : PFObject, PFSubclassing {
@NSManaged var orderId: String!
@NSManaged var product: Product!
}
禁用互联网后,当我运行以下代码时,它会在Tried to save an object with a new, unsaved child.
let p = Product()
p.productName = "Test Product"
p.saveEventually()
let o = Order()
o.orderId = "TestOrder01"
o.product = p
o.saveEventually()
let query = Order.query()
query.whereKey("product", equalTo: p)
let results = query.findObjects() // crashes with Tried to save an object with a new, unsaved child.
是我的代码中的平台限制还是错误?
注意我已从内存中输入代码,因此请忽略小问题。
答案 0 :(得分:1)
这是由于您使用saveEventually
造成比赛条件造成的,如下所示:
您需要确保在创建子项之前保存父项。
相反,在Product上执行saveInBackGroundWithBlock,然后在完成块中创建和保存Order。
答案 1 :(得分:0)
您可能需要的方法 pinObjectInBackground 。这实际上就是本地保存
的方式如果要将本地数据与云同步,则使用 saveEventually 方法。 saveEventually 引脚,但会第一次保存到云端。
当你只是 pinObjectInBackground 时,它会在本地保存它,但不会尝试离线保存任何内容。
答案 2 :(得分:0)
请参阅下面的代码。请注意我在没有XCODE的情况下更改了它,所以它可能有拼写错误:)下面的代码只会满足您从本地数据存储区的查询。 " saveEventually"将推送(同步)与Parse云,但如果您正在寻找本地可用的数据,它必须固定,有或没有名称。
let p = Product()
p.productName = "Test Product"
p.pinWithName("test")
p.saveEventually()
let o = Order()
o.orderId = "TestOrder01"
o.product = p
o.pinWithName("test")
o.saveEventually()
let query = Order.query()
query.fromPinWithName("test")
query.whereKey("product", equalTo: p)
let results = query.findObjects()