您的位置:首页 > 移动开发 > IOS开发

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

[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开发基础教程》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: