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

时间:2014-12-29 17:48:02

标签: ios swift parse-platform local-datastore

我正在测试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.

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

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

3 个答案:

答案 0 :(得分:1)

这是由于您使用saveEventually造成比赛条件造成的,如下所示:

  1. 您创建了一个产品。
  2. 你告诉Parse在有时间的时候保存它 - 但它不会马上。
  3. 您创建了一个订单。
  4. 当您告诉Parse最终保存订单时,它会检查以确保已保存父级,但不是 - 因此错误。
  5. 您需要确保在创建子项之前保存父项。

    相反,在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()