2015-08-21 1 views
0

CloudKit JS предлагает методы для сохранения, удаления и извлечения записей, но нет простых способов обновления существующего. documentation объясняет, как это сделать:Обновление записи с CloudKit JS

var query = { 
    operationType : 'forceUpdate', 
    recordType: 'List', 
    record : { 
     recordName : 'TheRecordIWannaUpdate', 
     fields: { TheFieldToUpdate: { 'value': 42}} 
    } 
}; 
container.publicCloudDatabase.performQuery(query).then(function(response) { 
    if(response.hasErrors) { 
     console.log(response.errors[0]); 
    } else { 
     console.log('It's working') 
    } 
}); 

Я попробовал этот код и он возвращает It's working однако моя запись не обновляется, что не так с этим кодом?

ответ

2

Чтобы обновить запись, вы можете использовать запись ChangeTag. Нужны последние recordChangeTag.

Documentation

Когда вы запрашиваете запись с сервера, вы получите текущую версию этой записи, как она существует на сервере. Однако в любое время после вы извлекаете запись, другие пользователи могут сохранить новую версию записи на сервер. Каждый раз, когда запись сохраняется, сервер обновляет токен изменения записи до нового значения. Когда вы сохраняете свой экземпляр записи на сервер, сервер сравнивает токен в вашей записи с токеном на сервере. Если совпадают два токена, сервер знает, что вы изменили последнюю версию записи и , что ваши изменения могут быть применены сразу же. Если два токена не соответствуют , сервер применяет политику сохранения вашего приложения, указанную в , чтобы определить, как действовать.

Пример

var record = { 
    recordType: 'List', 
    recordName: TheRecordIWannaUpdate, 
    recordChangeTag: TheRecordTag, 
    fields: { 
     TheFieldToUpdate: { 
     value: 42 
     } 
    } 
}; 

Сохранить политика не работает для меня, но вы можете добавить его.

var options = { 
     zoneName: undefined, 
     operationType : 'forceUpdate' 
    }; 

container.publicCloudDatabase.saveRecord(record,options) 
    .then(function(response) { 
    if(response.hasErrors) { 
     console.log(response.errors[0]); 
    } else { 
     console.log("It's working"); 
    } 
}); 
2

В документации государств, update является надлежащее operationType использовать в большинстве ситуаций.

обновление | Обновите существующую запись. Изменены только указанные вами поля.

Всегда возможно, что запись была обновлена ​​другим клиентом между моментом, когда вы его прочитали, и попыталась применить новые обновления. recordChangeTag - это то, как сервер знает, какую версию вы читаете, поэтому в документации указано, что вам нужно отправить ее в ходе операции обновления.

Если операцияType обновляется, установите для параметра recordChangeTag значение существующей записи [в словаре словарей].

При попытке обновить запись, которая была уже обновленным кем-то другим, вы получите конфликт с сервера, потому что ваш recordChangeTag стар, и вы должны справиться с этим конфликтом любым способ, имеет смысл в вашем приложении. Возможно, вы хотите сообщить пользователю и, возможно, просто хотите объединить изменения.

В особых ситуациях может потребоваться принудительное обновление.В этом случае вы можете использовать тип операции forceUpdate, предлагая серверу игнорировать конфликты и принимать это обновление, и в этом случае вам не нужно включать recordChangeTag.

forceUpdate | Обновите существующую запись независимо от конфликтов. Создает запись, если она не существует.

Если вы используете обычный тип операции update и получаете успех (а не конфликт), то запись обязательно должна быть обновлена ​​на сервере. Если это не так, происходит что-то еще.

Следует отметить, что при отправке изменений на сервер вам может быть удобнее использовать RecordsBatchBuilder. Вот пример того, что вы можете делать с ним:

myDatabase.newRecordsBatchBuilder() 
    .createOrUpdate(record1) 
    .create(record2) 
    .update(record3) 
    .forceUpdate(record4) 
    .delete(record5) 
    .commit() 

Как вы можете видеть, она обрабатывает много вариантов для вас.