当前位置:操作系统 > Unix/Linux >>

数据存储小结

 

 

首选项设置存储

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"]

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,