iOS开发——数据持久化OC篇&总结
数据持久化总结
1 //1.沙盒:/Users/nono/Library/Application Support/iPhone Simulator/5.1/Applications/2D135859-1E80-4754-B36D-34A53C521DE3 2 /** 3 // 1、获取程序的Home目录 4 NSString *home = NSHomeDirectory(); 5 NSLog(@"应用程序目录:%@", home); 6 7 // 2、获取Documents目录 8 // NSUserDomainMask 代表从用户文件夹下找 9 // YES 代表展开路径中的波浪字符“~” 10 NSArray *documents = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 11 // 只有一个匹配目录,所以这个集合里面只有一个元素 12 NSString *doc = documents[0]; 13 NSLog(@"文档目录:%@", doc); 14 15 // 使用字符串拼接的方式获取目录名 16 // 不建议采用,因为新版本的操作系统可能会修改目录名 17 NSString *doc2 = [home stringByAppendingPathComponent:@"Documents"]; 18 NSLog(@"拼接文档目录:%@", doc2); 19 20 // 3、获取Cache目录 21 NSArray *caches = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); 22 NSString *cache = caches[0]; 23 NSLog(@"缓存目录:%@", cache); 24 25 // 4、获取Tmp目录 26 NSString *tmpDir = NSTemporaryDirectory(); 27 NSLog(@"临时目录:%@", tmpDir); 28 29 //5,NSUserDefaults 30 在A类中: 31 NSUserDefaults * userDefault = [NSUserDefaultsstandardUserDefaults]; 32 [userDefault setBool:YES forKey:@"isonline"]; 33 [userDefault setInteger:111 forKey:@"online_user_number"]; 34 ...等等。参见NSUserDefault用法。 35 36 在B中:获取A传递过来的参数 37 NSUserDefault * userDefault = [NSUserDefault standardUserDefault]; 38 BOOL isonline = [userDefault boolForKey:@"isonline"]; 39 NSInteger onlineUserNumber = [userDefault integerForKey:@"online_user_number"]; 40 41 */ 42 43 //2,属性列表 44 /** 45 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 46 NSString *docPath = [paths objectAtIndex:0]; 47 NSString *myFile = [docPath stringByAppendingPathComponent:@"my.list"]; 48 //读取文件 49 NSArray *array = [[NSArray alloc] initWithContentsOfFile:myFile]; 50 //操作完若修改了数据则,写入文件 51 [array writeToFile:myFile atomically:YES]; 52 */ 53 54 55 //3.对象归档 56 /** 57 #pragma NSCoding协议实现实现 58 - (void)encodeWithCoder:(NSCoder *)aCoder 59 { //encoder 60 [aCoder encodeObject:stringAforKey:@"1"]; 61 [aCoder encodeObject:stringBforKey:@"2"]; 62 } 63 - (id)initWithCoder:(NSCoder *)aDecoder 64 { 65 //decoder 66 if (self = [superinit]) { 67 stringA = [[aDecoder decodeObjectForKey:@"1"] retain]; 68 stringB = [[aDecoder decodeObjectForKey:@"2"] retain]; 69 } 70 returnself; 71 } 72 73 #pragma NSCopying协议实现 74 - (id)copyWithZone:(NSZone *)zone 75 { 76 TestObj *copy = [[[selfclass] allocWithZone:zone] init]; 77 copy.stringA = [[self.stringAcopyWithZone:zone] autorelease]; 78 copy.stringB = [[self.stringBcopyWithZone:zone] autorelease]; 79 return copy; 80 } 81 82 //读取归档文件 83 NSData *data = [[NSMutableDataalloc] initWithContentsOfFile:myFile]; 84 NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiveralloc] initForReadingWithData:data]; 85 TestObj * test = [unarchiver decodeObjectForKey:@"data"]; 86 [unarchiver finishDecoding]; 87 [data release]; 88 [unarchiver release]; 89 90 //写入归档文件 91 NSMutableData *data1 = [[NSMutableDataalloc] init]; 92 NSKeyedArchiver *archiver = [[NSKeyedArchiveralloc] initForWritingWithMutableData:data1]; 93 [archiver encodeObject:test forKey:@"data"]; 94 [archiver finishEncoding]; 95 [data writeToFile:myFile atomically:YES]; 96 [data1 release]; 97 [archiver release]; 98 [test release]; 99 */ 100 101 102 //4.数据库存储(SQLite3) 103 /** 104 //数据库操作 105 sqlite3 *database; 106 // const NSString * dbname = @"mydb" 107 int result; 108 //打开一个指定路径的现有的数据库,如果没有则会新建一个db库 109 result = sqlite3_open([myFile UTF8String], &database); 110 if (result != SQLITE_OK) { 111 sqlite3_close(database); 112 } 113 114 //创建一个db表 115 char *errorMsg; 116 NSString *sql_create_table = @"CREATE TABLE IF NOT EXISTS NONOTABLE 省略~~~~~~~~~~~~~"; 117 int result1 ; 118 //sqlite_exec用了针对sqlite3运行任何不要返回数据的命令,它用于执行更新,插入和删除。简单来说,这个方法执行的都是一些无需返回数据(虽然我们可能获取一个状态值。)。 119 result1 = sqlite3_exec(database, [sql_create_table UTF8String], NULL, NULL, &errorMsg); 120 121 //检索查询操作 122 int result2 ; 123 sqlite3_stmt *statment; 124 NSString *sql_selected = @"查询语句"; 125 result2 = sqlite3_prepare_v2(database, [sql_selected UTF8String], -1, &statment, nil); 126 if(result2 == SQLITE_OK){ 127 //单步操作 128 while (sqlite3_step(statment) == SQLITE_ROW) { 129 int row = sqlite3_column_int(statment, 0); 130 char * rpwData = sqlite3_column_text(statment, 1); 131 } 132 sqlite3_finalize(statment); 133 } 134 135 136 //绑定变量,既就是插入操作的一种变种,比如我么那上面提到sqlite_exec可以执行插入操作,插入内容直接是写在sql字窜里,但是考虑到字窜涉及到无效的符号以及会一些严重的注入漏洞(比如以前听过的引号符号)。 137 NSString *sql_bind = @"insert into foo value(?,?)"; 138 result2 = sqlite3_prepare_v2(database, [sql_selected UTF8String], -1, &statment, nil); 139 if(result2 == SQLITE_OK){ 140 sqlite3_bind_int(statment, 1, 235); 141 sqlite3_bind_text(statment, 2, "test", -1, nil); 142 sqlite3_finalize(statment); 143 } 144 if (sqlite3_step(statment) != SQLITE_DONE) 145 NSLog(@"error"); 146 sqlite3_finalize(statment); 147 148 149 sqlite3_close(database); 150 151 */ 152 153 154 //5.苹果公司提供的持久性工具Core Data 155 /* 156 一般需要定义以下Core Data的三个必备 157 NSPersistentStoreCoordinator *persistentStoreCoordinator; 158 NSManagedObjectModel *managedObjectModel; 159 NSManagedObjectContext *managedObjectContext; 160 以及使用时需要用到de 161 NSFetchedResultsController *fetchedResultsController; 162 */ 163 164 165 166 167 168 169 //其实对于ios数据存储,最常用和主要要掌握的就是属性列表和数据库,因为两个是出镜率比较高的。其他可能在数据存明显体现出储优势时,我们会去考虑用另外两种机制。基础的来说,必须掌握属性列表和sqlite的操作存储。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。