所以这是我第一次使用parse我有一个简单的应用程序,它创建了一个用户并允许他们登录。我目前正在开发一些东西,允许他们使用PFObjects填写自己的详细信息,我不知道这有问题。我的问题是我需要在UILabel上打印用户特定数据。
这是我创建PFObject的代码,这很好用:
- (IBAction)saveProfile:(id)sender {
PFObject *profile = [PFObject objectWithClassName:@"Profile"];
[profile setObject: self.name.text forKey:@"name"];
[profile setObject:[PFUser currentUser] forKey:@"author"];
[profile saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
if (!error) {
NSLog(@"No Error");
}else NSLog(@"Yeah you got an error bro");
}];
}
以下是我对PFQuery的问题:
PFQuery *query = [PFQuery queryWithClassName:@"Profile"];
[query whereKey:@"name" equalTo:[PFUser currentUser]];
[query getFirstObjectInBackgroundWithBlock:^(PFObject *object, NSError *error) {
if (!error) {
NSLog(@"Success");
self.nameLabel.text = [NSString stringWithFormat:@"%@", query];
}
else {
NSLog(@"Fail");
}
}];
}
所以基本上我希望用户输入他们的名字并保存,并在标签上打印出特定用户的名字。这是我得到的,如果你有任何建议,我会全力以赴。谢谢!
更新:
PFQuery *query = [PFQuery queryWithClassName:@"Profile"];
[query whereKey:@"author" equalTo:[PFUser currentUser]];
[query getFirstObjectInBackgroundWithBlock:^(PFObject *object, NSError *error) {
if (!error) {
NSLog(@"Success");
self.nameLabel.text = object[@"name"];
}
else {
NSLog(@"Fails");
}
}];
}
答案 0 :(得分:2)
您似乎正在设置PFObject
"名称" self.name.text的关键,但是在你的PFQuery
中,您要查询课程并询问值" name"等于[PFUser currentUser]
。您尝试以一种方式设置值,然后使用完全不同的值来尝试查询对象;所以getFirstObjectInBackgroundWithBlock
没有返回一个对象,因为没有Profile对象,其中" name"等于[PFUser currentUser]
。
我认为你混淆了你的名字"和"作者"属性...
编辑(回复您的评论):
好的,所以在saveProfile:
您正在创建一个PFObject
,您需要设置" name"到名称字符串和"作者"到用户的PFUser对象。当您使用whereKey:
对此类执行查询以尝试使用getFirstObjectInBackgroundWithBlock:
检索对象时,返回给您的结果将是完整 PFObject
其中与密钥关联的对象是whereKey:
条件中指定的对象。因此,在执行getFirstObjectInBackgroundWithBlock:
之前,您不必指定要阅读的PFObject的哪个键。查询返回整个对象 - 名称,作者等
因此,为了访问返回的PFObject
"名称"在查询块中,更改:
self.nameLabel.text = [NSString stringWithFormat:@"%@", query];
to(dispatch_aync
添加强制标签更改到主线程上):
dispatch_async(dispatch_get_main_queue(),^{
self.nameLabel.text = object[@"name"];
});
答案 1 :(得分:1)
这一行
[query whereKey:@"name" equalTo:[PFUser currentUser]];
仅在“name”列是User类的指针或关系时才有效。如果是您所使用的用户名,则需要使用
[query whereKey:@"name" equalTo:[PFUser currentUser][@"username"]];
但是你为什么要查询刚刚保存的对象?
您上次更新的示例应该可以满足您的需求。
答案 2 :(得分:0)
您可以启动类似下面的查询
PFQuery *query = [PFQuery queryWithClassName:@"Profile"];
NSString *nameStr = [NSString stringWithFormat:@"%@",[[PFUser currentUser]objectForKey:@"name"]];
[query whereKey:@"name" containsString:nameStr];
[query getFirstObjectInBackgroundWithBlock:^(PFObject *object, NSError *error)
{
if (!error)
{
/*object contains all columns and you need only key to obtain value*/
nameLabel = [NSString stringWithFormat:@"%@",object[@"job"];
.
.
.
}
else
{
NSLog(@"Error: %@", [error localizedDescription]);
}
}];
现在您将拥有当前用户的对象及其所有详细信息。此外,您可以做一件事,即,在用户填写个人资料详细信息时,将其保存在字典中,如下所示:
NSDictionary *signupDetail = [NSDictionary dictionaryWithObjectsAndKeys:self.userRegisterTextField.text, @"username",
self.nameTextField.text, @"Name",
[ResponseDict objectForKey:@"sessionToken"] ,@"sessionToken",
[ResponseDict objectForKey:@"objectId"], @"objectId",
nil];
//ResponseDict is dictionary you get in response for successful signup.
然后您可以使用[NSUserDefaults standardUserDefaults]
存储它,这样您就可以在一个地方获得用户的所有信息,并在需要的地方进行调用。