0

我正在测试 Parse 本地数据存储,以评估我是否可以将它用作 SQLite 的替代品,用于主要离线使用的应用程序。我可能发现了一个错误?

考虑 Product 和 Order 类:

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.

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

注意我已经从内存中输入了代码,所以忽略小问题。

4

3 回答 3

1

这是由您使用saveEventually引起赛车条件引起的,如下所示:

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

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

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

于 2014-12-29T18:15:06.537 回答
0

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

当您想要将本地数据与云同步时,使用saveEventually方法。saveEventually 固定,但会在第一时间保存到云端。

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

于 2015-03-05T16:28:28.893 回答
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() 
于 2015-05-11T12:48:43.577 回答