在后台更新Parse对象

时间:2015-03-08 10:59:08

标签: ios objective-c parse-platform

我正在创建一个具有Parse云集成的应用程序。 在我的代码的某处,我打算编辑一个现有的Parse对象(类#34; Group")并在云上更新它。

我使用以下代码:

PFQuery *query = [PFQuery queryWithClassName:@"Group"];
[query getObjectInBackgroundWithId:@"someID" block:^(PFObject *group, NSError *error) {
        if (!error){
            [group addObject:@"someString" forKey:@"members"];
            [group saveInBackground];
        }
    }];

成员是我的Group类中的数组,我想向此数组添加字符串。但是,当我运行此操作时,我收到此错误:错误:已存在具有此名称的组。 (代码:142,版本:1.4.2)

我尝试在将字符串添加到数组之前添加以下行:

group[@"name"] = @"differentName";

它有效!我觉得很奇怪。我不想更改我的群组名称,我只想更新我的阵列并将其保存到数据库中。

对此有什么解决方案,欢迎任何帮助!

谢谢

这是我设置群组属性并保存的地方:

PFObject *group = [PFObject objectWithClassName:@"Group"];
group[@"name"] = self.groupName.text;
group[@"description"] = self.groupDescription.text;
[group saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
    if (succeeded) {
        // The object has been saved.
    } else {
        // There was a problem, check error.description
    }
 }];

1 个答案:

答案 0 :(得分:0)

根据我对错误报告的回复,问题是 beforeSave 函数,它检查名为 XYZ 的组是否已存在。当每次保存时触发 beforeSave 函数,不仅在创建时,对该对象的所有后续保存都将失败。

要解决此问题,您应该检查这是否是由于对象创建而触发的保存以及更新现有对象。为此,您可以使用对象的便捷函数isNew来检查触发保存的内容。在幕后,这实际上只是检查正在保存的对象是否已经设置了objectId

以下是一些应该解决问题的示例代码:

Parse.Cloud.beforeSave("Group", function(request, response) {
   var object = request.object;

   // If it is a new object, check if a Group with that name already exists
   if (object.isNew()) {
       var Group = Parse.Object.extend("Group");
       var query = new Parse.Query(Group);
       query.equalTo("name", object.get("name"));
       query.find({
           success: function(results) {
               if (results.length == 0) {
                   // There is no group with that name, so we can save
                   response.success();
               } else {
                   response.error("A group with this name already exists");
               }
           },
           error: function(error) {
               response.error(error.message);
           }
       });
   } else {
       // This is just an update, so lets save it
       response.success();
   }
}); 

此代码应该可以解决问题,但是,当有人只是更新现有组时,它不检查已存在的Group,这是我将留给您实现的内容。您可以在查询本身中执行此操作,因此您始终可以检查是否存在具有该名称的组,如果是,请检查现有组objectId是否与您当前保存的组匹配,如果确实如此,您可以安全地返回成功,否则返回错误。