IOS 数据存储

来源:互联网 发布:保利尼奥 知乎 编辑:程序博客网 时间:2024/04/30 21:48

ios数据存储包括以下几种存储机制:

属性列表

对象归档

SQLite3

CoreData

AppSettings

普通文件存储

1、属性列表

////  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

////  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:selfselector:@selector(applicationWillResignActive:)name:UIApplicationWillResignActiveNotificationobject: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、对象归档

////  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

////  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

////  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

////  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

////  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

////  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

////  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

////  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

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

===================================================================================

===================================================================================

6、普通文件存储

这种方式即自己将数据通过IO保存到文件,或从文件读取。


声明:此篇所有代码来自《Iphone4与IPad开发基础教程》



原创粉丝点击