IOS开发数据存储篇—IOS中的几种数据存储方式

IOS开发数据存储篇—IOS中的几种数据存储方式

发表于2016/4/5 21:02:09  421人阅读git

分类: 数据存储github

在项目开发当中,咱们常常会对一些数据进行本地缓存处理。离线缓存的数据通常都保存在APP所在的沙盒之中。通常有如下几种:objective-c

一、PList(XML属性列表)

在使用plist进行数据存储和读取,只适用于系统自带的一些经常使用类型才能用,且必须先获取路径相对麻烦sql

//写入文件 NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; NSString *path = [doc stringByAppendingPathComponent:@"myself.plist"]; NSDictionary *dict = @{@"name": @"yixiang"}; [dict writeToFile:path atomically:YES]; //读取文件 NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];

二、偏好设置(NSUserDefaults)数据库

将全部的东西都保存在同一个文件夹下面,且主要用于存储应用的设置信息)缓存

//写入文件 NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults]; [defaults setObject:@"yixiang" forKey:@"name"]; [defaults setInteger:27 forKey:@"age"]; [defaults synchronize]; //读取文件 NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults]; NSString *name=[defaults objectForKey:@"name"]; NSInteger age=[defaults integerForKey:@"age"];

三、归档(NSCoding NSKeyedArchiver NSKeyedUnarchiver)

由于前二者都有一个致命的缺陷,只能存储经常使用的类型。归档能够实现把自定义的对象存放在文件中。markdown

须要保存的对象必须遵照NSCoding协议,而且实现该协议中- (void)encodeWithCoder:(NSCoder )aCoder和 - (id)initWithCoder:(NSCoder )aDecoder方法。多线程

YXPerson.h文件以下:dom

@interface YXPerson : NSObject<NSCoding> @property(nonatomic,copy) NSString *name; @property(nonatomic,assign) int age; @end

YXPerson.m文件以下:函数

#import "YYPerson.h" @implementation YYPerson -(void)encodeWithCoder:(NSCoder *)aCoder{ [aCoder encodeObject:self.name forKey:@"name"]; [aCoder encodeInteger:self.age forKey:@"age"]; } -(id)initWithCoder:(NSCoder *)aDecoder{ if (self=[super init]) { self.name=[aDecoder decodeObjectForKey:@"name"]; self.age=[aDecoder decodeIntegerForKey:@"age"]; } return self; } @end

在ViewController中对它进行写入和读取

//写入对象 YXPerson *p=[[YXPerson alloc]init]; p.name=@"yixiang"; p.age=27; NSString *docPath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject]; NSString *path=[docPath stringByAppendingPathComponent:@"person.yixiang"]; [NSKeyedArchiver archiveRootObject:p toFile:path]; //读取对象 YXPerson *p=[NSKeyedUnarchiver unarchiveObjectWithFile:path];

 

四、SQLITE数据库

上述三种方法都没法存储大批量的数据,有性能的问题。

下面简单介绍一下,如何打开数据库,新增一张表格,而后对其进行增删改查的操做。

- (void)openDB{ //获取数据库文件路径 NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; NSString *fileName = [doc stringByAppendingPathComponent:@"students.sqlite"]; //将OC字符串转换为c语言的字符串 const char *cfileName = fileName.UTF8String; //打开数据库文件(若是数据库文件不存在,那么该函数会自动建立数据库文件) int result = sqlite3_open(cfileName, &_db); if (result == SQLITE_OK) {//打开成功 NSLog(@"成功打开数据库"); }else{ NSLog(@"打开数据库失败"); } } - (void)createTable{ //建立表 const char *sql = "CREATE TABLE IF NOT EXISTS t_student(id integer PRIMARY KEY AUTOINCREMENT,name text NOT NULL,age integer NOT NULL);"; char *errmsg= NULL; int result = sqlite3_exec(_db, sql, NULL, NULL, &errmsg); if (result==SQLITE_OK) { NSLog(@"建立表成功"); }else{ NSLog(@"建立表失败---%s",errmsg); } } - (void)insertData{ //插入数据 for (int i=0; i<10; i++) { //拼接sql语句 NSString *name = [NSString stringWithFormat:@"yixiangboy--%d",arc4random_uniform(100)]; int age = arc4random_uniform(20)+10; NSString *sql = [NSString stringWithFormat:@"INSERT INTO t_student (name,age) VALUES ('%@',%d);",name,age]; //执行SQL语句 char *errmsg = NULL; sqlite3_exec(_db, sql.UTF8String, NULL, NULL, &errmsg); if (errmsg) {//若是有错误信息 NSLog(@"插入数据失败--%s",errmsg); }else{ NSLog(@"插入数据成功"); } } } - (void)deleteData{ //删除age小于15的数据 NSString *sql = [NSString stringWithFormat:@"DELETE FROM t_student WHERE age<15"]; char *errmsg = NULL; sqlite3_exec(_db, sql.UTF8String, NULL, NULL, &errmsg); if (errmsg) { NSLog(@"删除数据失败"); }else{ NSLog(@"删除数据成功"); } } - (void)updateData{ //大于20岁的都置为20岁 NSString *sql = [NSString stringWithFormat:@"UPDATE t_student set age=20 WHERE age>20"]; char *errmsg = NULL; sqlite3_exec(_db, sql.UTF8String, NULL, NULL, &errmsg); if (errmsg) { NSLog(@"更新数据失败"); }else{ NSLog(@"更新数据成功"); } } - (void)queryData{ const char *sql = "SELECT id,name,age FROM t_student WHERE age<20"; sqlite3_stmt *stmt = NULL; //进行查询前的准备工做 if(sqlite3_prepare_v2(_db, sql, -1, &stmt, NULL)==SQLITE_OK){//SQL语句没有问题 NSLog(@"查询语句没有问题"); //每调用一次sqlite3_step函数,stmt就会指向下一条记录 while (sqlite3_step(stmt)==SQLITE_ROW) {//找到一条记录 //取出数据 //(1)取出第0个字段的值(int) int ID=sqlite3_column_int(stmt, 0); //(2)取出第一列字段的值(text) const unsigned char *name = sqlite3_column_text(stmt, 1); //(3)取出第二列字段的值(int) int age = sqlite3_column_int(stmt, 2); printf("%d %s %d\n",ID,name,age); } }else{ NSLog(@"查询语句有问题"); } }

五、FMDB

FMDB是IOS中一个著名的SQLite数据库操做的开源项目。项目地址为:https://github.com/ccgus/fmdb

。是对SQLIite数据库的C语言接口进行了一层封装,使其知足面向对象的操做,接口比原生的SQLite接口简洁不少。同时也提供一些多线程,缓存,线程池的功能。之后的博客将进行详细介绍,这里很少说了。

六、CoreData

是苹果公司提供的数据持久化的一种方案。之后的博客将进行详细介绍,这里很少说了。

联系方式

微博:新浪微博

博客:http://blog.csdn.net/yixiangboy

github:https://github.com/yixiangboy