IOS 数据存储
2012-06-07 20:46
381 查看
ios数据存储包括以下几种存储机制:
属性列表
对象归档
SQLite3
CoreData
AppSettings
普通文件存储
1、属性列表
[cpp]
view plaincopyprint?
//
// Persistence1ViewController.h
// Persistence1
//
// Created by liu lavy on 11-10-3.
// Copyright 2011 __MyCompanyName__. All rights reserved.
//
#import <UIKit/UIKit.h>
#define kFilename @"data.plist"
@interface Persistence1ViewController : UIViewController {
UITextField *filed1;
UITextField *field2;
UITextField *field3;
UITextField *field4;
}
@property (nonatomic, retain) IBOutlet UITextField *field1;
@property (nonatomic, retain) IBOutlet UITextField *field2;
@property (nonatomic, retain) IBOutlet UITextField *field3;
@property (nonatomic, retain) IBOutlet UITextField *field4;
- (NSString *)dataFilePath;
- (void)applicationWillResignActive:(NSNotification *)notification;
@end
===================================================================================
===================================================================================
2、对象归档
[cpp]
view plaincopyprint?
//
// Fourlines.h
// Persistence2
//
// Created by liu lavy on 11-10-3.
// Copyright 2011 __MyCompanyName__. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Fourlines : NSObject <NSCoding, NSCopying> {
NSString *field1;
NSString *field2;
NSString *field3;
NSString *field4;
}
@property (nonatomic, retain) NSString *field1;
@property (nonatomic, retain) NSString *field2;
@property (nonatomic, retain) NSString *field3;
@property (nonatomic, retain) NSString *field4;
@end
[cpp]
view plaincopyprint?
//
// Persistence2ViewController.h
// Persistence2
//
// Created by liu lavy on 11-10-3.
// Copyright 2011 __MyCompanyName__. All rights reserved.
//
#import <UIKit/UIKit.h>
#define kFilename @"archive"
#define kDataKey @"Data"
@interface Persistence2ViewController : UIViewController {
UITextField *filed1;
UITextField *field2;
UITextField *field3;
UITextField *field4;
}
@property (nonatomic, retain) IBOutlet UITextField *field1;
@property (nonatomic, retain) IBOutlet UITextField *field2;
@property (nonatomic, retain) IBOutlet UITextField *field3;
@property (nonatomic, retain) IBOutlet UITextField *field4;
- (NSString *)dataFilePath;
- (void)applicationWillResignActive:(NSNotification *)notification;
@end
===================================================================================
===================================================================================
3、SQLite
[cpp]
view plaincopyprint?
//
// Persistence3ViewController.h
// Persistence3
//
// Created by liu lavy on 11-10-3.
// Copyright 2011 __MyCompanyName__. All rights reserved.
//
#import <UIKit/UIKit.h>
#define kFilename @"data.sqlite3"
@interface Persistence3ViewController : UIViewController {
UITextField *filed1;
UITextField *field2;
UITextField *field3;
UITextField *field4;
}
@property (nonatomic, retain) IBOutlet UITextField *field1;
@property (nonatomic, retain) IBOutlet UITextField *field2;
@property (nonatomic, retain) IBOutlet UITextField *field3;
@property (nonatomic, retain) IBOutlet UITextField *field4;
- (NSString *)dataFilePath;
- (void)applicationWillResignActive:(NSNotification *)notification;
@end
===================================================================================
===================================================================================
4、Core Data
[cpp]
view plaincopyprint?
//
// PersistenceViewController.h
// Persistence4
//
// Created by liu lavy on 11-10-3.
// Copyright 2011 __MyCompanyName__. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface PersistenceViewController : UIViewController {
UITextField *filed1;
UITextField *field2;
UITextField *field3;
UITextField *field4;
}
@property (nonatomic, retain) IBOutlet UITextField *field1;
@property (nonatomic, retain) IBOutlet UITextField *field2;
@property (nonatomic, retain) IBOutlet UITextField *field3;
@property (nonatomic, retain) IBOutlet UITextField *field4;
@end
5、AppSettings
[cpp]
view plaincopyprint?
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
===================================================================================
===================================================================================
6、普通文件存储
这种方式即自己将数据通过IO保存到文件,或从文件读取。
声明:此篇所有代码来自《Iphone4与IPad开发基础教程》
属性列表
对象归档
SQLite3
CoreData
AppSettings
普通文件存储
1、属性列表
[cpp]
view plaincopyprint?
//
// Persistence1ViewController.h
// Persistence1
//
// Created by liu lavy on 11-10-3.
// Copyright 2011 __MyCompanyName__. All rights reserved.
//
#import <UIKit/UIKit.h>
#define kFilename @"data.plist"
@interface Persistence1ViewController : UIViewController {
UITextField *filed1;
UITextField *field2;
UITextField *field3;
UITextField *field4;
}
@property (nonatomic, retain) IBOutlet UITextField *field1;
@property (nonatomic, retain) IBOutlet UITextField *field2;
@property (nonatomic, retain) IBOutlet UITextField *field3;
@property (nonatomic, retain) IBOutlet UITextField *field4;
- (NSString *)dataFilePath;
- (void)applicationWillResignActive:(NSNotification *)notification;
@end
[cpp] view plaincopyprint? // // Persistence1ViewController.m // Persistence1 // // Created by liu lavy on 11-10-3. // Copyright 2011 __MyCompanyName__. All rights reserved. // #import "Persistence1ViewController.h" @implementation Persistence1ViewController @synthesize field1; @synthesize field2; @synthesize field3; @synthesize field4; //数据文件的完整路径 - (NSString *)dataFilePath { //检索Documents目录路径。第二个参数表示将搜索限制在我们的应用程序沙盒中 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); //每个应用程序只有一个Documents目录 NSString *documentsDirectory = [paths objectAtIndex:0]; //创建文件名 return [documentsDirectory stringByAppendingPathComponent:kFilename]; } //应用程序退出时,将数据保存到属性列表文件 - (void)applicationWillResignActive:(NSNotification *)notification { NSMutableArray *array = [[NSMutableArray alloc] init]; [array addObject: field1.text]; [array addObject: field2.text]; [array addObject: field3.text]; [array addObject: field4.text]; [array writeToFile:[self dataFilePath] atomically:YES]; [array release]; } /* // The designated initializer. Override to perform setup that is required before the view is loaded. - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization } return self; } */ /* // Implement loadView to create a view hierarchy programmatically, without using a nib. - (void)loadView { } */ // Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad { [super viewDidLoad]; NSString *filePath = [self dataFilePath]; //检查数据文件是否存在 if([[NSFileManager defaultManager] fileExistsAtPath:filePath]) { NSArray *array = [[NSArray alloc] initWithContentsOfFile:filePath]; field1.text = [array objectAtIndex:0]; field2.text = [array objectAtIndex:1]; field3.text = [array objectAtIndex:2]; field4.text = [array objectAtIndex:3]; [array release]; } UIApplication *app = [UIApplication sharedApplication]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillResignActive:) name:UIApplicationWillResignActiveNotification object:app]; [super viewDidLoad]; } /* // Override to allow orientations other than the default portrait orientation. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations return (interfaceOrientation == UIInterfaceOrientationPortrait); } */ - (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren't in use. } - (void)viewDidUnload { self.field1 = nil; self.field2 = nil; self.field3 = nil; self.field4 = nil; [super viewDidUnload]; } - (void)dealloc { [field1 release]; [field2 release]; [field3 release]; [field4 release]; [super dealloc]; } @end // // Persistence1ViewController.m // Persistence1 // // Created by liu lavy on 11-10-3. // Copyright 2011 __MyCompanyName__. All rights reserved. // #import "Persistence1ViewController.h" @implementation Persistence1ViewController @synthesize field1; @synthesize field2; @synthesize field3; @synthesize field4; //数据文件的完整路径 - (NSString *)dataFilePath { //检索Documents目录路径。第二个参数表示将搜索限制在我们的应用程序沙盒中 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); //每个应用程序只有一个Documents目录 NSString *documentsDirectory = [paths objectAtIndex:0]; //创建文件名 return [documentsDirectory stringByAppendingPathComponent:kFilename]; } //应用程序退出时,将数据保存到属性列表文件 - (void)applicationWillResignActive:(NSNotification *)notification { NSMutableArray *array = [[NSMutableArray alloc] init]; [array addObject: field1.text]; [array addObject: field2.text]; [array addObject: field3.text]; [array addObject: field4.text]; [array writeToFile:[self dataFilePath] atomically:YES]; [array release]; } /* // The designated initializer. Override to perform setup that is required before the view is loaded. - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization } return self; } */ /* // Implement loadView to create a view hierarchy programmatically, without using a nib. - (void)loadView { } */ // Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad { [super viewDidLoad]; NSString *filePath = [self dataFilePath]; //检查数据文件是否存在 if([[NSFileManager defaultManager] fileExistsAtPath:filePath]) { NSArray *array = [[NSArray alloc] initWithContentsOfFile:filePath]; field1.text = [array objectAtIndex:0]; field2.text = [array objectAtIndex:1]; field3.text = [array objectAtIndex:2]; field4.text = [array objectAtIndex:3]; [array release]; } UIApplication *app = [UIApplication sharedApplication]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillResignActive:) name:UIApplicationWillResignActiveNotification object:app]; [super viewDidLoad]; } /* // Override to allow orientations other than the default portrait orientation. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations return (interfaceOrientation == UIInterfaceOrientationPortrait); } */ - (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren't in use. } - (void)viewDidUnload { self.field1 = nil; self.field2 = nil; self.field3 = nil; self.field4 = nil; [super viewDidUnload]; } - (void)dealloc { [field1 release]; [field2 release]; [field3 release]; [field4 release]; [super dealloc]; } @end
===================================================================================
===================================================================================
2、对象归档
[cpp]
view plaincopyprint?
//
// Fourlines.h
// Persistence2
//
// Created by liu lavy on 11-10-3.
// Copyright 2011 __MyCompanyName__. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Fourlines : NSObject <NSCoding, NSCopying> {
NSString *field1;
NSString *field2;
NSString *field3;
NSString *field4;
}
@property (nonatomic, retain) NSString *field1;
@property (nonatomic, retain) NSString *field2;
@property (nonatomic, retain) NSString *field3;
@property (nonatomic, retain) NSString *field4;
@end
[cpp] view plaincopyprint? // // Fourlines.m // Persistence2 // // Created by liu lavy on 11-10-3. // Copyright 2011 __MyCompanyName__. All rights reserved. // #import "Fourlines.h" #define kField1Key @"Field1" #define kField2Key @"Field2" #define kField3Key @"Field3" #define kField4Key @"Field4" @implementation Fourlines @synthesize field1; @synthesize field2; @synthesize field3; @synthesize field4; #pragma mark NSCoding - (void)encodeWithCoder:(NSCoder *)aCoder { [aCoder encodeObject:field1 forKey:kField1Key]; [aCoder encodeObject:field2 forKey:kField2Key]; [aCoder encodeObject:field3 forKey:kField3Key]; [aCoder encodeObject:field4 forKey:kField4Key]; } -(id) initWithCoder:(NSCoder *)aDecoder { if(self = [super init]) { field1 = [[aDecoder decodeObjectForKey:kField1Key] retain]; field2 = [[aDecoder decodeObjectForKey:kField2Key] retain]; field3 = [[aDecoder decodeObjectForKey:kField3Key] retain]; field4 = [[aDecoder decodeObjectForKey:kField4Key] retain]; } return self; } #pragma mark - #pragma mark NSCopying - (id) copyWithZone:(NSZone *)zone { Fourlines *copy = [[[self class] allocWithZone: zone] init]; copy.field1 = [[self.field1 copyWithZone: zone] autorelease]; copy.field2 = [[self.field2 copyWithZone: zone] autorelease]; copy.field3 = [[self.field3 copyWithZone: zone] autorelease]; copy.field4 = [[self.field4 copyWithZone: zone] autorelease]; return copy; } @end // // Fourlines.m // Persistence2 // // Created by liu lavy on 11-10-3. // Copyright 2011 __MyCompanyName__. All rights reserved. // #import "Fourlines.h" #define kField1Key @"Field1" #define kField2Key @"Field2" #define kField3Key @"Field3" #define kField4Key @"Field4" @implementation Fourlines @synthesize field1; @synthesize field2; @synthesize field3; @synthesize field4; #pragma mark NSCoding - (void)encodeWithCoder:(NSCoder *)aCoder { [aCoder encodeObject:field1 forKey:kField1Key]; [aCoder encodeObject:field2 forKey:kField2Key]; [aCoder encodeObject:field3 forKey:kField3Key]; [aCoder encodeObject:field4 forKey:kField4Key]; } -(id) initWithCoder:(NSCoder *)aDecoder { if(self = [super init]) { field1 = [[aDecoder decodeObjectForKey:kField1Key] retain]; field2 = [[aDecoder decodeObjectForKey:kField2Key] retain]; field3 = [[aDecoder decodeObjectForKey:kField3Key] retain]; field4 = [[aDecoder decodeObjectForKey:kField4Key] retain]; } return self; } #pragma mark - #pragma mark NSCopying - (id) copyWithZone:(NSZone *)zone { Fourlines *copy = [[[self class] allocWithZone: zone] init]; copy.field1 = [[self.field1 copyWithZone: zone] autorelease]; copy.field2 = [[self.field2 copyWithZone: zone] autorelease]; copy.field3 = [[self.field3 copyWithZone: zone] autorelease]; copy.field4 = [[self.field4 copyWithZone: zone] autorelease]; return copy; } @end
[cpp]
view plaincopyprint?
//
// Persistence2ViewController.h
// Persistence2
//
// Created by liu lavy on 11-10-3.
// Copyright 2011 __MyCompanyName__. All rights reserved.
//
#import <UIKit/UIKit.h>
#define kFilename @"archive"
#define kDataKey @"Data"
@interface Persistence2ViewController : UIViewController {
UITextField *filed1;
UITextField *field2;
UITextField *field3;
UITextField *field4;
}
@property (nonatomic, retain) IBOutlet UITextField *field1;
@property (nonatomic, retain) IBOutlet UITextField *field2;
@property (nonatomic, retain) IBOutlet UITextField *field3;
@property (nonatomic, retain) IBOutlet UITextField *field4;
- (NSString *)dataFilePath;
- (void)applicationWillResignActive:(NSNotification *)notification;
@end
[cpp] view plaincopyprint? // // Persistence2ViewController.m // Persistence2 // // Created by liu lavy on 11-10-3. // Copyright 2011 __MyCompanyName__. All rights reserved. // #import "Persistence2ViewController.h" #import "Fourlines.h" @implementation Persistence2ViewController @synthesize field1; @synthesize field2; @synthesize field3; @synthesize field4; //数据文件的完整路径 - (NSString *)dataFilePath { //检索Documents目录路径。第二个参数表示将搜索限制在我们的应用程序沙盒中 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); //每个应用程序只有一个Documents目录 NSString *documentsDirectory = [paths objectAtIndex:0]; //创建文件名 return [documentsDirectory stringByAppendingPathComponent:kFilename]; } //应用程序退出时,将数据保存到属性列表文件 - (void)applicationWillResignActive:(NSNotification *)notification { Fourlines *fourlines = [[Fourlines alloc] init]; fourlines.field1 = field1.text; fourlines.field2 = field2.text; fourlines.field3 = field3.text; fourlines.field4 = field4.text; NSMutableData *data = [[NSMutableData alloc] init];//用于存储编码的数据 NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; [archiver encodeObject:fourlines forKey:kDataKey]; [archiver finishEncoding]; [data writeToFile:[self dataFilePath] atomically:YES]; [fourlines release]; [archiver release]; [data release]; } /* // The designated initializer. Override to perform setup that is required before the view is loaded. - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization } return self; } */ /* // Implement loadView to create a view hierarchy programmatically, without using a nib. - (void)loadView { } */ // Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad { [super viewDidLoad]; NSString *filePath = [self dataFilePath]; //检查数据文件是否存在 if([[NSFileManager defaultManager] fileExistsAtPath:filePath]) { //从文件获取用于解码的数据 NSData *data = [[NSMutableData alloc] initWithContentsOfFile:[self dataFilePath]]; NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; Fourlines *fourlines = [unarchiver decodeObjectForKey:kDataKey]; [unarchiver finishDecoding]; field1.text = fourlines.field1; field2.text = fourlines.field2; field3.text = fourlines.field3; field4.text = fourlines.field4; [unarchiver release]; [data release]; } UIApplication *app = [UIApplication sharedApplication]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillResignActive:) name:UIApplicationWillResignActiveNotification object:app]; [super viewDidLoad]; } /* // Override to allow orientations other than the default portrait orientation. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations return (interfaceOrientation == UIInterfaceOrientationPortrait); } */ - (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren't in use. } - (void)viewDidUnload { self.field1 = nil; self.field2 = nil; self.field3 = nil; self.field4 = nil; [super viewDidUnload]; } - (void)dealloc { [field1 release]; [field2 release]; [field3 release]; [field4 release]; [super dealloc]; } @end // // Persistence2ViewController.m // Persistence2 // // Created by liu lavy on 11-10-3. // Copyright 2011 __MyCompanyName__. All rights reserved. // #import "Persistence2ViewController.h" #import "Fourlines.h" @implementation Persistence2ViewController @synthesize field1; @synthesize field2; @synthesize field3; @synthesize field4; //数据文件的完整路径 - (NSString *)dataFilePath { //检索Documents目录路径。第二个参数表示将搜索限制在我们的应用程序沙盒中 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); //每个应用程序只有一个Documents目录 NSString *documentsDirectory = [paths objectAtIndex:0]; //创建文件名 return [documentsDirectory stringByAppendingPathComponent:kFilename]; } //应用程序退出时,将数据保存到属性列表文件 - (void)applicationWillResignActive:(NSNotification *)notification { Fourlines *fourlines = [[Fourlines alloc] init]; fourlines.field1 = field1.text; fourlines.field2 = field2.text; fourlines.field3 = field3.text; fourlines.field4 = field4.text; NSMutableData *data = [[NSMutableData alloc] init];//用于存储编码的数据 NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; [archiver encodeObject:fourlines forKey:kDataKey]; [archiver finishEncoding]; [data writeToFile:[self dataFilePath] atomically:YES]; [fourlines release]; [archiver release]; [data release]; } /* // The designated initializer. Override to perform setup that is required before the view is loaded. - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization } return self; } */ /* // Implement loadView to create a view hierarchy programmatically, without using a nib. - (void)loadView { } */ // Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad { [super viewDidLoad]; NSString *filePath = [self dataFilePath]; //检查数据文件是否存在 if([[NSFileManager defaultManager] fileExistsAtPath:filePath]) { //从文件获取用于解码的数据 NSData *data = [[NSMutableData alloc] initWithContentsOfFile:[self dataFilePath]]; NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; Fourlines *fourlines = [unarchiver decodeObjectForKey:kDataKey]; [unarchiver finishDecoding]; field1.text = fourlines.field1; field2.text = fourlines.field2; field3.text = fourlines.field3; field4.text = fourlines.field4; [unarchiver release]; [data release]; } UIApplication *app = [UIApplication sharedApplication]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillResignActive:) name:UIApplicationWillResignActiveNotification object:app]; [super viewDidLoad]; } /* // Override to allow orientations other than the default portrait orientation. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations return (interfaceOrientation == UIInterfaceOrientationPortrait); } */ - (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren't in use. } - (void)viewDidUnload { self.field1 = nil; self.field2 = nil; self.field3 = nil; self.field4 = nil; [super viewDidUnload]; } - (void)dealloc { [field1 release]; [field2 release]; [field3 release]; [field4 release]; [super dealloc]; } @end
===================================================================================
===================================================================================
3、SQLite
[cpp]
view plaincopyprint?
//
// Persistence3ViewController.h
// Persistence3
//
// Created by liu lavy on 11-10-3.
// Copyright 2011 __MyCompanyName__. All rights reserved.
//
#import <UIKit/UIKit.h>
#define kFilename @"data.sqlite3"
@interface Persistence3ViewController : UIViewController {
UITextField *filed1;
UITextField *field2;
UITextField *field3;
UITextField *field4;
}
@property (nonatomic, retain) IBOutlet UITextField *field1;
@property (nonatomic, retain) IBOutlet UITextField *field2;
@property (nonatomic, retain) IBOutlet UITextField *field3;
@property (nonatomic, retain) IBOutlet UITextField *field4;
- (NSString *)dataFilePath;
- (void)applicationWillResignActive:(NSNotification *)notification;
@end
[cpp] view plaincopyprint? // // Persistence3ViewController.m // Persistence3 // // Created by liu lavy on 11-10-3. // Copyright 2011 __MyCompanyName__. All rights reserved. // #import "Persistence3ViewController.h" #import <sqlite3.h> @implementation Persistence3ViewController @synthesize field1; @synthesize field2; @synthesize field3; @synthesize field4; //数据文件的完整路径 - (NSString *)dataFilePath { //检索Documents目录路径。第二个参数表示将搜索限制在我们的应用程序沙盒中 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); //每个应用程序只有一个Documents目录 NSString *documentsDirectory = [paths objectAtIndex:0]; //创建文件名 return [documentsDirectory stringByAppendingPathComponent:kFilename]; } //应用程序退出时,将数据保存到属性列表文件 - (void)applicationWillResignActive:(NSNotification *)notification { sqlite3 *database; if(sqlite3_open([[self dataFilePath] UTF8String], &database) != SQLITE_OK) { sqlite3_close(database); NSAssert(0, @"Failed to open database"); } for(int i = 1; i <= 4; i++) { NSString *fieldname = [[NSString alloc] initWithFormat:@"field%d", i]; UITextField *field = [self valueForKey:fieldname]; [fieldname release]; char *update = "INSERT OR REPLACE INTO FIELDS (ROW, FIELD_DATA) VALUES (?, ?);"; sqlite3_stmt *stmt; //将SQL语句编译为sqlite内部一个结构体(sqlite3_stmt),类似java JDBC的PreparedStatement预编译 if (sqlite3_prepare_v2(database, update, -1, &stmt, nil) == SQLITE_OK) { //在bind参数的时候,参数列表的index从1开始,而取出数据的时候,列的index是从0开始 sqlite3_bind_int(stmt, 1, i); sqlite3_bind_text(stmt, 2, [field.text UTF8String], -1, NULL); } else { NSAssert(0, @"Error:Failed to prepare statemen"); } //执行SQL文,获取结果 int result = sqlite3_step(stmt); if(result != SQLITE_DONE) { NSAssert1(0, @"Error updating table: %d", result); } //释放stmt占用的内存(sqlite3_prepare_v2()分配的) sqlite3_finalize(stmt); } sqlite3_close(database); } /* // The designated initializer. Override to perform setup that is required before the view is loaded. - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization } return self; } */ /* // Implement loadView to create a view hierarchy programmatically, without using a nib. - (void)loadView { } */ // Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad { [super viewDidLoad]; NSString *filePath = [self dataFilePath]; //检查数据文件是否存在 if([[NSFileManager defaultManager] fileExistsAtPath:filePath]) { //打开数据库 sqlite3 *database; if(sqlite3_open([filePath UTF8String], &database) != SQLITE_OK) { sqlite3_close(database); NSAssert(0, @"Failed to open database"); } //创建表 char *errorMsg; NSString *createSQL = @"CREATE TABLE IF NOT EXISTS FIELDS (ROW INTEGER PRIMARY KEY, FIELD_DATA TEXT);"; if(sqlite3_exec(database, [createSQL UTF8String], NULL, NULL, &errorMsg) != SQLITE_OK) { sqlite3_close(database); NSAssert(0, @"Error creating table: %s", errorMsg); } //查询 NSString *query = @"SELECT ROW, FIELD_DATA FROM FIELDS ORDER BY ROW"; sqlite3_stmt *statement; //设置nByte可以加速操作 if(sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) == SQLITE_OK) { while (sqlite3_step(statement) == SQLITE_ROW) {//返回每一行 int row = sqlite3_column_int(statement, 0); char *rowData = (char *)sqlite3_column_text(statement, 1); NSString *fieldName = [[NSString alloc] initWithFormat:@"field%d", row]; NSString *fieldValue = [[NSString alloc] initWithUTF8String:rowData]; UITextField *field = [self valueForKey:fieldName]; field.text = fieldValue; [fieldName release]; [fieldValue release]; } //释放statement占用的内存(sqlite3_prepare()分配的) sqlite3_finalize(statement); } sqlite3_close(database); } UIApplication *app = [UIApplication sharedApplication]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillResignActive:) name:UIApplicationWillResignActiveNotification object:app]; [super viewDidLoad]; } /* // Override to allow orientations other than the default portrait orientation. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations return (interfaceOrientation == UIInterfaceOrientationPortrait); } */ - (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren't in use. } - (void)viewDidUnload { self.field1 = nil; self.field2 = nil; self.field3 = nil; self.field4 = nil; [super viewDidUnload]; } - (void)dealloc { [field1 release]; [field2 release]; [field3 release]; [field4 release]; [super dealloc]; } @end // // Persistence3ViewController.m // Persistence3 // // Created by liu lavy on 11-10-3. // Copyright 2011 __MyCompanyName__. All rights reserved. // #import "Persistence3ViewController.h" #import <sqlite3.h> @implementation Persistence3ViewController @synthesize field1; @synthesize field2; @synthesize field3; @synthesize field4; //数据文件的完整路径 - (NSString *)dataFilePath { //检索Documents目录路径。第二个参数表示将搜索限制在我们的应用程序沙盒中 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); //每个应用程序只有一个Documents目录 NSString *documentsDirectory = [paths objectAtIndex:0]; //创建文件名 return [documentsDirectory stringByAppendingPathComponent:kFilename]; } //应用程序退出时,将数据保存到属性列表文件 - (void)applicationWillResignActive:(NSNotification *)notification { sqlite3 *database; if(sqlite3_open([[self dataFilePath] UTF8String], &database) != SQLITE_OK) { sqlite3_close(database); NSAssert(0, @"Failed to open database"); } for(int i = 1; i <= 4; i++) { NSString *fieldname = [[NSString alloc] initWithFormat:@"field%d", i]; UITextField *field = [self valueForKey:fieldname]; [fieldname release]; char *update = "INSERT OR REPLACE INTO FIELDS (ROW, FIELD_DATA) VALUES (?, ?);"; sqlite3_stmt *stmt; //将SQL语句编译为sqlite内部一个结构体(sqlite3_stmt),类似java JDBC的PreparedStatement预编译 if (sqlite3_prepare_v2(database, update, -1, &stmt, nil) == SQLITE_OK) { //在bind参数的时候,参数列表的index从1开始,而取出数据的时候,列的index是从0开始 sqlite3_bind_int(stmt, 1, i); sqlite3_bind_text(stmt, 2, [field.text UTF8String], -1, NULL); } else { NSAssert(0, @"Error:Failed to prepare statemen"); } //执行SQL文,获取结果 int result = sqlite3_step(stmt); if(result != SQLITE_DONE) { NSAssert1(0, @"Error updating table: %d", result); } //释放stmt占用的内存(sqlite3_prepare_v2()分配的) sqlite3_finalize(stmt); } sqlite3_close(database); } /* // The designated initializer. Override to perform setup that is required before the view is loaded. - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization } return self; } */ /* // Implement loadView to create a view hierarchy programmatically, without using a nib. - (void)loadView { } */ // Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad { [super viewDidLoad]; NSString *filePath = [self dataFilePath]; //检查数据文件是否存在 if([[NSFileManager defaultManager] fileExistsAtPath:filePath]) { //打开数据库 sqlite3 *database; if(sqlite3_open([filePath UTF8String], &database) != SQLITE_OK) { sqlite3_close(database); NSAssert(0, @"Failed to open database"); } //创建表 char *errorMsg; NSString *createSQL = @"CREATE TABLE IF NOT EXISTS FIELDS (ROW INTEGER PRIMARY KEY, FIELD_DATA TEXT);"; if(sqlite3_exec(database, [createSQL UTF8String], NULL, NULL, &errorMsg) != SQLITE_OK) { sqlite3_close(database); NSAssert(0, @"Error creating table: %s", errorMsg); } //查询 NSString *query = @"SELECT ROW, FIELD_DATA FROM FIELDS ORDER BY ROW"; sqlite3_stmt *statement; //设置nByte可以加速操作 if(sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) == SQLITE_OK) { while (sqlite3_step(statement) == SQLITE_ROW) {//返回每一行 int row = sqlite3_column_int(statement, 0); char *rowData = (char *)sqlite3_column_text(statement, 1); NSString *fieldName = [[NSString alloc] initWithFormat:@"field%d", row]; NSString *fieldValue = [[NSString alloc] initWithUTF8String:rowData]; UITextField *field = [self valueForKey:fieldName]; field.text = fieldValue; [fieldName release]; [fieldValue release]; } //释放statement占用的内存(sqlite3_prepare()分配的) sqlite3_finalize(statement); } sqlite3_close(database); } UIApplication *app = [UIApplication sharedApplication]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillResignActive:) name:UIApplicationWillResignActiveNotification object:app]; [super viewDidLoad]; } /* // Override to allow orientations other than the default portrait orientation. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations return (interfaceOrientation == UIInterfaceOrientationPortrait); } */ - (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren't in use. } - (void)viewDidUnload { self.field1 = nil; self.field2 = nil; self.field3 = nil; self.field4 = nil; [super viewDidUnload]; } - (void)dealloc { [field1 release]; [field2 release]; [field3 release]; [field4 release]; [super dealloc]; } @end
===================================================================================
===================================================================================
4、Core Data
[cpp]
view plaincopyprint?
//
// PersistenceViewController.h
// Persistence4
//
// Created by liu lavy on 11-10-3.
// Copyright 2011 __MyCompanyName__. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface PersistenceViewController : UIViewController {
UITextField *filed1;
UITextField *field2;
UITextField *field3;
UITextField *field4;
}
@property (nonatomic, retain) IBOutlet UITextField *field1;
@property (nonatomic, retain) IBOutlet UITextField *field2;
@property (nonatomic, retain) IBOutlet UITextField *field3;
@property (nonatomic, retain) IBOutlet UITextField *field4;
@end
[cpp] view plaincopyprint? // // PersistenceViewController.m // Persistence4 // // Created by liu lavy on 11-10-3. // Copyright 2011 __MyCompanyName__. All rights reserved. // #import "PersistenceViewController.h" #import "Persistence4AppDelegate.h" @implementation PersistenceViewController @synthesize field1; @synthesize field2; @synthesize field3; @synthesize field4; -(void) applicationWillResignActive:(NSNotification *)notification { Persistence4AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; NSManagedObjectContext *context = [appDelegate managedObjectContext]; NSError *error; for(int i = 1; i <= 4; i++) { NSString *fieldName = [NSString stringWithFormat:@"field%d", i]; UITextField *theField = [self valueForKey:fieldName]; //创建提取请求 NSFetchRequest *request = [[NSFetchRequest alloc] init]; //创建实体描述并关联到请求 NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Line" inManagedObjectContext:context]; [request setEntity:entityDescription]; //设置检索数据的条件 NSPredicate *pred = [NSPredicate predicateWithFormat:@"(lineNum = %d)", i]; [request setPredicate:pred]; NSManagedObject *theLine = nil; ////检查是否返回了标准匹配的对象,如果有则加载它,如果没有则创建一个新的托管对象来保存此字段的文本 NSArray *objects = [context executeFetchRequest:request error:&error]; if(!objects) { NSLog(@"There was an error"); } //if(objects.count > 0) { // theLine = [objects objectAtIndex:0]; //} else { //创建一个新的托管对象来保存此字段的文本 theLine = [NSEntityDescription insertNewObjectForEntityForName:@"Line" inManagedObjectContext:context]; [theLine setValue:[NSNumber numberWithInt:i] forKey:@"lineNum"]; [theLine setValue:theField.text forKey:@"lineText"]; //} [request release]; } //通知上下文保存更改 [context save:&error]; } // The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad. /* - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization. } return self; } */ // Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad { Persistence4AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; NSManagedObjectContext *context = [appDelegate managedObjectContext]; //创建一个实体描述 NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Line" inManagedObjectContext:context]; //创建一个请求,用于提取对象 NSFetchRequest *request = [[NSFetchRequest alloc] init]; [request setEntity:entityDescription]; //检索对象 NSError *error; NSArray *objects = [context executeFetchRequest:request error:&error]; if(!objects) { NSLog(@"There was an error!"); } for(NSManagedObject *obj in objects) { NSNumber *lineNum = [obj valueForKey:@"lineNum"]; NSString *lineText = [obj valueForKey:@"lineText"]; NSString *fieldName = [NSString stringWithFormat:@"field%d", [lineNum integerValue]]; UITextField *textField = [self valueForKey:fieldName]; textField.text = lineText; } [request release]; UIApplication *app = [UIApplication sharedApplication]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillResignActive:) name:UIApplicationWillResignActiveNotification object:app]; [super viewDidLoad]; } /* // Override to allow orientations other than the default portrait orientation. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations. return (interfaceOrientation == UIInterfaceOrientationPortrait); } */ - (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; // Release any cached data, images, etc. that aren't in use. } - (void)viewDidUnload { self.field1 = nil; self.field2 = nil; self.field3 = nil; self.field4 = nil; [super viewDidUnload]; } - (void)dealloc { [field1 release]; [field2 release]; [field3 release]; [field4 release]; [super dealloc]; } @end // // PersistenceViewController.m // Persistence4 // // Created by liu lavy on 11-10-3. // Copyright 2011 __MyCompanyName__. All rights reserved. // #import "PersistenceViewController.h" #import "Persistence4AppDelegate.h" @implementation PersistenceViewController @synthesize field1; @synthesize field2; @synthesize field3; @synthesize field4; -(void) applicationWillResignActive:(NSNotification *)notification { Persistence4AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; NSManagedObjectContext *context = [appDelegate managedObjectContext]; NSError *error; for(int i = 1; i <= 4; i++) { NSString *fieldName = [NSString stringWithFormat:@"field%d", i]; UITextField *theField = [self valueForKey:fieldName]; //创建提取请求 NSFetchRequest *request = [[NSFetchRequest alloc] init]; //创建实体描述并关联到请求 NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Line" inManagedObjectContext:context]; [request setEntity:entityDescription]; //设置检索数据的条件 NSPredicate *pred = [NSPredicate predicateWithFormat:@"(lineNum = %d)", i]; [request setPredicate:pred]; NSManagedObject *theLine = nil; ////检查是否返回了标准匹配的对象,如果有则加载它,如果没有则创建一个新的托管对象来保存此字段的文本 NSArray *objects = [context executeFetchRequest:request error:&error]; if(!objects) { NSLog(@"There was an error"); } //if(objects.count > 0) { // theLine = [objects objectAtIndex:0]; //} else { //创建一个新的托管对象来保存此字段的文本 theLine = [NSEntityDescription insertNewObjectForEntityForName:@"Line" inManagedObjectContext:context]; [theLine setValue:[NSNumber numberWithInt:i] forKey:@"lineNum"]; [theLine setValue:theField.text forKey:@"lineText"]; //} [request release]; } //通知上下文保存更改 [context save:&error]; } // The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad. /* - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization. } return self; } */ // Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad { Persistence4AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; NSManagedObjectContext *context = [appDelegate managedObjectContext]; //创建一个实体描述 NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Line" inManagedObjectContext:context]; //创建一个请求,用于提取对象 NSFetchRequest *request = [[NSFetchRequest alloc] init]; [request setEntity:entityDescription]; //检索对象 NSError *error; NSArray *objects = [context executeFetchRequest:request error:&error]; if(!objects) { NSLog(@"There was an error!"); } for(NSManagedObject *obj in objects) { NSNumber *lineNum = [obj valueForKey:@"lineNum"]; NSString *lineText = [obj valueForKey:@"lineText"]; NSString *fieldName = [NSString stringWithFormat:@"field%d", [lineNum integerValue]]; UITextField *textField = [self valueForKey:fieldName]; textField.text = lineText; } [request release]; UIApplication *app = [UIApplication sharedApplication]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillResignActive:) name:UIApplicationWillResignActiveNotification object:app]; [super viewDidLoad]; } /* // Override to allow orientations other than the default portrait orientation. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations. return (interfaceOrientation == UIInterfaceOrientationPortrait); } */ - (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; // Release any cached data, images, etc. that aren't in use. } - (void)viewDidUnload { self.field1 = nil; self.field2 = nil; self.field3 = nil; self.field4 = nil; [super viewDidUnload]; } - (void)dealloc { [field1 release]; [field2 release]; [field3 release]; [field4 release]; [super dealloc]; } @end
5、AppSettings
[cpp]
view plaincopyprint?
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
===================================================================================
===================================================================================
6、普通文件存储
这种方式即自己将数据通过IO保存到文件,或从文件读取。
声明:此篇所有代码来自《Iphone4与IPad开发基础教程》
相关文章推荐
- IOS 数据存储详解及实例代码
- IOS中NSUserDefaults的用法(轻量级本地数据存储)
- IOS 数据存储之 FMDB 详解
- iOS 数据存储的常用方式
- ios应用数据存储方式(归档)
- iOS数据存储
- iOS存储数据字典到沙盒
- iOS 数据的持久化存储
- iOS实现iCloud数据存储-Swift3.0
- iOS 数据存储--NSUserDefault
- IOS中NSUserDefaults的用法(轻量级本地数据存储)
- iOS开发UI篇—ios应用数据存储方式(XML属性列表-plist
- IOS中NSUserDefaults的用法(轻量级本地数据存储)
- IOS学习之ios应用数据存储方式(归档)
- ios中的四种数据存储方式
- 【iOS-Cocos2d游戏开发之十九】游戏数据存储的四种常用方式NSKeyedArchiver/NSUserDefaults/Write写入/SQLite3
- 黑马程序员——IOS学习九:ios开发之数据的持久化存储机制——黑马 ios 技术博客
- ios 沙盒 NSCoding(相当于JAVA对象序列化) 归档 数据存储
- iOS筛选出数组中想要的数据(数组中存储的模型)
- iOS教程:Core Data数据持久性存储基础教程