Delete All Prefs / Core Data - iphone

I want to create a button in my application that will delete all entries in core data as well as all of the NSUserDefaults. What method would I use to do this?

This method:
[[NSUserDefaults standardUserDefaults] setPersistentDomain:[NSDictionary dictionary] forName:[[NSBundle mainBundle] bundleIdentifier]];
resets the defaults to the registration domain, which means that removeObjectForKey is called to all the keys. I found it from this link. Hope that helps!

Here's what I use for NSUserDefaults:
for (NSString* k in [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys])
[[NSUserDefaults standardUserDefaults] removeObjectForKey:k];

Related

Saving incremental int variable

I need to save a variable that increments every time a user hits a button within the app. I've been trying to do that with NSUserDefaults with no success. Here's the code I'm using:
[[NSUserDefaults standardUserDefaults] setInteger:i++ forKey:#"AppCount"];
When I output this in the log, however, I keep getting 0.
Any help would be greatly appreciated.
Try adding:
[[NSUserDefaults standardUserDefaults] synchronize];
After each time you change the value of your integer.
Quoting Apple's documentation on synchronize:
Writes any modifications to the persistent domains to disk and updates
all unmodified persistent domains to what is on disk.
http://developer.apple.com/library/ios/DOCUMENTATION/Cocoa/Reference/Foundation/Classes/NSUserDefaults_Class/Reference/Reference.html#//apple_ref/occ/instm/NSUserDefaults/synchronize
So with this modification, your final code should look like this:
[[NSUserDefaults standardUserDefaults] setInteger:i++ forKey:#"AppCount"];
[[NSUserDefaults standardUserDefaults] synchronize];
EDIT: Actually on second thought, give this a try:
I think the problem is using i++ assumes that the application will always be able to keep track of the count, and every time you re-enter the application i gets reset.
The following works, I just tested it.
if (![[NSUserDefaults standardUserDefaults] integerForKey:#"AppCount"]) {
[[NSUserDefaults standardUserDefaults] setInteger:i forKey:#"AppCount"];
}else{
[[NSUserDefaults standardUserDefaults] setInteger:[[NSUserDefaults standardUserDefaults] integerForKey:#"AppCount"] + 1 forKey:#"AppCount"];
}
[[NSUserDefaults standardUserDefaults] synchronize];
You can use Static NSUIInteger appCount=0;
in the function user taps increase it value appCount++;
that keeps the value in function calls within the app. after app closing you write it to file.
- (void)viewDidLoad {
[super viewDidLoad];
countFirst= [[NSUserDefaults standardUserDefaults]integerForKey:#"Counter"];
countFirst++;
}
Write this wherever you want to increment.
[[NSUserDefaults standardUserDefaults] setInteger:countFirst++ forKey:#"Counter"];

NSUserDefaults standardUserDefaults setObject: forKey: not working for Multivalue preference

I am trying to do following task
[[NSUserDefaults standardUserDefaults] setObject:#"Dry" forKey:#"vesselType_preference"];
[[NSUserDefaults standardUserDefaults] synchronize];
where my "vesselType_preference" is multivalue attribute, but it is not getting effected. Please help this is working for other type of attribute but not working for multivalue type.
Thanks
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if (![defaults objectForKey:#"vesselType_preference"])
{
[defaults setObject:#"Dry" forKey:#"vesselType_preference"];
}
[[NSUserDefaults standardUserDefaults] synchronize];
This should work.
NSUserDefaults can only handle objects of NSDictionary, NSData, NSArray, NSString and BOOL. (There might be another in there, not sure) If you need to store a multiple value object like an array or dictionary, I would store your settings there first, then save that to the defaults.
Your code looks fine for storing information to the user defaults. Just make sure you have your object type specified before saving. (id) will not work... or won't work properly.

How to save / Load NSUserDefaults for backup purposes?

Is this code correct to load and save NSUserDefaults.
// Load
NSDictionary *dict = [[NSUserDefaults standardUserDefaults]
dictionaryRepresentation];
// Save
NSDictionary *dict = ....
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults registerDefaults:dict];
[defaults synchronize]; << Not sure if this is needed
I'm using JSON to hold the dictionary contents and I'm having problems.
I'd just like to know if this code is correct, before I look elsewhere for my problem.
Your Load code will get you a dictionary of all the current default values.
[Note This will probably be much larger than you expect as Mac OS installs a raft of defaults, you might want to make it smaller. For example, you can limit the dictionary to just those defaults in your domain which differ from their registered default using:
NSDictionary *userDefaults = [[NSUserDefaults standardUserDefaults] persistentDomainForName:#"<your bundle identifier>"];
end note]
Your Save code probably doesn't do what you expect, it installs the values you are restoring as the defaults for those keys - so if you support "Restore to Default Settings", or something similar, then these are the values that would result. What you probably want to do it set the current value of the keys, this can be done with a simple loop:
NSDictionary *dict = ....
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
foreach(id key in dict)
[defaults setObject:[dict objectForKey:key] forKey:key];
The above code is only an outline, you may need to take care what preferences you save/restore and in what order - but all that depends on your application.
// Get
NSDictionary *dict = [[NSUserDefaults standardUserDefaults] objectForKey:#"myDictionary"];
// Set
NSDictionary *dict = ...
[[NSUserDefaults standardUserDefaults] setObject:dict forKey:#"myDictionary"];

Use NSUserDefaults to access a stored object

I want to access text saved through NSUserDefaults and display it in a label that has already been defined called "name". My code is below, but it doesn't work. What should I do? Thanks for your help!
name = [[NSUserDefaults standardUserDefaults] objectForKey:#"Name"];
should be:
name.text = [[NSUserDefaults standardUserDefaults] objectForKey:#"Name"];
First, you should register your defaults someway like this: (this is only necessary if you want to add multiple items!)
NSDictionary *defaultsDict =
[NSDictionary dictionaryWithObjectsAndKeys:#"MyName", #"defaultName", #"MyAge", #"defaultAge", nil];`
[[NSUserDefaults standardUserDefaults] registerDefaults:defaultsDict];
Now use this assuming you have a label pointer:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[label setText:[defaults stringForKey:#"defaultName"]];

How to check if NSUserDefaults exist

I have been looking for an answer but not really found what i am looking for.
I have an application and is using NSUserDefaults to store 'currentGameStatus' and would like to ask the following questions:
How do i check if the NSUserDefaults .plist exists? Need this to determine if i need to create it for the first time and if so fill it with default values
Where do i find it on my Mac (running simulator)? Would need to delete it to test if the first run works?
you don't check.
you register your defaults. and if you haven't saved a value the default will be used.
NSDictionary *defaultUserDefaults = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:NO], #"Foo",
#"Bar", #"Baz",
[NSNumber numberWithInteger:12], #"FooBar",
nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:defaultUserDefaults];
and you do this every time your app launches.
The way I do it is I set a BOOL flag in NSUserDefaults if it doesn't already exist:
if(![[NSUserDefaults standardUserDefaults] boolForKey:#"firstRun"]) {
//do initialization stuff here...
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:#"firstRun"];
}
NSUserDefaults already exists by default. You can add to it by [[NSUserDefaults standardUserDefaults] setObject:#"object" forKey:#"key"];
You can find the NSUserDefaults .plist here