IOS- 数据存储
在iOS开发过程中,不管是做什么应用,都会碰到数据保存的问题。将数据保存到本地,能够让程序的运行更加流畅,不会出现让人厌恶的菊花形状,使得用户体验更好。下面介绍一下数据保存的方式:
1.NSKeyedArchiver:
采用归档的形式来保存数据,该数据对象需要遵守NSCoding协议,并且该对象对应的类必须提供encodeWithCoder:和
initWithCoder:方法。前一个方法告诉系统怎么对对象进行编码,而后一个方法则是告诉系统怎么对对象进行解码。例如对Possession对
象归档保存。
定义Possession:
@interface
Possession:NSObject<NSCoding>{//遵守NSCoding协议
NSString *name;//待归档类型
}
@implementation
Possession
-(void)encodeWithCoder:(NSCoder
*)aCoder{
[aCoder encodeObject:name forKey:@"name"];
}
-(void)initWithCoder:(NSCoder
*)aDecoder{
name=[[aDeCoder decodeObjectforKey:@"name"]
retain];
}
归档操作:
如果对Possession对象allPossession归档保存,只需要NSCoder子类NSKeyedArchiver的方法archiveRootObject:toFile:
即可。
NSString *path = [self possessionArchivePath];
[NSKeyedArchiver archiveRootObject:allPossessions toFile: path ]
解压操作:
同样调用NSCoder子类NSKeyedArchiver的方法unarchiveRootObject:toFile: 即可
allPossessions = [[NSKeyedUnarchiver unarchiveObjectWithFile:path]
retain];
缺点:归档的形式来保存数据,只能一次性归档保存以及一次性解压。所以只能针对小量数据,而且对数据操作比较笨拙,即如果想改动数据的某一小部分,还是需要解压整个数据或者归档整个数据。
2.NSUserDefaults:
用来保存应用程序设置和属性、用户保存的数据。用户再次打开程序或开机后这些数据仍然存在。NSUserDefaults可以存储的数据类型包
括:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary。如果要存储其他类型,则需要转换为前
面的类型,才能用NSUserDefaults存储。具体实现为:
保存数据:
NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults];
NSString
*name =@”default string“;
[defaults setObject:firstName forKey:@"name"];
//获得UIImage实例
UIImage *image=[[UIImage
alloc]initWithContentsOfFile:@"photo.jpg"];
NSData *imageData =
UIImageJPEGRepresentation(image, 100);//UIImage对象转换成NSData
[defaults
synchronize];//用synchronize方法把数据持久化到standardUserDefaults数据库
读取数据:
NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults];
NSString
*name = [defaults objectForKey:@"name"];//根据键值取出name
NSData *imageData =
[defaults dataForKey:@"image"];
UIImage *Image = [UIImage
imageWithData:imageData];//NSData转换为UIImage
3.
Write写入方式:永久保存在磁盘中。具体方法为:
第一步:获得文件即将保存的路径:
NSArray *documentPaths =
NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask,YES);//使用C函数NSSearchPathForDirectoriesInDomains来获得沙盒中目录的全路径。该函数有三个参数,目录类型、he
domain mask、布尔值。其中布尔值表示是否需要通过~扩展路径。而且第一个参数是不变的,即为NSSearchPathDirectory
。在IOS中后两个参数也是不变的,即为:NSUserDomainMask 和 YES。
NSString *ourDocumentPath
=[documentPaths
objectAtIndex:0];
还有一种方法是使用NSHomeDirectory函数获得sandbox的路径。具体的用法为:
NSString
*sandboxPath = NSHomeDirectory();
// Once you have the full sandbox path, you
can create a path from
it,但是不能在sandbox的本文件层上写文件也不能创建目录,而应该是此基础上创建一个新的可写的目录,例如Documents,Library或者temp。
NSString
*documentPath = [sandboxPath
stringByAppendingPathComponent:@"Documents"];//将Documents添加到sandbox路径上,具体原因前面分析了!
这两者的区别就是:使用NSSearchPathForDirectoriesInDomains比在NSHomeDirectory后面添加Document更加安全。因为该文件目录可能在未来发送的系统上发生改变。
第二步:生成在该路径下的文件:
NSString *FileName=[documentDirectory
stringByAppendingPathComponent:fileName];//fileName就是保存文件的文件名
第三步:往文件中写入数据:
[data writeToFile:FileName
atomically:YES];//将NSData类型对象data写入文件,文件名为FileName
最后:从文件中读出数据:
NSData data=[NSData dataWithContentsOfFile:FileName options:0
error:NULL];//从FileName中读取出数据
4.
SQLite:采用SQLite数据库来存储数据。SQLite作为一中小型数据库,应用ios中,跟前三种保存方式相比,相对比较复杂一些。还是一步步来吧!
第一步:需要添加SQLite相关的库以及头文件:在项目文件的Build
Phases下,找到Link Binary Library(ies),添加libsqlite3.0.dylib(libsqlite3.dylib与前者的区别暂时不知,两者应该差不多);在项目文件中头文件或者源文件中添加头文件#import
"/usr/include/sqlite3.h"
第二步:开始使用SQLite:
NSArray
*documentsPaths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask , YES);
NSString *databaseFilePath=[[documentsPaths
objectAtIndex:0]
stringByAppendingPathComponent:@"mydb"];
//上面两句已经比较熟悉了吧!
//打开数据库
if
(sqlite3_open([databaseFilePath UTF8String], &database)==SQLITE_OK)
{
NSLog(@"sqlite dadabase is opened.");
}
else{
return;}//打开不成功就返回
在打开了数据库的前提下,如果数据库没有表,那就开始建表了哦!
char *error;
const char
*createSql="create table(id integer primary key autoincrement, name
text)";
if (sqlite3_exec(database, createSql, NULL, NULL,
&error)==SQLITE_OK) {
NSLog(@"create table is
ok.");
}
else
{
NSLog(@"error: %s",error);
sqlite3_free(error);//每次使用完毕清空error字符串,提供给下一次使用
}
建表完成之后,就开始插入记录:
const char *insertSql="insert into a person (name) values(‘gg’)";
if
(sqlite3_exec(database, insertSql, NULL, NULL, &error)==SQLITE_OK)
{
NSLog(@"insert operation is
ok.");
}
else
{
NSLog(@"error: %s",error);
sqlite3_free(error);//每次使用完毕清空error字符串,提供给下一次使用
}
下一步,查询记录:
const char *selectSql="select id,name from a person";
sqlite3_stmt
*statement;
if (sqlite3_prepare_v2(database,selectSql, -1, &statement,
nil)==SQLITE_OK) {
NSLog(@"select operation is
ok.");
}
else
{
NSLog(@"error: %s",error);
sqlite3_free(error);
}
while(sqlite3_step(statement)==SQLITE_ROW)
{
int _id=sqlite3_column_int(statement, 0);
NSString
*name=(char*)sqlite3_column_text(statement, 1);
NSLog(@"row>>id %i,
name %s",_id,name);
}
sqlite3_finalize(statement);
最后,关闭数据库:
sqlite3_close(database);
注意:写入数据库,字符串可以采用char方式,而从数据库中取出char类型,当char类型有表示中文字符时,会出现乱码。这是因为数据库默认使用ascII编码方式。所以要想正确从数据库中取出中文,需要用NSString来接收从数据库取出的字符串。
IOS- 数据存储的更多相关文章
- iOS数据存储之对象归档
iOS数据存储之对象归档 对象归档 对象归档是iOS中数据持久化的一种方式. 归档是指另一种形式的序列化,但它是任何对象都可以实现的更常规的类型.使用对模型对象进行归档的技术可以轻松将复杂的对象写入文 ...
- iOS数据存储之属性列表理解
iOS数据存储之属性列表理解 数据存储简介 数据存储,即数据持久化,是指以何种方式保存应用程序的数据. 我的理解是,开发了一款应用之后,应用在内存中运行时会产生很多数据,这些数据在程序运行时和程序一起 ...
- iOS数据存储类型 及 堆(heap)和栈(stack)
iOS数据存储类型 及 堆(heap)和栈(stack) 一般认为在c中分为这几个存储区: 1栈 -- 由编译器自动分配释放. 2堆 -- 一般由程序员分配释放,若程序员不释放,程序结束时可能由O ...
- IOS数据存储之Sqlite数据库
前言: 之前学习了数据存储的NSUserDefaults,归档和解档,沙盒文件存储,但是对于数据量比较大,需要频繁查询,删除,更新等操作的时候无论从效率上还是性能上,上述三种明显不能满足我们的日常开发 ...
- IOS数据存储之文件沙盒存储
前言: 之前学习了数据存储的NSUserDefaults,归档和解档,对于项目开发中如果要存储一些文件,比如图片,音频,视频等文件的时候就需要用到文件存储了.文件沙盒存储主要存储非机密数据,大的数据. ...
- iOS数据存储
[reference]http://www.infoq.com/cn/articles/data-storage-in-ios 谈到数据储存,首先要明确区分两个概念,数据结构和储存方式.所谓数据结构就 ...
- 最全的iOS数据存储方法
目的 项目准备运用的Core Data进行本地数据存储,本来打算只写一下Core Data的,不过既然说到了数据存储,干脆来个数据存储基础大总结!本文将对以下几个模块进行叙述. 沙盒 Plist Pr ...
- iOS数据存储-钥匙串存储
2017.11.20 14:41* 字数 227 阅读 678评论 0喜欢 0 钥匙串介绍 1. 表示设备唯一号的标识,在IOS7中要么被禁止使用,要么重新安装程序后两次获取的标识符不一样. 2. ...
- IOS 数据存储之 FMDB 详解
FMDB是用于进行数据存储的第三方的框架,它与SQLite与Core Data相比较,存在很多优势. FMDB是面向对象的,它以OC的方式封装了SQLite的C语言API,使用起来更加的方便,不需要过 ...
- iOS数据存储简要笔记
1. 数据存储常用的方式 (1)XML 属性列表(plist)归档 (2)preference(偏好设置) (3)NSKeyedArchiver归档(NSCoding) (4) SQLite3 ...
随机推荐
- 全键盘Vimium快捷键学习记录
0.设置而 vimium 的默认搜索引擎: http://www.baidu.com/s?wd= j: 向下细微滚动窗口. k:向上细微滚动窗口. gg:跳转到页面的顶部.G:跳转到页面的底部.r: ...
- Hadoop 之Hbase命令
一.常用命令:(hbase shell 进入终端) 1.创建表: create 'users','user_id','address','info' 表users,有三个列族user_id,addre ...
- 【PHP面向对象(OOP)编程入门教程】14.final关键字的应用
这个关键字只能用来定义类和定义方法, 不能使用final这个关键字来定义成员属性,因为final是常量的意思,我们在PHP里定义常量使用的是define()函数,所以不能使用final来定义成员属性. ...
- PHPCMS几个有用的全局函数
1.$site_setting = get_site_setting($siteid); 这个get_site_setting()函数读取的是多站点中$siteid站点的相关配置,具体位置在网站根 ...
- Codeforces 271 Div 2 B. Worms
题目链接:http://codeforces.com/contest/474/problem/B 解题报告:给你n个堆,第i个堆有ai个物品,物品的编号从1开始,第一堆的编号从1到a1,第二堆编号从a ...
- iOS开发网络篇—大文件的多线程断点下载
http://www.cnblogs.com/wendingding/p/3947550.html iOS开发网络篇—多线程断点下载 说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了同时 ...
- NSLock/NSRecursiveLock/NSConditionLock/@synchronized
NSLock/NSRecursiveLock/NSConditionLock/@synchronized http://blog.sina.com.cn/s/blog_8c87ba3b0101ok8y ...
- 移动端rem切图
1.为什么用rem 根据屏幕大小,自动调整大小 2.如何使用rem 分以下几步 a.用ps把设置稿弄成640px或者750px的(记得等比例缩放) b.调试时记得把浏览器默认最小字体设置为最小.手机端 ...
- [codevs1380]没有上司的舞会([BZOJ2060][Usaco2010 Nov]Visiting Cows 拜访奶牛)
[codevs1380]没有上司的舞会 试题描述 Ural大学有N个职员,编号为1~N.他们有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.每个职员有一个快乐指数.现 ...
- 160809225-叶桦汀《C语言程序设计》实验报告
#include<stdio.h> int main() { int a,b,c,t; printf("请输入三个整数"); scanf("%d%d%d&qu ...