ios 数据持久化的三种方式

IOS常用的三种本地数据持久化方式:

1:属性序列化列表 存储到文件 plist;

2:归档序列化,对模型数据进行归档;

3:本地数据库存储,嵌入式sqlite;

其实这三种方式都是把数据存储到本地文件里边,只是实现方式和使用的场景不同而已,复杂程度从上到下增加。

除此之外,还有一种方式存储数据,就是使用NSUserDefaults,它已键值对的形式记录应用程序的全局设置,其实settings.bundle里边的数据就是存在NSUserDefaults的。

 

主要代码如下:

 

方式一:plist

 

Objective-c代码   收藏代码
  1. //先获取plist文件路径  
  2. NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
  3.     NSString *documentDirectory = [path objectAtIndex:0];  
  4.     filePath = [documentDirectory stringByAppendingPathComponent:@"xxx.plist"];  
  5. //把数据写入plist  
  6. NSArray *arr = [[NSArray allocl] initWithObjects:A,B,C,nil];  
  7. [arr writeToFile:self.filePath atomically:YES];  
  8.   
  9. //从plist取数据  
  10. NSMutableArray *arr = [[NSMutableArray alloc] initWithContentsOfFile:filePath];  

 

方式二:archiver

 

Objective-c代码   收藏代码
  1. //创建继承NSCoding,NSCopying协议的数据模型User,必须实现以下三个方法:  
  2. @synthesize passport;  
  3. @synthesize password;  
  4. @synthesize nickname;  
  5. @synthesize remark;  
  6.   
  7. - (void)encodeWithCoder:(NSCoder *)encoder{  
  8.     [encoder encodeObject:passport forKey:kPassportKey];  
  9.     [encoder encodeObject:password forKey:kPasswordKey];  
  10.     [encoder encodeObject:nickname forKey:kNicknameKey];  
  11.     [encoder encodeObject:remark forKey:kRemarkKey];  
  12. }  
  13.   
  14. - (id)initWithCoder:(NSCoder *)decoder{  
  15.     if (self=[super init]) {  
  16.         self.passport = [decoder decodeObjectForKey:kPassportKey];  
  17.         self.password = [decoder decodeObjectForKey:kPasswordKey];  
  18.         self.nickname = [decoder decodeObjectForKey:kNicknameKey];  
  19.         self.remark = [decoder decodeObjectForKey:kRemarkKey];  
  20.     }  
  21.     return self;  
  22. }  
  23.   
  24. - (id)copyWithZone:(NSZone *)zone{  
  25.     User *copy = [[[self class] allocWithZone:zone] init];  
  26.     passport = [self.passport copy];  
  27.     password = [self.password copy];  
  28.     nickname = [self.nickname copy];  
  29.     remark = [self.remark copy];  
  30.     return copy;  
  31. }  
  32.   
  33. //获取归档文件  
  34. - (NSString *)dataFilePath{  
  35.     NSArray *arr = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
  36.     return [(NSString *)[arr objectAtIndex:0] stringByAppendingPathComponent:@"archiver"];  
  37. }  
  38.   
  39. //初始化数据模型并写入归档文件  
  40. User *user = [[User alloc] init];  
  41.     user.passport = @"alec030711";  
  42.     user.password = @"abcd";  
  43.     user.nickname = @"alecchyi";  
  44.     user.remark = @"fuck";  
  45.       
  46.     NSMutableData *data = [[NSMutableData alloc] init];  
  47.     NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];  
  48.     [archiver encodeObject:user forKey:@"kData"];  
  49.     [archiver finishEncoding];  
  50.     [data writeToFile:[self dataFilePath] atomically:YES];  
  51.     [archiver release];  
  52.     [data release];  
  53.     [user release];  
  54.   
  55. //从归档文件读数据  
  56. NSMutableData *data = [[NSMutableData alloc] initWithContentsOfFile:[self dataFilePath]];  
  57.     NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];  
  58.     User *user = [unArchiver decodeObjectForKey:@"kData"];  
  59.     [unArchiver finishDecoding];  
  60.   
  61.     [data release];  
  62.     [unArchiver release];  

 

 方式三:sqlite

Objective-c代码   收藏代码
  1. sqlite3 *database;  
  2. //打开数据库,没有则创建  
  3. if (sqlite3_open([数据库文件路径 UTF8String], &database) != SQLITE_OK) {  
  4.     sqlite3_close(database);  
  5. }  
  6. //创建表  
  7. char *errorStr;  
  8. NSString *createTable = @"drop table if exists users;create table if not exists users (id integer primary key,nickname text);";  
  9. if (sqlite3_exec(database,[createTable UTF8String],NULL,NULL,&errorStr)!=SQLITE_OK) {  
  10.     sqlite3_close(database);  
  11. }  
  12. //插入数据  
  13. for (int x=1; x<5; x++) {  
  14.     NSString *insert = [[NSString alloc] initWithFormat:@"insert or replace into users (id,nickname) values (%d,'ruby%d')",x,x];  
  15.     if (sqlite3_exec(database,[insert UTF8String],NULL,NULL,&errorStr)!=SQLITE_OK) {  
  16.         sqlite3_free(database);  
  17.     }  
  18.     [insert release];  
  19. }  
  20. //查询表数据  
  21. NSString *query = @"select nickname,id from users";  
  22. sqlite3_stmt *statememt;  
  23. if (sqlite3_prepare_v2(database,[query UTF8String],-1,&statememt,nil)==SQLITE_OK) {  
  24.     while (sqlite3_step(statememt)==SQLITE_ROW) {  
  25.         char *rowData = (char *)sqlite3_column_text(statememt,0);  
  26.         NSString *nickname = [[NSString alloc] initWithUTF8String:rowData];  
  27.         [nickname release];  
  28.     }  
  29. }  
  30. sqlite3_finalize(statememt);  
  31. //关闭数据库  
  32. sqlite3_close(database);  
  33.   
  34. //关键就这几个方法和几个语句:sqlite3_open, sqlite3_exec,sqlite3_prepare_v2  sqlite3_step sqlite_finalize,sqlite3_close。  

 方式三需要引入libsqlite3.lib,由于sqlite数据库是C实现的,存储也是C形式存储,所以在取出数据时需要用UTF8String转换成objecitve-c形式的字符串

转载于:https://www.cnblogs.com/flylovesky/p/3258084.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值