IOS常用的三种本地数据持久化方式:
1:属性序列化列表 存储到文件 plist;
2:归档序列化,对模型数据进行归档;
3:本地数据库存储,嵌入式sqlite;
其实这三种方式都是把数据存储到本地文件里边,只是实现方式和使用的场景不同而已,复杂程度从上到下增加。
除此之外,还有一种方式存储数据,就是使用NSUserDefaults,它已键值对的形式记录应用程序的全局设置,其实settings.bundle里边的数据就是存在NSUserDefaults的。
主要代码如下:
方式一:plist
//先获取plist文件路径
NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentDirectory = [path objectAtIndex:0];
filePath = [documentDirectory stringByAppendingPathComponent:@"xxx.plist"];
//把数据写入plist
NSArray *arr = [[NSArray allocl] initWithObjects:A,B,C,nil];
[arr writeToFile:self.filePath atomically:YES];
//从plist取数据
NSMutableArray *arr = [[NSMutableArray alloc] initWithContentsOfFile:filePath];
方式二:archiver
//创建继承NSCoding,NSCopying协议的数据模型User,必须实现以下三个方法:
@synthesize passport;
@synthesize password;
@synthesize nickname;
@synthesize remark;
- (void)encodeWithCoder:(NSCoder *)encoder{
[encoder encodeObject:passport forKey:kPassportKey];
[encoder encodeObject:password forKey:kPasswordKey];
[encoder encodeObject:nickname forKey:kNicknameKey];
[encoder encodeObject:remark forKey:kRemarkKey];
}
- (id)initWithCoder:(NSCoder *)decoder{
if (self=[super init]) {
self.passport = [decoder decodeObjectForKey:kPassportKey];
self.password = [decoder decodeObjectForKey:kPasswordKey];
self.nickname = [decoder decodeObjectForKey:kNicknameKey];
self.remark = [decoder decodeObjectForKey:kRemarkKey];
}
return self;
}
- (id)copyWithZone:(NSZone *)zone{
User *copy = [[[self class] allocWithZone:zone] init];
passport = [self.passport copy];
password = [self.password copy];
nickname = [self.nickname copy];
remark = [self.remark copy];
return copy;
}
//获取归档文件
- (NSString *)dataFilePath{
NSArray *arr = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
return [(NSString *)[arr objectAtIndex:0] stringByAppendingPathComponent:@"archiver"];
}
//初始化数据模型并写入归档文件
User *user = [[User alloc] init];
user.passport = @"alec030711";
user.password = @"abcd";
user.nickname = @"alecchyi";
user.remark = @"fuck";
NSMutableData *data = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archiver encodeObject:user forKey:@"kData"];
[archiver finishEncoding];
[data writeToFile:[self dataFilePath] atomically:YES];
[archiver release];
[data release];
[user release];
//从归档文件读数据
NSMutableData *data = [[NSMutableData alloc] initWithContentsOfFile:[self dataFilePath]];
NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
User *user = [unArchiver decodeObjectForKey:@"kData"];
[unArchiver finishDecoding];
[data release];
[unArchiver release];
方式三:sqlite
sqlite3 *database;
//打开数据库,没有则创建
if (sqlite3_open([数据库文件路径 UTF8String], &database) != SQLITE_OK) {
sqlite3_close(database);
}
//创建表
char *errorStr;
NSString *createTable = @"drop table if exists users;create table if not exists users (id integer primary key,nickname text);";
if (sqlite3_exec(database,[createTable UTF8String],NULL,NULL,&errorStr)!=SQLITE_OK) {
sqlite3_close(database);
}
//插入数据
for (int x=1; x<5; x++) {
NSString *insert = [[NSString alloc] initWithFormat:@"insert or replace into users (id,nickname) values (%d,'ruby%d')",x,x];
if (sqlite3_exec(database,[insert UTF8String],NULL,NULL,&errorStr)!=SQLITE_OK) {
sqlite3_free(database);
}
[insert release];
}
//查询表数据
NSString *query = @"select nickname,id from users";
sqlite3_stmt *statememt;
if (sqlite3_prepare_v2(database,[query UTF8String],-1,&statememt,nil)==SQLITE_OK) {
while (sqlite3_step(statememt)==SQLITE_ROW) {
char *rowData = (char *)sqlite3_column_text(statememt,0);
NSString *nickname = [[NSString alloc] initWithUTF8String:rowData];
[nickname release];
}
}
sqlite3_finalize(statememt);
//关闭数据库
sqlite3_close(database);
//关键就这几个方法和几个语句:sqlite3_open, sqlite3_exec,sqlite3_prepare_v2 sqlite3_step sqlite_finalize,sqlite3_close。
方式三需要引入libsqlite3.lib,由于sqlite数据库是C实现的,存储也是C形式存储,所以在取出数据时需要用UTF8String转换成objecitve-c形式的字符串
分享到:
相关推荐
ios 数据存储,数据持久化,包含Preference 、文件存储、归档、数据库 、 CoreData的使用
比较简单的就不写例子了,用的是最新的Xcode8.2.1
iOS中有五种持久化数据的方式:属性列表、对象归档、NSUserDefault、SQLite3和Core Data 本文章讲述通过属性列表的方式持久化数据,这个方法也是我们平时最经常用到的方式。比如应用程序的配置和个性化的设置,一般...
iOS中有五种持久化数据的方式:属性列表、对象归档、NSUserDefaults、SQLite3和Core Data。 本文介绍对象归档来持久化数据。归档的作用就是将对象以文件的形式保存到磁盘中,以使得数据序列化和持久化。 使用归档的...
iOS中几种数据持久化方案.pdf
iOS数据持久化之属性列表和归档,NSUserDefaults,Plist,NSKeyedArchiver
iOS中有五种持久化数据的方式:属性列表、对象归档、NSUserDefaults、SQLite3和Core Data NSUserDefaults官方文档介绍: NSUserDefaults类为和默认系统类交互提供了一种编程接口。默认系统允许应用程序去定制其行为...
实例中包含三种保持数据的方法,第一种:实用属性列表,第二种:对象归档,第三种:使用Iphone的嵌入式数据库(SQLite3),让你对数据持久化有一个更全面的认识。
Demo里分别添加UISegmentedControl、UIActivityIndicatorView、UISwitch、...详细博文说明:https://github.com/pro648/tips/blob/master/iOS数据持久化.md 源码地址:https://github.com/pro648/BasicDemos-iOS
一行代码持久化网络数据 详见Github: [代码地址](:) https://github.com/CoderZhuXH/XHNetworkCache
iOS之数据持久化-NSUserDefaults,在进入后台模式时候,将进行数据保存!
使用几个小例子分别实现 归档NSKeyedArchiver、NSUserDefaults、plist文件数据存储,简单直观,代码地址https://github.com/fancyLi/data-store。
这是关于iOS数据存储,FMDB封装,SQL使用等,有需要的小伙伴可以看看!
凑着刚用完的余热,把持久化简单的封装了一下。需要使用的朋友直接把 JGGchijiuhua类拉进工程,直接调用类方法即可。用法很简单。
所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据。在iOS开发中,有很多数据持久化的方案(plist、preference(userdefault)、NScoder(归档))
持久化保存数据
FMDB数据持久化库的演示:表的创建以及数据的增、删、改、查;兼有UISearchController、模糊搜索功能的使用演示。很荣幸能和同行分享!希望能帮到大家。加强技术交流,共同进步!
对FMDB进行了二次封装,很轻松实现了数据持久化操作,文件内ReadMeForLHMFMDBManager有关于代码的详细用法,每步骤都有解释。需要的童靴下载吧。
数据的归档和解档,和数据列表
网上有很多种数据持久化的方法,如实现自己实现I/O、数据库、云或则走第三方接口等等。但是有时候可能只是进行一些简单的数据存储,如用户的偏好设置、用户的sessionID等等,这时候使用上述方法便显得有点兴师动众了...