2014-12-29 13 views
0

我正在測試解析本地數據存儲以評估是否可以將它用作主要用於離線的應用程序的SQLite替代品。我可能發現了一個錯誤?Parse.com本地數據存儲區:嘗試使用新的未保存的子項保存對象

考慮產品和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. 

它是一個平臺,限制或我的代碼中有一個錯誤?

注意我已經從內存中鍵入代碼,所以忽略小問題。

回答

1

這是由您的saveEventually使用造成的賽車條件,像這樣造成的:

  1. 創建產品。
  2. 您告訴Parse在有時間時保存它 - 但它不會馬上。
  3. 您創建訂單。
  4. 當您告訴Parse最終保存訂單時,它會檢查以確保父項已保存,而不是 - 因此是錯誤。

您需要確保在創建子項之前保存父項。

取而代之的是,在產品上執行saveInBackGroundWithBlock,然後在完成塊中創建並保存訂單。

+1

你說得對,但我的觀點是不應'saveEventually()'保存到本地數據存儲區(因爲用戶沒有互聯網)?對於用戶來說,創建對象和代碼來查詢它們以更新UI(在離線狀態下)是非常常見的情況。所以,這實際上是一個平臺限制,除非數據已經保存*在線*,否則不能運行查詢? – User123

0

您可能需要的方法pinObjectInBackground。這實際上是你如何本地保存

saveEventually方法被用來當你想與雲同步本地數據。 saveEventually pins,但將保存到雲第一次獲得的機會。

當你只是pinObjectInBackground它保存在本地,但不會嘗試保存任何脫機。

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() 
相關問題