我正在尝试在NSArray中搜索字符串,但我的研究方法都没有用

时间:2013-03-07 23:07:11

标签: objective-c parse-platform

我正在使用Parse,我正在从名为“usernames”的数据浏览器中检索一个类。 我得到了类中的所有对象,并将它们存储在一个数组中。然后我想在数组中搜索用户名,以便用户可以登录。我会为密码做同样的事情。这是我的代码:

- (IBAction)login:(id)sender
{
if ([usernameLogin.stringValue isEqualTo:@""] || [passwordLogin.stringValue isEqualTo:@""]) {
    NSBeginAlertSheet(@"Error", @"OK", nil, nil, self.window, self, @selector(sheetDidEnd:resultCode:contextInfo:), NULL, NULL, @"Please fill in all fields.");
}

/* retrieve user from parse db */
PFQuery *usernameQuery = [PFQuery queryWithClassName:@"usernames"];
[usernameQuery findObjectsInBackgroundWithBlock:^(NSArray *usernames, NSError *error) {

    NSString *userString = [NSString stringWithFormat:@"%@", usernameLogin.stringValue];
    NSLog(@"USERS:\n %@", usernames);

    int i;
    for (i = 0; i < [usernames count]; i++) {
        NSString *userFind = [usernames objectAtIndex:i];
        if ([userString isEqualToString:userFind]) {
            NSLog(@"FOUND!!!");
        }
    }

    /*
    if ([usernames indexOfObject:usernameLogin.stringValue]) {
        NSLog(@"User: '%@' was found successfully!", usernameLogin.stringValue);

    } else {
        NSLog(@"User: '%@' doesn't exist in database, or password was incorrect!", usernameLogin.stringValue);
    }
    */
}];

gameCont = [[CSGameController alloc] initWithWindowNibName:@"CSGameController"];
[gameCont showWindow:self];
[gameCont.window makeKeyAndOrderFront:nil];
_window.isVisible = false;
}

有谁能解释我做错了什么?我正在搜索数据库以查看输入的用户是否存在。我设置了一个测试用户,它仍然说它不存在。非常感谢! 添加了:

        int i;
    for (i = 0; i < [usernames count]; i++) {
        NSString *userFind = [usernames objectAtIndex:i];
        NSLog(@"UserFind class = %@, value = %@", [userFind class], userFind);
    }

输出:

[2438:303] UserFind class = PFObject, value = <usernames:kx7aG2xfkX:(null)> {
username = ryan;

}

3 个答案:

答案 0 :(得分:3)

似乎你在这里尝试做很多事情,只是没有意义。请考虑阅读Parse iOS Guide。所有PFQueries都返回PFObjects。 PFObjects在很多方面都像NSDictionaries;它们是数据库中的单个记录,可以获取或存储。 PFQuery总是返回一个或多个PFObject。 PFQuery的结果应该几乎总是可以立即使用。在这个例子中,equals条件可以用 - [PFQuery whereKey:equalTo:]表达。让Parse为您搜索更快更多。这也允许您通过PFQueryTableViewController创建由查询结果提供支持的UI。 最后,请不要自己制作登录代码。您当前的代码很容易被黑客入侵,不仅允许任何人以任何人身份登录,还可以学习任何人的密码。将内置PFUser类用于用户帐户。它处理安全登录,凭证离线缓存,密码重置,电子邮件验证,您可以让用户使用他们的Facebook或Twitter帐户登录除用户名/密码,Parse还有内置的视图控制器,用于登录和创建帐户PFUsers。 PFUsers也是保护数据的方法; PFACL是一个访问控制列表,可让您确定哪些PFU可以读取或写入数据。

答案 1 :(得分:1)

这是错误的,你试图使用isEqualToString:userFind,PFObject

尝试与其username属性进行比较:

    ...
    for (PFObject *aUsername in usernames) 
    {           
        NSString *userFind = [aUsername objectForKey:@"username"];

        if ([userString isEqualToString:userFind]) {
        NSLog(@"FOUND!!!");
        }
    }

答案 2 :(得分:0)

问题解决了:我使用了Parse的User类。他们有预先存在的注册用户的方法,就像我在我自己的课程中尝试做的那样。他们的注册方法是:

    PFUser *user = [PFUser user];
    user.email    = emailField.stringValue;
    user.username = usernameField.stringValue;
    user.password = passwordField.stringValue;
    [user signUpInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {