There are 5 ways in which data data is stored in iOS programs:
XML attribute list (plist) archive
Preference (preference setting)
Nskeyedarchiver Archive (nscoding)
SQLite3
Core Data
Each iOS app has its own app sandbox (the app sandbox is the file system directory) and is isolated from other file systems. Apps must stay in their sandbox, other apps can't access the sandbox
Apply the sandbox's file system directory as shown (assuming that the app's name is called layer)
The root path of the emulator app sandbox is: (Apple is the user name, 7.0 is the emulator version)
/users/apple/library/application Support/iphone simulator/7.0/applications
Application Package : (layer in) contains all the resource files and executable files
Documents: Saves data that needs to be persisted when the app runs, and it backs up the directory when itunes synchronizes the device. For example, a game app can save a game archive in that directory
tmp: Saves the temporary data required to run the app, and then deletes the corresponding file from the directory when it is finished. When the app is not running, the system may also purge files in that directory. itunes does not back up this directory when syncing the device
library/caches: Saves data that needs to be persisted when the app runs, and itunes syncs the device without backing up the directory. Non-critical data with large storage volumes and no backup required
library/preference: Save all your app's preferences, and the iOS settings (settings) app will find the app's settings in that directory. This directory is backed up when itunes syncs the device
1.Documents
There are two common ways to get a sandboxed catalog
The first method:
Stitching the "Documents" string with the sandbox root
Sandbox root directory : nsstring *home = nshomedirectory();
NSString *documents = [Home stringbyappendingpathcomponent: @ "documents"];
Not recommended because a new version of the operating system may modify the directory name
The second method:
Using the Nssearchpathfordirectoriesindomains function
Nsuserdomainmask representative from the user folder to find
YES represents the wavy character "~" in the expanded path
Nsarray *array = Nssearchpathfordirectoriesindomains (NSDocumentDirectory, Nsuserdomainmask, NO);
In iOS, only one directory matches the parameters passed in, so there is only one element in the collection
NSString *documents = [array objectatindex:0];
2,library/caches
tmp: nsstring *tmp = nstemporarydirectory();
library/caches: (2 ways similar to documents)
Stitching the "Caches" string with the sandbox root
Use the Nssearchpathfordirectoriesindomains function (change the function's 1th parameter to: nscachesdirectory)
3, Library/preference
library/preference: Access to Settings information in this directory through the Nsuserdefaults class
The attribute list is an XML-formatted file that expands to the name plist
If the object is NSString, Nsdictionary, Nsarray, NSData, NSNumber, and so on, you can use the writetofile:atomically: method to write the object directly to the property list file
4.
Archive a Nsdictionary object to a list of plist properties
Encapsulate data into a dictionary
Nsmutabledictionary *dict = [Nsmutabledictionary dictionary];
[Dict setobject:@ "hen" forkey:@ "name"];
[Dict setobject:@ "15013141314" forkey:@ "phone"];
[Dict setobject:@ "forkey:@" "Age"];
Persisting a dictionary to a documents/stu.plist file
[Dict Writetofile:path Atomically:yes];
Successfully written to the documents directory
Read the property list and restore the Nsdictionary object
Reads the contents of the documents/stu.plist, instantiates the Nsdictionary
5.
Many iOS apps support preferences such as saving usernames, passwords, font size, and more, and iOS offers a standard set of solutions to add preferences to your app
Each app has a Nsuserdefaults instance that accesses preferences
For example, save the user name, the font size, whether to log on automatically
nsuserdefaults *defaults = [nsuserdefaults standarduserdefaults];
[Defaults setobject: @ "itcast" forkey:@ "username"];
[Defaults setfloat: 18.0f forkey:@ "Text_size"];
[Defaults setbool: YES forkey:@ "Auto_login"];
Read the Last saved settings
Nsuserdefaults *defaults = [Nsuserdefaults standarduserdefaults];
NSString *username = [Defaults stringforkey: @ "username"];
float textSize = [Defaults floatforkey: @ "Text_size"];
BOOL autologin = [Defaults boolforkey: @ "Auto_login"];
Note: When setting the data, Userdefaults does not write immediately, but instead writes the cached data to the local disk according to the timestamp. So after calling the set method, it is possible that the data has not yet been written to the disk application to terminate. The above problem can be forced by calling the Synchornize method to write
[Defaults synchornize];
6.
If the object is NSString, Nsdictionary, Nsarray, NSData, NSNumber and other types, you can archive and restore directly with Nskeyedarchiver
Not all objects can be archived directly in this way, only objects that comply with the Nscoding protocol can
There are 2 ways to nscoding a protocol:
Encodewithcoder:
This method is called every time the object is archived. In this method, you typically specify how to archive each instance variable in an object, and you can use the Encodeobject:forkey: method to archive instance variables
Initwithcoder:
This method is called every time the object is recovered (decoded) from the file. In this method, you typically specify how to decode the data in a file as an instance variable of an object, and you can use the Decodeobject:forkey method to decode the instance variable
Archive a Nsarray object to Documents/array.archive
Nsarray *array = [Nsarray arraywithobjects:@ "a", @ "B", nil];
[nskeyedarchiver archiverootobject: Array tofile:p Ath];
Recovering (decoding) Nsarray objects
Nsarray *array = [nskeyedunarchiver unarchiveobjectwithfile:p Ath];
Archive an object to documents
@interfacePerson:nsobject<nscoding>@property (nonatomic, copy) NSString*Name: @property (nonatomic, assign)intAge ; @property (nonatomic, assign)floatheight;@endimplementation Person- (void) Encodewithcoder: (Nscoder *) Encoder {[Encoder encodeObject:self.name Forkey:@"name"]; [Encoder encodeInt:self.age Forkey:@" Age"]; [Encoder encodeFloat:self.height Forkey:@"Height"];}- (ID) Initwithcoder: (Nscoder *) Decoder {self.name= [Decoder Decodeobjectforkey:@"name"]; Self.age= [Decoder Decodeintforkey:@" Age"]; Self.height= [Decoder Decodefloatforkey:@"Height"]; returnSelf ;}- (void) Dealloc {[Super Dealloc]; [_name release];}@end
Archive (encode)
Person *person = [[[Person alloc] init] autorelease];
Person.name = @ "GL";
Person.age = 27;
Person.height = 1.83f;
[Nskeyedarchiver Archiverootobject:person Tofile:path];
Recovery (decoding)
Person *person = [Nskeyedunarchiver Unarchiveobjectwithfile:path];
If the parent class also complies with the Nscoding protocol, please note that:
Should add a sentence to the Encodewithcoder: method
[Super Encodewithcode:encode];
Ensure that inherited instance variables can also be encoded, which can also be archived
Should add a sentence to the Initwithcoder: method
self = [super Initwithcoder:decoder];
Ensure that inherited instance variables can also be decoded, which can also be restored