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

 

 

 

 

 

 

你可能感兴趣的:(ios开发)