DEVESH JHA
DEVESH JHA

Reputation: 19

Store multiple key-value pair in NSUserDefaults

I am building a simple login and registration in IOS (xcode 6.4). To save username and password i am using NSUserDefaults. But the problem is I Can't store multiple username and passwords since I am saving data to same key.What's the alternate method to implement it.I saw some similar questions on stackoverflow but couldn't understand the solution. So can anyone explain in easy way. HEre is my code:

//function for login pressed
- (IBAction)login:(UIButton *)sender 
{
    NSLog(@"%@,%@",userNameField.text,passwordField.text);

    username = [[NSUserDefaults standardUserDefaults] objectForKey:@"username"];
    password = [[NSUserDefaults standardUserDefaults] objectForKey:@"password"];
    NSLog(@"%@,%@",username,password);
    bool validUser = [username isEqualToString:userNameField.text];
    bool validPassword = [password isEqualToString:passwordField.text];

    if ([self checkWhetherFieldIsEmpty:userNameField.text :passwordField.text]) 
    {
        [self displayAlert:@"All Fileds are mandatory"];
    }
    else if(validUser && validPassword)
    {
        [self displayAlert:@"Successfull Login"] ;
    }
    else{
        // NSLog(@"Invalid username or password");
        [self displayAlert:@"Invalid login or password"];
    }

}

//function when register button is pressed
- (IBAction)register:(UIButton *)sender 
{
    if([[[NSUserDefaults standardUserDefaults] objectForKey:@"username"] isEqualToString:userNameField.text])
    {
        [self displayAlert:@"User already exist"];
        userNameField.text = @"";
        passwordField.text = @"";
    }
    else 
    {
        [[NSUserDefaults standardUserDefaults] setObject:userNameField.text forKey:@"username"];
        [[NSUserDefaults standardUserDefaults] setObject:passwordField.text forKey:@"password"];
        [[NSUserDefaults standardUserDefaults]synchronize];
        NSLog(@"user Created successfully");
        [self displayAlert:@"Registration Successfull"];
    }
}

Upvotes: 0

Views: 731

Answers (2)

larva
larva

Reputation: 5148

You can simple save your password as object of key username, some think like:

- (IBAction)login:(UIButton *)sender {

    NSLog(@"%@,%@",userNameField.text,passwordField.text);

    NSString *password = userNameField.text.length > 0? [[NSUserDefaults standardUserDefaults] objectForKey:userNameField.text] : nil;
    bool validUser = passwordField.text.length > 0 ? [passwordField.text isEqualToString:password] : NO;

    if ([self checkWhetherFieldIsEmpty:userNameField.text :passwordField.text]) {
        [self displayAlert:@"All Fileds are mandatory"];
    }

    else if(validUser){

        [self displayAlert:@"Successfull Login"] ;


    }

    else{
        // NSLog(@"Invalid username or password");
        [self displayAlert:@"Invalid login or password"];
    }

}

//function when register button is pressed
- (IBAction)register:(UIButton *)sender {
    //TODO: need check userNameField passwordField is not nil here
    if([[[NSUserDefaults standardUserDefaults] objectForKey:userNameField.text] length] > 0){
        [self displayAlert:@"User already exist"];
        userNameField.text = @"";
        passwordField.text = @"";

    }
    else {
        [[NSUserDefaults standardUserDefaults] setObject:passwordField.text forKey:userNameField.text];
        [[NSUserDefaults standardUserDefaults]synchronize];
        NSLog(@"user Created successfully");
        [self displayAlert:@"Registration Successfull"];
    }
}

Upvotes: 0

MrTJ
MrTJ

Reputation: 13202

As pointed out by Simon, there are security issues storing usernames and passwords in NSUserDefaults. If you still want to do it however, it is quite simple.

NSUserDefaults is really not much more then a plist so you can store arbitrary complex structures created from NSArray and NSDictionary in NSUserDefaults. So you can do something like:

NSArray<NSDictionary*>* accounts = @[@{
    @"username" : @"firstUsername",
    @"password" : @"firstPassword"
}, @{
    @"username" : @"secondUsername",
    "password" : @"secondPassword"
}];
[[NSUserDefaults standardUserDefaults] setObject: accounts forKey:@"accounts"];

Note that you can't change one account only; if you need to change or add a new account, you should read the whole structure, convert the array and the dictionaries to mutable variants, and re-write it to the defaults all together.

UPDATE

NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
NSMutableArray* mutableAccounts = [[defaults objectForKey:@"accounts"] mutableCopy];
// Add or remove accounts:
[mutableAccounts addObject:@{ @"username" : @"newAccount", @"password" : @"newPassword" }];
[mutableAccounts removeObjectAtIndex:0];
[defaults setObject:mutableAccounts forKey:@"accounts"];

Upvotes: 1

Related Questions