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

ios 数据存储

2015-12-03 09:47 465 查看
属性列表

对象归档

SQLite3

CoreData

AppSettings

普通文件存储

1、属性列表

[cpp] view
plaincopy

//

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

//

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

//

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

//

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

//

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

//

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

//每个应用程序只有一
4000
个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
plaincopy

//

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

//

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

//

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

//

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

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

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

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

6、普通文件存储

这种方式即自己将数据通过IO保存到文件,或从文件读取。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: