Сохранение пользователя приводит к ошибке «объект не найден»

#objective-c #parse-platform

#цель-c #синтаксический анализ-платформа #платформа для разбора

Вопрос:

Сохранение пользователя приводит к ошибке: объект не найден для обновления (Код: 101, версия: 1.2.19)

    [PFGeoPoint geoPointForCurrentLocationInBackground:^(PFGeoPoint *geoPoint, NSError *error) {
        if (!error) {
            [PFUser currentUser].location = geoPoint;
            [[PFUser currentUser] save];
        }
    }];
  

что я делаю не так?

http post запрос https://api.parse.com/2/update

 {
    "iid": "[redacted]",
    "classname": "_User",
    "data": {
        "email": "test@test.com",
        "objectId": "[redacted]"
    },
    "session_token": "[redacted]",
    "v": "i1.2.19",
    "uuid": "[redacted]"
}
  

ответ

 {
    "code": 101,
    "error": "object not found for update"
}
  

Ответ №1:

У меня та же проблема, что и у вас, я провел некоторое тестирование и выяснил первопричину:

  • Создайте новый класс GameScore в качестве документа
  • Проделайте то же самое с объектом create и update и убедитесь, что он работает хорошо
  • Проверьте столбцы «ACL» и сравните с вашими проблемными данными. Видите?

Работает ACL, я сделал изменение для *, чтобы прояснить

Работает ACL, я сделал изменение для *, чтобы прояснить

введите описание изображения здесь

Сбой ACL.

Как вы могли видеть, блокировка прав на запись для пользователя «6iIv5XWZvM», вот почему ваше обновление будет «не найден объект»

Вы могли бы изменить запись данных непосредственно на «*», чтобы ваше обновление работало хорошо.

ХОРОШО! Вот решение следующим образом:

  1. Измените столбец данных каждой записи «ACL» следующим образом:

    {«*»:{«запись»: истина,»чтение»: истина}}

  2. Вам нужно войти в систему PFUser как конкретный пользователь, чтобы изменить ACL на общедоступный. В моем случае использовать ObjectId будет «6iIv5XWZvM». Мне нужно установить пароль и данные для входа и использовать код для входа и его изменения. Детализируйте код iOS следующим образом:

      //iOS Sample
     [PFUser logInWithUsernameInBackground:@"USERNAME" password:@"PASSWORD" block:^(PFUser *user, NSError *error) {
        if (user) {
            PFQuery *query = [PFQuery queryWithClassName:CLASS_NAME];
            [query findObjectsInBackgroundWithBlock:^(NSArray *objs, NSError *error) {
                for (PFObject *obj in objs) {
                    PFACL *defaultACL = [PFACL ACL];
                    [defaultACL setPublicReadAccess:YES];
                    [defaultACL setPublicWriteAccess:YES];
                    [obj setACL:defaultACL];
                    [obj saveInBackground];
                }
            }];
        } else {
            // The login failed. Check error to see why.
            }
    }];
      

Однако не забудьте добавить следующую настройку перед сохранением новых данных, если вы больше не хотите, чтобы это происходило (примечание: это будет связано с безопасностью)

 //It is iOS code sample.
PFACL *defaultACL = [PFACL ACL];
[defaultACL setPublicReadAccess:YES];
[defaultACL setPublicWriteAccess:YES];
[PFACL setDefaultACL:defaultACL withAccessForCurrentUser:YES];
  

Ответ №2:

Попробуйте это, я использую это, когда мне нужно сохранить объекты для текущего пользователя. Надеюсь, это поможет.

         PFUser *user = [PFUser currentUser];
        [user setObject:geoPoint forKey:@"location"];

        [user saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
            if (error){
                NSLog(@"Error %@ %@", error, [error userInfo]);
            }
        }];
  

Ответ №3:

Ошибка: «объект не найден для обновления» появляется при попытке сохранить объект, к которому у пользователя нет доступа ACL.

Чтобы разрешить пользователю изменять объект, вам необходимо установить разрешение PFACL при создании объекта :

Для конкретного пользователя :

 PFObject *object = /*the object you want to save*/
NSString *userID = /*the objectID of the user you want to let perform modifications later*/
PFACL *groupACL = [PFACL ACL];
[groupACL setWriteAccess:YES forUserId:userID];
object.ACL = groupACL;
  

Для всех пользователей :

 PFObject *object = /*the object you want to save*/
NSString *userID = /*the objectID of the user you want to let perform modifications later*/
PFACL *groupACL = [PFACL ACL];
[groupACL setPublicWriteAccess:YES];
object.ACL = groupACL;