我正在创建一个具有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
}
}];
答案 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
是否与您当前保存的组匹配,如果确实如此,您可以安全地返回成功,否则返回错误。