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的操作存储。

 

 

 

 

 

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。