2014-12-29 2 views
0

Я тестирую локальный хранилище Parse, чтобы оценить, могу ли я использовать его в качестве замены для SQLite для приложения, которое в основном будет использоваться в автономном режиме. Возможно, я нашел ошибку?Parse.com local datastore: пытался сохранить объект с новым несохраненным ребенком

Рассмотрим продукта и заказ классы:

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()' сохранять в локальном хранилище данных (поскольку у пользователя нет Интернета)? Это очень распространенный сценарий для пользователя, который создает объекты и код, чтобы запросить их для обновления интерфейса (в автономном режиме). Таким образом, это действительно ограничение на платформу. Невозможно выполнить запросы, если данные уже не сохранены * онлайн *, правильно? – User123

0

Метод, который может вам понадобиться pinObjectInBackground. Это на самом деле, как вы сохранить локально

saveEventually метод используется, когда вы хотите синхронизировать локальные данные с облаком. saveEventually булавки, но сохранит в облаке первый шанс, который он получит.

Когда вы только 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() 
Смежные вопросы