一、应用程序沙盒
IOS应用程序职能在系统为该应用所分配的文件区域下读写文件,这个文件区域就是应用程序沙盒。所有的非代码文件如:图片、声音、映象等等都存放在此。
在mac中command+shift+G命令,然后输入users/用户名/library命令进入库,然后依次进入application support/iphone simulator/版本/applications文件夹,这里面的各个文件夹对应着各个应用程序。
Documents :除了基于NSUserDefaults的首选项设置外,应用程序的数据、文件都保存在该目录下
Library :基于NSUserDefaults的首选项参数保存在Library/Preferences下
tmp :应用程序存储临时文件,ios同步时itunes不会同步这里面的数据,当应用程序不在需要这些文件时,应当删除以避免占用空间。
获取documents路径:
1 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES); 2 NSString *dd = [paths objectAtIndex:0];
获取tmp目录:
1 NSString *tempPath = NSTemporaryDirectory();
那么我们在保存数据时使用哪种发式比较好呢,这个当然还要具体情况具体对待。当保存小数据量的数据时,可以使用NSArray或者NSDictionary,调用writeToFile:atomically:方法写入一个文件,使用时读取文件内容即可。
当保存大数据量的数据时,可以选择使用sqllite,ios提供了CoreData框架。
二、应用程序参数与用户默认设置
1、使用Settings Bundle
Settings Bundle时应用程序中的一组特殊文件,用于保存较简单的各种配置信息。如果使用了Settings Bundle,ios自带的设置应用则会显示你的app
2、使用NSUserDefaults读取、保存应用程序参数
NSUserDefaults是一个单例类,每个应用程序只有一个NSUserDefaults对象,Settings Bundle设置的参数,也可以通过NSUserDefaults来读取和设置
获取NSUserDefaults的方法:
1 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
获取NSUserDefaults对象后,可以获取和设置应用程序参数
xxForKey:(NSString *) key =>xx表示各种类型,根据key获取值
setBool:(xxx) value forKey:(NSString *) key =>设置参数
设置完参数后,调用synchronize方法进行保存。
3、属性列表
属性列表就是文章开始提到的利用NSArray和NSDictionary将数据写入到文件的保存方法。
但是有一些限制,只有下列类型的值保存到NSArray和NSDictionary中才可以直接调用writeToFile方法执行保存:
NSArray、NSMutableArray、NSDictionary、NSMutableDictionary、NSData、NSMutableData、NSString、NSMutableString、NSValue、NSNumber
如果NSArray和NSDictionary保存了我们自定义的类,那么将不能直接调用writeToFile方法执行保存。(可以考虑使用对象归档的方法进行保存)
1 //使用属性列表保存3个用户的账号密码 2 accountList = [[NSMutableArray alloc] init]; 3 [accountList addObject:[NSDictionary 4 dictionaryWithObjects:[NSArray arrayWithObjects:@"loginname",@"loginpwd", nil] 5 forKeys:[NSArray arrayWithObjects:@"305213781",@"123123", nil]]]; 6 [accountList addObject:[NSDictionary 7 dictionaryWithObjects:[NSArray arrayWithObjects:@"loginname",@"loginpwd", nil] 8 forKeys:[NSArray arrayWithObjects:@"475782389",@"123456", nil]]]; 9 [accountList addObject:[NSDictionary 10 dictionaryWithObjects:[NSArray arrayWithObjects:@"loginname",@"loginpwd", nil] 11 forKeys:[NSArray arrayWithObjects:@"330577588",@"123456789", nil]]]; 12 [accountList writeToFile:[self filePath] atomically:YES]; 13 14 //使用UIActionSheet提示用户保存成功 15 UIActionSheet *sheet =[[UIActionSheet alloc] initWithTitle:@"保存成功" delegate:nil cancelButtonTitle:nil destructiveButtonTitle:@"确定" otherButtonTitles:nil, nil]; 16 [sheet showInView:self.view];
4、使用Sqlite3数据库
1)为项目增加libsqlite3.dylib,这是一个原生的C函数库
常用函数:
int sqlite3_close(sqlite3 *):关闭sqlite3 *所代表的数据连接,并释放底层数据库连接资源。在调用该函数之前,必须先调用sqlite3_finalize()函数,调用sqlite3_blob_close()函数关闭所有的blob处理器,否则将会返回SQLITE_BUSY
int sqlite3_exec(sqlite3*,const char *sql, int (*callback)(void*, int ,char**,char**),void *,char **errmsg):用于执行没有返回值的sql语句
sqlite3_int64 sqlite3_last_insert_rowid(sqlite3*):返回sqlite3代表的数据库最后一次插入行的id
int sqlite3_changes(sqlite3*):执行某条dml语句后,返回受影响行数
void sqlite3_interrupt(sqlite3*):中断一个长时间执行的查询语句
int sqlite3_complete(const char *sql):用于判断sql语句是否执行完成
int sqlite3_open(const char * filename,sqlite3 ** ppdb):打开与filename文件的链接,并让ppdb参数引用被打开的数据库连接
const char *sqlite3_sql(sqlite3_stmt *pStmt):用于提取sqlite3_stmt(预编译SQL语句产生的结果)中包装的sql语句
等等。。。太多了不一一列举了
操作sqlite数据库的大致步骤如下:
1、调用sqlite3_open方法打开与数据库的连接
2、执行语句
3、sqlite3_close函数关闭数据库连接
2)使用Core Data框架
Core Data框架是一个纯粹的面向对象的框架,允许开发者以面向对象的方式持久化操作SQLite数据库。core data底层的持久化存储方式可以是Sqlite数据库,也可以是xml,也可以是内存。
Core Data的核心概念是实体,由Core Data管理的模型对象,它必须是NSManagedObject类或者它的子类的实例。
Core Data应用中的核心API有如下几个:
托管对象模型(NSManagedObjectModel) :该对象负责管理整个应用的所有实体以及实体之间的关联关系。当开发者使用Xcode的图形界面设计了实体与实体间的关联关系之后,需要使用该对象来加载、管理应用的托管对象模型
持久化存储协调器(NSPersistentStoreCoordinator) :负责管理底层的存储文件,例如sqlite数据库等等
托管对象上下文(NSManagedObjectContext):该对象是Core Data的核心,增删改查都需要通过它来进行