`
janedoneway
  • 浏览: 569537 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

iPhone数据存储小结

 
阅读更多

From:http://www.uplook.cn/index-Index-show-view17939.html

 

 


首选项设置存储

NSUserDefaults 以及通过它控制的SettingBundle  NSUserDefaults 用来保存一些设置,他会自动写到何时的位置。
NSUbiquitousKeyValueStore 多平台同步设置,限制是大小64k,开启entitlement,唯一Apple ID(还要考虑无法连接到iCloud网络时的情形)

文件存储
一.目录描述

<Application_Home>/AppName.app bundle目录,包括程序本身。往里面些东西会导致签名改变和重启程序。初始同步后iTunes不备份此目录。
<Application_Home>/Documents/ 存储用户文档和程序数据。通过文件共享可以使其可见。iTunes备份之。
<Application_Home>/Documents/Inbox 其他程序要求本程序打开的文档。可读删,不可增加修改。要改变可以先移出来。iTunes备份之。
<Application_Home>/Library/ 非用户数据文件存储的根目录。用其中标准或自定义的文件夹备份不被用户可见的数据。不应用这个目录存储用户数据。iTunes备份之。
  ~Library/Application Support/<bundle_ID> 为用户创建管理的资源和数据文件。用这个目录存储程序状态信息,下载的文件甚至用户创建但同意你管理的数据。自动保存文件。
  ~/Library/Caches/<bundle_ID> 用来存储缓存文件或者程序可以简单重建的文件的目录。
<Application_Home>/tmp/ 临时文件目录,可能被系统删除,不应期望始终存在。不被iTunes备份。

得到目录地址
URLsForDirectory:inDomains: method 返回NSURL形式的目录地址
NSSearchPathForDirectoriesInDomains 返回字符串形式的目录地址
NSHomeDirectory 返回程序根目录
NSTemporaryDirectory 返回临时文件目录

相关变量定义

NSSearchPathDirectory
enum {
NSApplicationDirectory = 1,//Supported applications (/Applications)
NSDemoApplicationDirectory,//Unsupported applications and demonstration versions
NSDeveloperApplicationDirectory,//Developer applications (/Developer/Applications)
NSAdminApplicationDirectory,//System and network administration applications
NSLibraryDirectory,//Various user-visible documentation, support, and configuration files (/Library)
NSDeveloperDirectory,//Developer resources (/Developer)
NSUserDirectory,//User home directories (/Users)
NSDocumentationDirectory,//
NSDocumentDirectory,//
NSCoreServiceDirectory,//Location of core services (System/Library/CoreServices)
NSAutosavedInformationDirectory = 11,//Location of user’s autosaved documents Library/Autosave Information
NSDesktopDirectory = 12,//
NSCachesDirectory = 13,//Location of discardable cache files (Library/Caches)
NSApplicationSupportDirectory = 14,//Location of application support files (Library/Application Support)
NSDownloadsDirectory = 15,//
NSInputMethodsDirectory = 16,//
NSMoviesDirectory = 17,//
NSMusicDirectory = 18,//
NSPicturesDirectory = 19,//
NSPrinterDescriptionDirectory = 20,//
NSSharedPublicDirectory = 21,//
NSPreferencePanesDirectory = 22,//
NSItemReplacementDirectory = 99,//
NSAllApplicationsDirectory = 100,//
NSAllLibrariesDirectory = 101//
};
typedef NSUInteger NSSearchPathDirectory;
enum {
NSUserDomainMask = 1,//用户主目录中
NSLocalDomainMask = 2,//当前机器中
NSNetworkDomainMask = 4,//网络中可见的主机
NSSystemDomainMask = 8,//系统目录,不可修改(/System)
NSAllDomainsMask = 0x0ffff,//全部
};
typedef NSUInteger NSSearchPathDomainMask;

二.存储方式

(一).属性列表(plist)
array,dictionary,data,string,NSNumber,NSDate 等ns对象直接写入plist文件中保存.
(二).归档文件
实现NSCoding协议(NSCopy也要实现?没实现也成功了。。)

编解码类说明

NSKeyedArchiver

创建
- (id)initForWritingWithMutableData:(NSMutableData *)data // 归档数据写到data中
归档数据
+ (NSData *)archivedDataWithRootObject:(id)rootObject // 归档到data中
+ (BOOL)archiveRootObject:(id)rootObject toFile:(NSString *)path // 归档到文件中
- (void)finishEncoding // 调用后不能继续归档数据,归档结束必须调用(公共方法归档的不用理这个了)
– outputFormat // data编码方式,xml还是二进制
– setOutputFormat:
编码数据
– encodeBool:forKey:
– encodeBytes:length:forKey:
– encodeConditionalObject:forKey:
– encodeDouble:forKey:
– encodeFloat:forKey:
– encodeInt:forKey:
– encodeInt32:forKey:
– encodeInt64:forKey:
– encodeObject:forKey:
代理委托
– delegate
– setDelegate:

– archiver:didEncodeObject:
– archiverDidFinish:
– archiver:willEncodeObject:
– archiverWillFinish:
– archiver:willReplaceObject:withObject:

类和类名
+ setClassName:forClass:
+ classNameForClass:
– setClassName:forClass:
– classNameForClass:
异常
extern NSString *NSInvalidArchiveOperationException;

NSKeyedUnarchiver

创建
– initForReadingWithData:
取消归档
+ (id)unarchiveObjectWithData:(NSData *)data // 从data中得到实现归档的对象
+ (id)unarchiveObjectWithFile:(NSString *)path // 从文件中得到
解码数据
- (BOOL)containsValueForKey:(NSString *)key // 是否包含给定的key编码对象
– decodeBoolForKey:
– decodeBytesForKey:returnedLength:
– decodeDoubleForKey:
– decodeFloatForKey:
– decodeIntForKey:
– decodeInt32ForKey:
– decodeInt64ForKey:
– decodeObjectForKey:
- (void)finishDecoding // 通知委托解码结束,调用后不能再继续解码
代理委托
– delegate
– setDelegate:

– unarchiver:cannotDecodeObjectOfClassName:originalClasses:
– unarchiver:didDecodeObject:
– unarchiver:willReplaceObject:withObject:
Finishing Decoding
– unarchiverDidFinish:
– unarchiverWillFinish:

类名
+ setClass:forClassName:
+ classForClassName:
– setClass:forClassName:
– classForClassName:
异常
NSString *NSInvalidUnarchiveOperationException;


(三).CoreData
xcdatamodeld文件中Entity的三种属性:
Attributes: 对应的Obj-c类的接口变量.
Relationships: Entity之间的关系,to-one,or to-many.
Fetched properties: 对上面Relationship的过滤?参考参考1

对应文件存储形式

COREDATA_EXTERN NSString * const NSSQLiteStoreType NS_AVAILABLE(10_4, 3_0);// SQLite形式存储
COREDATA_EXTERN NSString * const NSXMLStoreType NS_AVAILABLE(10_4, NA);// ios不可用
COREDATA_EXTERN NSString * const NSBinaryStoreType NS_AVAILABLE(10_4, 3_0);// 二进制形式存储
COREDATA_EXTERN NSString * const NSInMemoryStoreType NS_AVAILABLE(10_4, 3_0);// 内存中

基本使用过程(括号中参考sql术语)
NSManagedObjectModel对象 获取工程中xcdatamodeld文件设置的模版(就是你的数据库有哪些表,表中有哪些字段的一种说明)
NSPersistentStoreCoordinator对象 根据上面的模版生成或对应的一个文件(数据库文件,具体的数据文件)
NSManagedObjectContext对象 上面文件的操作的空间,增删改查都通过这里进行
NSEntityDescription对象 得到上面context中的一个表
NSFetchRequest对象 对上面表的一些具体操作,增删改查
- (NSArray *)executeFetchRequest:(NSFetchRequest *)request error:(NSError **)error; 使用这个方法执行上面的request
如果增删改了context,记得保存。结束

过程示例:

NSManagedObjectContext *managedObjectContext = nil;
// 得到模版
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"YOUR_XCDATAMODELD_FILE_NAME" withExtension:@"momd"];
NSManagedObjectModel* managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
// 具体文件,DOCUMENT_DICRECTORY应该是nsurl的..
NSURL *storeURL = [@"DOCUMENT_DICRECTORY" URLByAppendingPathComponent:@"SQLITE.sqlite"];
NSError *error = nil;
NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managedObjectModel];
// 使用SQLite存储
if (![coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {

// 出错
} 
else
{
// 得到操作空间
managedObjectContext = [[NSManagedObjectContext alloc] init];
[managedObjectContext setPersistentStoreCoordinator:coordinator];
}

// 得到具体的表
NSEntityDescription *entityDescription = [NSEntityDescription
entityForName:@"ONE_ENTITY_NAME"
inManagedObjectContext:managedObjectContext];
// 操作语句
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entityDescription];
// 操作语句的条件
NSPredicate *pred = [NSPredicate predicateWithFormat:@"PREDICATE_SECTION"];
[request setPredicate:pred];

NSManagedObject *manageObject = nil;
// 执行操作,得到多条具体数据
NSArray *objects = [managedObjectContext executeFetchRequest:request error:&error];

if (objects == nil) {
// 出错

}
if ([objects count] > 0)
// 多条,取第一条
manageObject = [objects objectAtIndex:0];
else
// 没有相应的,就创建
manageObject = [NSEntityDescription
insertNewObjectForEntityForName:@"TABLE_NAME"
inManagedObjectContext:managedObjectContext];
// 改变她的一个字段的值 
[manageObject setValue:@"VALUE" forKey:@"ONE_FIELD_NAME_OF_THE_TABLE"];

[request release];
// 保存,结束
[managedObjectContext save:&error];


(四).SQLite
引入SQLite库,加入头文件,使用C API操作.繁琐的地方在于只能存储c数据格式,需要来回转换.

过程示例:

// 声明数据库
sqlite3 *database;
// 打开
if (sqlite3_open("数据库文件路径", &database) != SQLITE_OK) {
sqlite3_close(database);
// 出错
}

char *errorMsg;
// 执行无返回语句
if (sqlite3_exec (database, "增删改创语句",NULL, NULL, &errorMsg) != SQLITE_OK) {
sqlite3_close(database);
// 出错
}
sqlite3_stmt *statement;
// 执行查询语句
if (sqlite3_prepare_v2(database, "查询语句",-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);
}
// 结束遍历
sqlite3_finalize(statement);
}
// 关闭数据库
sqlite3_close(database);
分享到:
评论

相关推荐

    iphone开发入门经典源码

    13.3 小结 13.4 问与答 13.5 作业 第14章 存储应用程序首选项 第15章 使用表视图显示和导航数据 第16章 读写数据 第17章 创建可旋转及调整大小的用户界面 第18章 扩展触摸界面 第19章 使用加速计输入检测移动 第20章...

    iPhone开发秘籍

    iPhone开发秘籍 The iPhone Developer's Cookbook Building Applications with the iPhone SDK 本电子书共295页 Amazon超级畅销书 大量未公开的绝技,带你深入iPhone开发秘境 ...11.4 小结... 282

    iPhone开发秘籍.part2.rar

    1.14 小结.....29 第2章视图......30 2.1 UIView 和UIWindow...30 2.1.1 层次结构.....30 2.1.2 几何特征.....31 2.1.3 手势.....34 2.2 秘诀:添加递进式子视图.....34 2.3 秘诀:拖动视图.....36 2.3.1 UITouch......

    iPhone开发秘籍.part4.rar

    1.14 小结.....29 第2章视图......30 2.1 UIView 和UIWindow...30 2.1.1 层次结构.....30 2.1.2 几何特征.....31 2.1.3 手势.....34 2.2 秘诀:添加递进式子视图.....34 2.3 秘诀:拖动视图.....36 2.3.1 UITouch......

    iPhone开发秘籍.part1.rar

    1.14 小结.....29 第2章视图......30 2.1 UIView 和UIWindow...30 2.1.1 层次结构.....30 2.1.2 几何特征.....31 2.1.3 手势.....34 2.2 秘诀:添加递进式子视图.....34 2.3 秘诀:拖动视图.....36 2.3.1 UITouch......

    Objective-C2.0程序设计

    2.4 小结 2.5 练习 第3章 类、对象和方法 3.1 到底什么是对象 3.2 实例和方法 3.3 用于处理分数的Objective-C类 3.4 @interface部分 3.4.1 选择名称 3.4.2 实例变量 3.4.3 类和实例方法 3.5 @implementation部分 ...

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

    2.4 本章小结 15 第三章 跨域交互缓存处理设计 17 3.1 跨域交互缓存处理需求 17 3.1.1 缓存技术WebStorage 17 3.1.2 跨域交互缓存处理需求 17 3.1.3 页面回退管理需求 17 3.2 缓存处理机制 18 3.2.1 跨域缓存处理 18...

Global site tag (gtag.js) - Google Analytics