首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Iphone >

iPhone数据储存小结

2012-06-29 
iPhone数据存储小结From:http://www.uplook.cn/index-Index-show-view17939.html??首选项设置存储NSUserDe

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 返回临时文件目录

相关变量定义

NSSearchPathDirectoryenum {NSApplicationDirectory = 1,//Supported applications (/Applications)NSDemoApplicationDirectory,//Unsupported applications and demonstration versionsNSDeveloperApplicationDirectory,//Developer applications (/Developer/Applications)NSAdminApplicationDirectory,//System and network administration applicationsNSLibraryDirectory,//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 InformationNSDesktopDirectory = 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 = [NSEntityDescriptionentityForName:@"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 = [NSEntityDescriptioninsertNewObjectForEntityForName:@"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);

热点排行