Iphone开发基础教程 (11章 基本数据持久性)--读书笔记
2012-05-24 10:00
495 查看
获取Documents目录
NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [path objectAtIndex:0]; NSString *filename = [documentsDirectory stringByAppendingFormat:@"thefFile.txt"];
获取tmp目录
NSString *tempPath = NSTemporaryDirectory(); NSString *tempFile = [tempFile stringByAppendingFormat:@"tempFile.txt"];
属性列表序列化
许多应用程序都使用了属性列表,比如使用属性列表来指定程序首选项,只要字典或数组仅包含特定可序列化的对象,就可以将NSDictionary和NSarray实例写入属性列表及从属性列表创建他们。序列化对象已被转换为字节流,以便存储到文件中,或通过网络进行传输。尽管可以让任何对象可序列化,但是只能将某些对象放置到某个集合类(如NSDictionary或NSArray)中,然后使用该集合的writeToFile方法将他们存储到属性列表如果你打算使用属性列表持久保存程序数据,则可以使用NSArray或NDDirectionary容纳需要持久化的数据,假设你放到NSArray或NSDirectionary的所有对象都是可序列化的对象,则可以通过字典或数组实例调用writeToFile:atnomically:方法来编写属性列表
[myArray writeToFile:@"/some/file/location/output.plist" atomically:YES];
1、新建single view application
2、打开viewController.xib,添加控件如图
![](http://my.csdn.net/uploads/201205/23/1337784433_8010.png)
2、修改控制器
#import <UIKit/UIKit.h> #define kFilename @"data.plist" @interface ViewController : UIViewController { IBOutlet UITextField *field1; IBOutlet UITextField *field2; IBOutlet UITextField *field3; IBOutlet UITextField *field4; } @property (nonatomic,retain) UITextField *field1; @property (nonatomic,retain) UITextField *field2; @property (nonatomic,retain) UITextField *field3; @property (nonatomic,retain) UITextField *field4; - (NSString *) dataFilePath; - (void) applicationWillTerminate:(NSNotification *) notification; @end
@implementation ViewController @synthesize field1; @synthesize field2; @synthesize field3; @synthesize field4; - (NSString *)dataFilePath { NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [path objectAtIndex:0]; return [documentsDirectory stringByAppendingFormat:@"thefFile.txt"]; } -(void) applicationWillTerminate:(NSNotification *) notifaction { 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]; } - (void) 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(applicationWillTerminate:) name:UIApplicationWillTerminateNotification object:app]; [super viewDidLoad]; } - (void)dealloc { [field1 release]; [field2 release]; [field3 release]; [field4 release]; [super dealloc]; } @end
3、重新打开.xib 按下Control的同时,将File's Owner图标拖放到第一个文本字段,选择field1,第二个连接到field2 ......
对象归档
#define kField1Key @"Field1" #define kField2Key @"Field2" #define kField3Key @"Field3" #define kField4Key @"Field4" #import <UIKit/UIKit.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;
@implementation FourLines @synthesize field1; @synthesize field2; @synthesize field3; @synthesize field4; - (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]) { self.field1 = [aDecoder decodeObjectForKey:kField1Key]; self.field2 = [aDecoder decodeObjectForKey:kField2Key]; self.field3 = [aDecoder decodeObjectForKey:kField3Key]; self.field4 = [aDecoder decodeObjectForKey:kField4Key]; } return self; } - (id) copyWithZone:(NSZone *)zone { FourLines *copy = [[[self class] allocWithZone:zone] init]; field1 = [self.field1 copy]; field2 = [self.field2 copy]; field3 = [self.field3 copy]; field4 = [self.field4 copy]; return copy; } @end
#import <UIKit/UIKit.h> #define kFilename @"archive" #define kDataKey @"Data" @interface PersistenceViewController : UIViewController { IBOutlet UITextField *field1; IBOutlet UITextField *field2; IBOutlet UITextField *field3; IBOutlet UITextField *field4; } @property (nonatomic,retain) UITextField *field1; @property (nonatomic,retain) UITextField *field2; @property (nonatomic,retain) UITextField *field3; @property (nonatomic,retain) UITextField *field4; - (NSString *) dataFilePath; - (void) applicationWillTerminate:(NSNotification *) notifacation; @end
#import "ViewController.h" #import "FourLines.h" @implementation PersistenceViewController @synthesize field1; @synthesize field2; @synthesize field3; @synthesize field4; - (NSString *) dataFilePath { NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [path objectAtIndex:0]; return [documentsDirectory stringByAppendingPathComponent:kFilename]; } - (void) applicationWillTerminate:(NSNotification *) notifacation { 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]; } - (void) 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]; 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(applicationWillTerminate:) name:UIApplicationWillTerminateNotification object:app]; [super viewDidLoad]; } - (void)dealloc { [field1 release]; [field2 release]; [field3 release]; [field4 release]; [super dealloc]; } @end
SQLite3
打开数据库sqlite3 *database;
int result = sqlite3_open("/path/to/database/file",&database);
如果result等于SQLITE_OK,则表示数据库已经成功打开。SQLite3是采用可以移植的C,所有它不知道什么是NSString,所幸,,有一个NSString方法,该方法从NSString实例生成C字符串
char *cStringPath = [pathString UTF8String];
关闭数据库
sqlite3_close(database)
创建表
![](http://my.csdn.net/uploads/201205/29/1338299420_8342.png)
查询
![](http://my.csdn.net/uploads/201205/29/1338299461_5414.png)
结果集
![](http://my.csdn.net/uploads/201205/29/1338299518_4697.png)
#import <UIKit/UIKit.h> #import "/usr/include/sqlite3.h" #define kFilename @"data.sqlite3" @interface PersistenceViewController : UIViewController { IBOutlet UITextField *field1; IBOutlet UITextField *field2; IBOutlet UITextField *field3; IBOutlet UITextField *field4; sqlite3 *database; } @property (nonatomic,retain) UITextField *field1; @property (nonatomic,retain) UITextField *field2; @property (nonatomic,retain) UITextField *field3; @property (nonatomic,retain) UITextField *field4; - (NSString *) dataFilePath; - (void) applicationWillTerminate:(NSNotification *) notifacation; @end
#import "ViewController.h" #import "FourLines.h" @implementation PersistenceViewController @synthesize field1; @synthesize field2; @synthesize field3; @synthesize field4; - (NSString *) dataFilePath { NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [path objectAtIndex:0]; return [documentsDirectory stringByAppendingPathComponent:kFilename]; } - (void) applicationWillTerminate:(NSNotification *) notifacation { for (int i=1; i<=4; i++) { NSString *fieldName = [[NSString alloc] initWithFormat:@"field%d",i]; UITextField *field = [self valueForKey:fieldName]; [fieldName release]; NSString *update = [[NSString alloc] initWithFormat:@"insert or replace into fields(row,field_data) values (%d,'%@');",i,field.text]; char *errorMsg; if (sqlite3_exec(database, [update UTF8String], NULL, NULL, &errorMsg) != SQLITE_OK) { NSAssert(0, @"Error updating table : %s", errorMsg); sqlite3_free(errorMsg); } } sqlite3_close(database); } - (void) viewDidLoad { if (sqlite3_open([[self dataFilePath] UTF8String], &database) != SQLITE_OK) { sqlite3_close(database); NSAssert(0, @""); } char *errorMsg; NSString *createSQL = @"create table if not exist fields (row integer primary key,field_data text);"; if (sqlite3_exec(database, [createSQL UTF8String], NULL, NULL, &errorMsg)!= SQLITE_OK) { sqlite3_close(database); NSAssert(0, @""); } NSString *query = @"select row,field_data from fields order by row"; sqlite3_stmt *statement; if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) == SQLITE_OK) { while (sqlite3_step(statement) == SQLITE_OK) { 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]; } sqlite3_finalize(statement); } } - (void)dealloc { [field1 release]; [field2 release]; [field3 release]; [field4 release]; [super dealloc]; } @end
相关文章推荐
- Iphone开发基础教程 (7章 标签栏与选取器)--读书笔记
- 【无限互联】iOS开发视频教程— 2.2 iPhone开发之OC变量和基本数据类型1
- Iphone开发基础教程 (9章 导航控制器和表视图)--读书笔记
- phone开发基础教程》第十一章 基本数据持久
- 【无限互联】iOS开发视频教程—2.3 iPhone开发之OC变量和基本数据类型2
- 【无限互联】iOS开发视频教程—2.4iPhone开发之基本数据类型转换
- [ios开发基础之 Core Data [1] ]Core Data数据持久性存储基础教程
- Iphone开发基础教程 (10章 应用程序设置)--读书笔记
- Iphone开发基础教程 (8章 表视图)--读书笔记
- python基础教程之基本内置数据类型介绍
- Core Data数据持久性存储基础教程
- iPhone开发四剑客之《Objective-C基础教程》
- iOS教程:Core Data数据持久性存储基础教程
- iPhone 3开发基础教程(针对iPhone SDK 3新特性全面改版)
- 【读书笔记《Android游戏编程之从零开始》】20.游戏开发基础(游戏数据存储)
- 李洪强iOS开发之【零基础学习iOS开发】【02-C语言】07-基本数据类型
- iPhone开发四剑客之《Objective-C基础教程》
- 微信小程序开发教程(基础篇)7-数据绑定上
- iPhone开发教程 UI基础课程(58课时)
- python基础教程之基本数据类型和变量声明介绍