数据存储小结首选项设置存储NSUserDefaults以及通过它控制的SettingBundle?NSUserDefaults用来保存 一些设置,他会自动写到何时的位置。NSUbiquitousKeyValueStore多平台同步设置,限制是大小64k,开启ent itlement,唯一AppleID(还要考虑无法连接到iCloud网络时的情形)文件存储一.目录描述Home>/AppName.appbundle目录,包括程序本身。往里面些东西会导致签名改变和重启程序。初始同步后iTunes不 备份此目录。/Documents/存储用户文档和程序数据。通过文件共享可以使其可见。iTun es备份之。/Documents/Inbox其他程序要求本程序打开的文档。可读删,不可增加修 改。要改变可以先移出来。iTunes备份之。/Library/非用户数据文件存储的根目录。用 其中标准或自定义的文件夹备份不被用户可见的数据。不应用这个目录存储用户数据。iTunes备份之。~Library/Applica tionSupport/为用户创建管理的资源和数据文件。用这个目录存储程序状态信息,下载的文件甚至用户创 建但同意你管理的数据。自动保存文件。~/Library/Caches/用来存储缓存文件或者程序可以简单重 建的文件的目录。天地棋牌http://www.dadiqipaigw.cn/tmp/临时文 件目录,可能被系统删除,不应期望始终存在。不被iTunes备份。得到目录地址URLsForDirectory:inDomains: method返回NSURL形式的目录地址NSSearchPathForDirectoriesInDomains返回字符串形式 的目录地址NSHomeDirectory返回程序根目录NSTemporaryDirectory返回临时文件目录相关变量定义NS SearchPathDirectoryenum{NSApplicationDirectory=1,//Supporteda pplications(/Applications)NSDemoApplicationDirectory,//Unsupport edapplicationsanddemonstrationversionsNSDeveloperApplicationD irectory,//Developerapplications(/Developer/Applications)NSAdmi nApplicationDirectory,//Systemandnetworkadministrationapplica tionsNSLibraryDirectory,//Varioususer-visibledocumentation,sup port,andconfigurationfiles(/Library)NSDeveloperDirectory,//De veloperresources(/Developer)NSUserDirectory,//Userhomedirecto ries(/Users)NSDocumentationDirectory,//NSDocumentDirectory,//NSC oreServiceDirectory,//Locationofcoreservices(System/Library/C oreServices)NSAutosavedInformationDirectory=11,//Locationofus er’sautosaveddocumentsLibrary/AutosaveInformationNSDesktopDir ectory=12,//NSCachesDirectory=13,//Locationofdiscardableca chefiles(Library/Caches)NSApplicationSupportDirectory=14,//Lo cationofapplicationsupportfiles(Library/ApplicationSupport) NSDownloadsDirectory=15,//NSInputMethodsDirectory=16,//NSMovi esDirectory=17,//NSMusicDirectory=18,//NSPicturesDirectory= 19,//NSPrinterDescriptionDirectory=20,//NSSharedPublicDirectory =21,//NSPreferencePanesDirectory=22,//NSItemReplacementDirect ory=99,//NSAllApplicationsDirectory=100,//NSAllLibrariesDirec tory=101//};typedefNSUIntegerNSSearchPathDirectory;enum{NSUs erDomainMask=1,//用户主目录中NSLocalDomainMask=2,//当前机器中NSNetworkDo mainMask=4,//网络中可见的主机NSSystemDomainMask=8,//系统目录,不可修改(/System )NSAllDomainsMask=0x0ffff,//全部};typedefNSUIntegerNSSearchPath DomainMask;二.存储方式(一).属性列表(plist)array,dictionary,data,string,NSNu mber,NSDate等ns对象直接写入plist文件中保存.(二).归档文件实现NSCoding协议(NSCopy也要实现?没 实现也成功了。。)编解码类说明NSKeyedArchiver创建-(id)initForWritingWithMutableDa ta:(NSMutableData)data//归档数据写到data中638棋牌http://www.rodlg.c om归档数据+(NSData)archivedDataWithRootObject:(id)rootObject//归档 到data中+(BOOL)archiveRootObject:(id)rootObjecttoFile:(NSString )path//归档到文件中-(void)finishEncoding//调用后不能继续归档数据,归档结束必须调用(公共方 法归档的不用理这个了)–outputFormat//data编码方式,xml还是二进制–setOutputFormat:编码数 据–encodeBool:forKey:–encodeBytes:length:forKey:–encodeConditiona lObject:forKey:–encodeDouble:forKey:–encodeFloat:forKey:–encodeIn t:forKey:–encodeInt32:forKey:–encodeInt64:forKey:–encodeObject:fo rKey:代理委托–delegate–setDelegate:–archiver:didEncodeObject:–archive rDidFinish:–archiver:willEncodeObject:–archiverWillFinish:–archiv er:willReplaceObject:withObject:类和类名+setClassName:forClass:+cla ssNameForClass:–setClassName:forClass:–classNameForClass:异常extern NSStringNSInvalidArchiveOperationException;NSKeyedUnarchiver创建 –initForReadingWithData:取消归档+(id)unarchiveObjectWithData:(NSData )data//从data中得到实现归档的对象+(id)unarchiveObjectWithFile:(NSString )path//从文件中得到解码数据-(BOOL)containsValueForKey:(NSString)key //是否包含给定的key编码对象–decodeBoolForKey:–decodeBytesForKey:returnedLen gth:–decodeDoubleForKey:–decodeFloatForKey:–decodeIntForKey:–deco deInt32ForKey:–decodeInt64ForKey:–decodeObjectForKey:-(void)fini shDecoding//通知委托解码结束,调用后不能再继续解码代理委托–delegate–setDelegate:–unarc hiver:cannotDecodeObjectOfClassName:originalClasses:–unarchiver:d idDecodeObject:–unarchiver:willReplaceObject:withObject:Finishing Decoding–unarchiverDidFinish:–unarchiverWillFinish:类名+setClass: forClassName:+classForClassName:–setClass:forClassName:–classFor ClassName:异常NSStringNSInvalidUnarchiveOperationException;?(三).C oreDataxcdatamodeld文件中Entity的三种属性:Attributes:对应的Obj-c类的接口变量.Rela tionships:Entity之间的关系,to-one,orto-many.Fetchedproperties:对上面R elationship的过滤?参考参考1对应文件存储形式COREDATA_EXTERNNSStringconstNSSQ LiteStoreTypeNS_AVAILABLE(10_4,3_0);//SQLite形式存储COREDATA_EXTER NNSStringconstNSXMLStoreTypeNS_AVAILABLE(10_4,NA);//ios不可 用COREDATA_EXTERNNSStringconstNSBinaryStoreTypeNS_AVAILABLE( 10_4,3_0);//二进制形式存储COREDATA_EXTERNNSStringconstNSInMemoryS toreTypeNS_AVAILABLE(10_4,3_0);//内存中基本使用过程(括号中参考sql术语)NSManage dObjectModel对象获取工程中xcdatamodeld文件设置的模版(就是你的数据库有哪些表,表中有哪些字段的一种说明) NSPersistentStoreCoordinator对象根据上面的模版生成或对应的一个文件(数据库文件,具体的数据文件)NS ManagedObjectContext对象上面文件的操作的空间,增删改查都通过这里进行NSEntityDescription对 象得到上面context中的一个表NSFetchRequest对象对上面表的一些具体操作,增删改查-(NSArray)e xecuteFetchRequest:(NSFetchRequest)requesterror:(NSError)er ror;使用这个方法执行上面的request如果增删改了context,记得保存。结束过程示例:NSManagedObjectC ontextmanagedObjectContext=nil;//得到模版NSURLmodelURL=[[NSB undlemainBundle]URLForResource:@"YOUR_XCDATAMODELD_FILE_NAME"w ithExtension:@"momd"];NSManagedObjectModelmanagedObjectModel= [[NSManagedObjectModelalloc]initWithContentsOfURL:modelURL];// 具体文件,DOCUMENT_DICRECTORY应该是nsurl的..NSURLstoreURL=[@"DOCUMENT_ DICRECTORY"URLByAppendingPathComponent:@"SQLITE.sqlite"];NSError error=nil;NSPersistentStoreCoordinatorcoordinator=[[NSPer sistentStoreCoordinatoralloc]initWithManagedObjectModel:managed ObjectModel];//使用SQLite存储if(![coordinatoraddPersistentStoreWit hType:NSSQLiteStoreTypeconfiguration:nilURL:storeURLoptions:ni lerror:&error]){?//出错}else{//得到操作空间managedObjectContext=[[N SManagedObjectContextalloc]init];[managedObjectContextsetPersi stentStoreCoordinator:coordinator];}?//得到具体的表NSEntityDescription entityDescription=[NSEntityDescriptionentityForName:@"ONE_ENT ITY_NAME"inManagedObjectContext:managedObjectContext];//操作语句NSFe tchRequestrequest=[[NSFetchRequestalloc]init];[requestsetE ntity:entityDescription];//操作语句的条件NSPredicatepred=[NSPredica tepredicateWithFormat:@"PREDICATE_SECTION"];[requestsetPredicat e:pred];?NSManagedObjectmanageObject=nil;//执行操作,得到多条具体数据NSAr rayobjects=[managedObjectContextexecuteFetchRequest:request error:&error];?if(objects==nil){//出错?}if([objectscount]> 0)//多条,取第一条manageObject=[objectsobjectAtIndex:0];else//没有相应的 ,就创建manageObject=[NSEntityDescriptioninsertNewObjectForEntityFo rName:@"TABLE_NAME"inManagedObjectContext:managedObjectContext];/ /改变她的一个字段的值[manageObjectsetValue:@"VALUE"forKey:@"ONE_FIELD_NA ME_OF_THE_TABLE"];?[requestrelease];//保存,结束[managedObjectContex tsave:&error];?(四).SQLite引入SQLite库,加入头文件,使用CAPI操作.繁琐的地方在于只能存储c数 据格式,需要来回转换.易火棋牌http://www.482223.com过程示例://声明数据库sqlite3datab ase;//打开if(sqlite3_open("数据库文件路径",&database)!=SQLITE_OK){sq lite3_close(database);//出错}?charerrorMsg;//执行无返回语句if(sqlite3_exec(database,"增删改创语句",NULL,NULL,&errorMsg)!=SQLITE_OK){sqlite3_close(database);//出错}sqlite3_stmtstatement;//执行查询语句if(sqlite3_prepare_v2(database,"查询语句",-1,&statement,nil)==SQLITE_OK){//遍历结果while(sqlite3_step(statement)==SQLITE_ROW){introw=sqlite3_column_int(statement,0);//第一列数据charrowData=(char)sqlite3_column_text(statement,1);}//结束遍历sqlite3_finalize(statement);}//关闭数据库sqlite3_close(database); |
|