`
mmdev
  • 浏览: 12927118 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

iphone开发 三种数据持久化的方法使用

 
阅读更多

三种保持数据的方法,第一种:实用属性列表,第二种:对象归档,第三种:使用Iphone的嵌入式数据库(SQLite3)

给予Iphone应用程序沙盒原理,我们保持的数据都是保存在相对应的应用程序的Document文件夹。既然我们把数据放在每一个应用的Document文件夹中,呢我我们怎么得到相应的路径呢,其实也不是很难。下面是检索文档目录路径的代码:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserdomainMask, YES);

NSString *documentDirectory = [paths objectAtIndex:0];常量NSDocumentDirectory表面我们正在查找的Document目录路径,常量NSUserDomainmask表明我们希望将搜索限制于我们应用程序的沙盒中。这样我们就可以得到该数组的第一值,也仅此一值,因为每一个应用程序只有一个Document文件夹。我们得到了Document的路径,然后和文件名相连接不就是一个完整的路径了吗,这用到了stringByAppendingPathComponent方法:

NSString *filepath = [documentDirectory stringbyAppendingPathComponent:@"filename.xxx"];其中filename.xxx为要命名的文件。

在每一个应用程序中还对应一个temp文件夹,我们怎么获取这个文件夹的路径呢,也比较简单:

NSString *tempPath = NSTemporaryDirectory();

NSString *filePath = [tempPath stringByAppendingPathComponent:@"filename.xxx"];

下面我们来创建该项目:

第一个实用属性列表文件,打开Xcode,创建新项目,选择View-Based Application即可,我创建项目名称是IP_11persistence。打开IP_11persistenceViewController.h,首先定义一个常量用来串联Document。

#define kFileName @"data.plist"

然后定义四个输出口,用来输入和显示数据。

IBOutlet UITextField *show1;
IBOutlet UITextField *show2;
IBOutlet UITextField *show3;
IBOutlet UITextField *show4;

定义两个方法:

-(NSString *)dataFilePath;//用来返回数据文件的完整路径名
-(void)applicationWillTerminate:(NSNotification *)notification;//应用程序在退出时调用,将数据保存到数据列表

然后打开IP_11persistenceViewController.m

添加下面这三个方法:

-(NSString *)dataFilePath//用来返回数据文件的完整路径名
{
NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *paths = [path objectAtIndex:0];
return [paths stringByAppendingPathComponent:kFileName];


}

-(void)applicationWillTerminate:(NSNotification *)notification//应用程序在退出时调用,将数据保存到数据列表
{
NSMutableArray *array = [[NSMutableArray alloc]init];
[array addObject:show1.text];
[array addObject:show2.text];
[array addObject:show3.text];
[array addObject:show4.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];
show1.text = [array objectAtIndex:0];
show2.text = [array objectAtIndex:1];
show3.text = [array objectAtIndex:2];
show4.text = [array objectAtIndex:3];
[array release];
}

《Iphone开发基础教程》第十一章<wbr>基本数据持久性


UIApplication *app = [UIApplication sharedApplication];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillTerminate:)
name:UIApplicationWillTerminateNotification
object:app];
[super viewDidLoad];
}

代码已经搞定,下面点开Resources文件夹,打开IP_11persistenceViewController.xib,向里面拖入4个UITextField控件,勾掉每一个控件上的Clear When Editing Begin,这样就不是每次选中文本框的时候会自动消失里面的内容了。关联四个控件即可。(在实际的例子当中我添加两个方法,一个是在点击回车时,软键盘自动消失,一个是在点击背景是软键盘自动消失,这两个方法在第四章中有详细的讲解,可以去参考)。build and go运行,这是你输入内容,关闭应用程序,然后在打开,你会发现你刚才输入的内容仍然存在,下面开始第二种方法,使用对象归档的方法。

创建一个新的项目,我的项目名是:IP_11persistence2。创建好以后,在Classes文件夹上点右键创建一个新的类,选择NSObject subclass模板。名称为fourlines。打开fourlines.h,向里面添加四个常量和四个输出口:

#define kField1Key @"show1"
#define kField2Key @"show2"
#define kField3Key @"show3"
#define kField4Key @"show4"

NSString *show1;
NSString *show2;
NSString *show3;
NSString *show4;

打开fourlines.m文件,修改代码:

-(void)encodeWithCoder:(NSCoder *)encoder //对所有的属性进行编码
{
[encoder encodeObject:show1 forKey:kField1Key];
[encoder encodeObject:show2 forKey:kField2Key];
[encoder encodeObject:show3 forKey:kField3Key];
[encoder encodeObject:show4 forKey:kField4Key];
}

-(id)initWithCoder:(NSCoder *)decoder//使用相同的4格键值对这些属性进行解码
{
if(self == [super init])
{
self.show1 = [decoder decodeObjectForKey:kField1Key];
self.show2 = [decoder decodeObjectForKey:kField2Key];
self.show3 = [decoder decodeObjectForKey:kField3Key];
self.show4 = [decoder decodeObjectForKey:kField4Key];
}
return self;
}

-(id)copyWithZone:(NSZone *)zone//创建一个新的fourline对象,并将所有4格字符串复制到其中
{
fourlines *copy = [[[self class] allocWithZone:zone] init];
show1 = [self.show1 copy];
show2 = [self.show2 copy];
show3 = [self.show3 copy];
show4 = [self.show4 copy];
return copy;
}

然后打开IP_11persistence2ViewController.h,里面声明四个输出口,这和第一个例子一样,定义两个常量。

#define kFileName @"archive"
#define kDataKey @"Data"

打开IP_11persistence2ViewController.m导入fourlines类。

#import "fourlines.h"

修改代码

-(NSString *)dataFilePath//用来返回数据文件的完整路径名
{
NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *paths = [path objectAtIndex:0];
return [paths stringByAppendingPathComponent:kFileName];
}

-(void)applicationWillTerminate:(NSNotification *)notification//应用程序在退出时调用,将数据保存到数据列表
{
fourlines *fourline = [[fourlines alloc] init];
fourline.show1 = show1.text;
fourline.show2 = show2.text;
fourline.show3 = show3.text;
fourline.show4 = show4.text;

NSMutableData *data = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archiver encodeObject:fourline forKey:kDataKey];
[archiver finishEncoding];
[data writeToFile:[self dataFilePath] atomically:YES];
[fourline release];
[archiver release];
[data release];
}

-(void)viewDidLoad
{
NSString *filePath = [self dataFilePath];//得到文件路径
if([[NSFileManager defaultManager] fileExistsAtPath:filePath])//如果该文件存在就加载
{
NSMutableData *data = [[NSMutableData alloc] initWithContentsOfFile:[self dataFilePath]];
NSKeyedUnarchiver *archiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
fourlines *fourline = [archiver decodeObjectForKey:kDataKey];
[archiver finishDecoding];

show1.text = fourline.show1;
show2.text = fourline.show2;
show3.text = fourline.show3;
show4.text = fourline.show4;

[archiver release];
[data release];
}
UIApplication *app = [UIApplication sharedApplication];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillTerminate:)
name:UIApplicationWillTerminateNotification
object:app];
[super viewDidLoad];
}

对IP_11persistence2ViewController.xib的操作同第一个。

下面来创建最后一个使用SQLite来保存数据。我创建的项目名是IP_11SQLite。

首先导入libsqlite3.lib,这和导入FrameWork一样,在Framework文件夹上面右击,ADD-Existing Files然后选择文件,该文件在/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS2.2.sdk/usr/lib/libsqlite3.dylib下面。导入后开始修改代码。

打开IP_11SQLiteViewController.h

#import "/usr/include/sqlite3.h"
#define kFileName @"data.sqlite3"

增加一个变量:sqlite3 *database;

修改后为:

#import <UIKit/UIKit.h>
#import "/usr/include/sqlite3.h"
#define kFileName @"data.sqlite3"

@interface IP_11SQLiteViewController : UIViewController {
IBOutlet UITextField *show1;
IBOutlet UITextField *show2;
IBOutlet UITextField *show3;
IBOutlet UITextField *show4;

sqlite3 *database;
}
@property (nonatomic, retain) UITextField *show1;
@property (nonatomic, retain) UITextField *show2;
@property (nonatomic, retain) UITextField *show3;
@property (nonatomic, retain) UITextField *show4;
-(NSString *)dataFilePath;
-(void)applicationWillTerminate:(NSNotification *)notification;
@end

然后打开IP_11SQLiteViewController.m修改代码如下:

-(NSString *)dataFilePath//用来返回数据文件的完整路径名
{
NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *paths = [path objectAtIndex:0];
return [paths stringByAppendingPathComponent:kFileName];
}

-(void)applicationWillTerminate:(NSNotification *)notification//应用程序在退出时调用,将数据保存到数据列表
{
for(int i = 1; i<=4; i++)
{
NSString *fieldName = [[NSString alloc] initWithFormat:@"show%d",i];
UITextField *field = [self valueForKey:fieldName];//根据每一i的值设定相应textfield
[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)//执行插入或更新操作,如果插入或更新失败给出错误信息
{
NSAssert1(0,@"Error updating tables: %s",errorMsg);
sqlite3_free(errorMsg);
}
}
sqlite3_close(database);//关闭数据库连接
}

-(void)viewDidLoad
{
if(sqlite3_open([[self dataFilePath] 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);
NSAssert1(0,@"Error creating table: %s",errorMsg);
}

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_ROW)
{
int row = sqlite3_column_int(statement, 0);
char *rowData = (char *)sqlite3_column_text(statement, 1);

NSString *fieldName = [[NSString alloc] initWithFormat:@"show%d",row];
NSString *fieldValue = [[NSString alloc] initWithUTF8String:rowData];
UITextField *field = [self valueForKey:fieldName];
field.text = fieldValue;
[fieldName release];
[fieldValue release];
}
sqlite3_finalize(statement);
}

UIApplication *app = [UIApplication sharedApplication];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillTerminate:)
name:UIApplicationWillTerminateNotification
object:app];
[super viewDidLoad];
}
最后就是IP_11SQLiteViewController.xib的修改了,和第一个一样的。

到此三种方法的操作结束了。


在两个方法的实例代码:点击打开链接


分享到:
评论

相关推荐

    iphone3超详细开发教程

    非常详细的iphone3开发...11基本数据持久性 12使用Quartz和OpenGL绘图 13轻击,触摸和受势 14使用 CoreLocation定位功能 15加速计 16iphone照相机和照片库 17应用程序本地化 18未来之路 希望本资料对你有所帮助的资料.

    iPhone开发秘籍.part2.rar

    第7章介绍用多种方法将数据导入或下载到程序中,并使用iPhone 的多点 触摸界面显示这些数据。 第8章:控件 UIControl 类为许多iPhone 交互式元素提供了基础,包括按钮、文本字段、滑块和开关。第8章通过 已经或尚未...

    iPhone开发秘籍.part4.rar

    第7章介绍用多种方法将数据导入或下载到程序中,并使用iPhone 的多点 触摸界面显示这些数据。 第8章:控件 UIControl 类为许多iPhone 交互式元素提供了基础,包括按钮、文本字段、滑块和开关。第8章通过 已经或尚未...

    iPhone开发秘籍.part1.rar

    第7章介绍用多种方法将数据导入或下载到程序中,并使用iPhone 的多点 触摸界面显示这些数据。 第8章:控件 UIControl 类为许多iPhone 交互式元素提供了基础,包括按钮、文本字段、滑块和开关。第8章通过 已经或尚未...

    iphone3开发基础教程

    第11章 基本数据持久性 264 11.1 应用程序的沙盒 264 11.1.1 获取Documents目录 265 11.1.2 获取tmp目录 266 11.2 文件保存策略 266 11.2.1 单个文件持久性 266 11.2.2 多个文件持久性 267 11.3 持久保存应用程序...

    Unity3D 游戏引擎之游戏场景的切换与持久化简单数据的储存

    雨松MOMO Unity3D 游戏开发系列博文之Unity3D 游戏引擎之游戏场景的切换与持久化简单数据的储存,欢迎大家下载阅读,哇咔咔~~

    iPhone开发秘籍

    10.6.2 密钥链持久化 267 10.7 发送和接收文件 267 10.8 秘诀:构建一个简单的基于web的服务器 268 10.9 即时消息传送 272 10.10 小结 272 第11章 cover flow编程 274 11.1 uicoverflowlayer类 274 11.2 ...

    《iPhone开发基础教程》(PDF电子版)光碟配套(源代码)

    第十一章 基本数据持久性 第十二章 使用Quartz和OpenGL绘制 第十三章 轻击、触摸和手势 第十四章 我在哪里?使用Core Location定位功能 第十五章 加速计 第十六章 iPhone照相机和照片库 第十七章 应用程序本地化 第...

    iPhone开发基础教程PDF(含源代码)

     第11章 基本数据持久性  第12章 使用Quartz和OpenGL绘图  第13章 轻击、触摸和手势  第14章 我在哪里?使用Core Location定位功能  第15章 加速计  第16章 iPhone照相机和照片库  第17章 应用程序本地化  ...

    iOS移动开发从入门到精通.epub

    第二篇为进阶篇,主要介绍了Alamofire网络服务、数据的持久化、多线程、CoreText、CoreImage、Storyboard、自动化测试、性能分析、本地化、加密与安全等实用技术。第三篇为实例篇,通过对实体层、表现层和逻辑层三层...

    iPad应用开发实践指南

    第二部分(第8~24章)是本书的核心,详细讲解了PhotoWheel的完整开发过程以及所需的理论知识,具体包括创建主从复合应用程序、使用表格视图、用视图工作、使用触屏手势、添加照片、数据持久化、故事板、视图控制器、...

    《iOS6开发指南》精彩书摘

    讨论 iOS本地数据持久化的问题。首先分析了数据存取的几种方式以及每种数据存取方式适合什么样的场景,然后分别举例介绍了每种存取方式的实现。 第11章“访问通讯录”。首先介绍了访问通讯录所需要的框架,然后介绍...

    精通iOS开发(第8版) 中文pdf扫描版 附源代码

    表视图简介 186 第 9 章 表视图中的导航控制器 223 第 10 章 集合视图 248 第 11 章 iPad 应用中的分割视图和浮动窗口 258 第 12 章 应用设置和用户默认设置 278 第 13 章 数据持久化基础知识 304 第 14 章 文档和 ...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    1.2.4 Android移动Web项目开发的三种解决方案:Native, Web和Hybrid优缺陷分析 4 1.2.5国内外应用现状 6 1.2.6 研究现状总结 7 1.3研究目标与内容 7 1.3.1多窗口浏览器模式的实现机制 7 1.3.2跨域交互即缓存处理方法...

    一步一步学习 iOS 6 编程(第四版)

    第二十七部分:Core Data 持久化数据存储 第二十八部分: 使用 SQLite 数据库存储数据 第二十九部分:通用应用程序、图标文件和 App 调试 第三十部分:自劢布局(Auto Layout) 第三十一部分:应用集合视图...

    一步一步学习_iOS_6_编程(第四版)

    第二十七部分:Core Data持久化数据存储 第二十八部分: 使用SQLite数据库存储数据 第二十九部分:通用应用程序、图标文件和App调试 第三十部分:自动布局(Auto Layout) 第三十一部分:应用集合视图...

Global site tag (gtag.js) - Google Analytics