Parse.com 本地数据存储:尝试使用新的未保存子项保存对象



我正在测试解析本地数据存储,以评估是否可以将其用作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.

是平台限制还是代码中的错误?

注意:我已经从内存中键入了代码,因此请忽略小问题。

这是

由于您使用saveEventually导致赛车状况造成的,如下所示:

  1. 您创建一个产品。
  2. 你告诉 Parse 在有时间的时候保存它 - 但它不会马上保存。
  3. 您创建一个订单。
  4. 当你告诉 Parse 最终保存订单时,它会检查以确保父级已经保存,但事实并非如此 - 因此会出现错误。

您需要确保在创建子项之前保存父项。

相反,在产品上执行 saveInBackGroundWithBlock 操作,然后在完成块中创建并保存订单。

您可能需要 pinObjectInBackground 的方法。 这实际上是您在本地保存的方式

当您想要将本地数据与云同步时,将使用 saveEventually 方法。save最终会固定,但会在第一次有机会时保存到云中。

当你只是pinObjectInBackground时,它会将其保存在本地,但不会尝试离线保存任何内容。

请参阅下面的代码。请注意,我在没有XCODE的情况下更改了它,因此它可能有错别字:)下面的代码将仅满足来自本地数据存储的查询。"saveFinal"将推送(同步)与 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() 

最新更新