iOS数据持久化就是把数据存在文件中永久保存,数据持久化保存的几种方式:
1、plist文件(适合小型数据)
2、归档Archieve(适合小型数据)
3、NSUserDefaults(适合小型数据)
4、SQLite数据库(适合大型数据)
5、Core Data数据库(适合大型数据)
6、普通文件NSFileManager/NSFileHandle(适合任何类型数据)
一、数据库介绍
1、数据库(Database/DB)是一种某种数据模型组织起来并 存放存储管理的数据仓库。
2、数据库是数据管理的高级阶段,它是由文件管理系统发展起来的。
3、数据库操作是对数据的增、删、改、查。由统一数据库软件来进行管理和控制。
4、常见的服务器数据库有:Access、Oracle、Microsoft SQL Server、DB2、Mysql。
二、SQLite数据库
1、SQLite是一款嵌入式的轻量关系型文件数据库,是遵守ACID的关系型数据库管理系统。
2、SQLite数据库所有内容存放在一个文件中,一个数据库就是一个文件。
3、SQLite占用资源很少,适合小型手机设备使用。
4、SQLite是几乎所有手机系统(iOS、Android、Symbian、Blackberry、Lumia、Limo等)的标准数据库。
三、SQLite语句
1、创建/删除表格
2、增删改查
四、SQLite数据类型
1、整数数据类型
integer: 整型数据,大小为4个字节。
bigint: 整型数据,大小为8个字节。
smallint: 整型数据,大小为2个字节。
tinyint: 从0到255的整型数据,大小为1个字节。
float: 4字节浮点数。
double: 8字节浮点数。
real: 8字节浮点数。
2、字符串数据类型
char(n) :n长度的字符串,n不能超过254。
varchar(n) :长度不固定且其最大长度为n的字符串,n不能超过4000。
text :text存储可变长度的非Unicode数据,存更大的字符串。
3、日期类型
date:包含年、月、日。
time:包含时、分、秒。
datetime:包含年、月、日、时、分、秒。格式‘2012-01-01’。
timestamp:包含年、月、日、时、分、秒、千分之一秒。
4、其它类型
null:空值
blob:二进制对象
default:缺省值
primary key:主键
autoincrement:主键自动增长
五、FMDB介绍
FMDB是一个开源的第三方操作数据库的框架,支持ARC和Non-ARC/MRC操作,它是对iOS官方提供操作数据库方法的封装,使用更加方便。导入头文件后别忘了添加系统库 libsqlite3.dylib哦。
下面博主给出一个demo,我们具体来看看FMDB是如何实现创建数据库、创建表以及对数据的增删改查的。
/*
1.创建数据库(open)
2.创建表(不存在则创建)
3.增删改查
*/
#import "DataBaseManager.h"
#import <FMDB.h>
@implementation DataBaseManager
{
FMDatabase *_database;
}
#pragmaamrk -- 非标准单例
+ (instancetype)defaultManager {
static DataBaseManager * manager = nil;
@synchronized(self) {
if (manager == nil) {
manager = [[self alloc] init];
}
}
return manager;
}
#pragmamark -- 单例初始化的时候创建数据库
- (instancetype)init {
if (self = [super init]) {
NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *dataPath = [docPath stringByAppendingPathComponent:@"stu.sqlite"];
_database = [[FMDatabase alloc] initWithPath:dataPath];
if (![_database open]) {
NSLog(@"open error:%@",_database.lastErrorMessage);
}else {
[self createTable];
}
}
return self;
}
#pragma mark - 创建表
- (void)createTable {
NSString *sql = @"CREATE TABLE IF NOT EXISTS stu (serial integer Primary Key Autoincrement,uid Varchar(256) DEFAULT NULL, name Varchar(256),score Double,headimage blob)";
if (![_database executeUpdate:sql]) {
NSLog(@"create table error:%@",_database.lastErrorMessage);
}
}
#pragma mark - 增加
- (void)insertDataWithModel:(StudentModel *)model {
if ([self isExistDataWithUid:model.uid]) {
NSLog(@"该记录已经增加");
return;
}
NSString *sql = @"insert into stu(uid,name,score,headimage) values (?,?,?,?)";
if (![_database executeUpdate:sql,model.uid,model.name,@(model.score),model.headimage]) {
NSLog(@"insert error:%@",_database.lastErrorMessage);
}
}
#pragma mark - 删除
- (void)deleteDataWithUid:(NSString *)uid {
NSString *sql = @"delete from stu where uid=?";
if (![_database executeUpdate:sql,uid]) {
NSLog(@"delete error:%@",_database.lastErrorMessage);
}
}
#pragma mark - 修改
- (void)updateDataWithUid:(NSString *)uid newModel:(StudentModel *)newModel {
NSString *sql = @"update stu set name=?,score=?,headimage=? where uid=?";
if (![_database executeUpdate:sql,newModel.name,@(newModel.score),newModel.headimage,uid]) {
NSLog(@"update error:%@",_database.lastErrorMessage);
}
}
#pragma mark - 根据uid查找
- (BOOL)isExistDataWithUid:(NSString *)uid {
NSString *sql = @"select * from stu where uid=?";
FMResultSet *rs = [_database executeQuery:sql,uid];
if ([rs next]) {
return YES;
}
return NO;
}
#pragma mark - 查找
- (NSArray *)fetchAllData {
NSString *sql = @"select * from stu";
FMResultSet *rs = [_database executeQuery:sql];
NSMutableArray *arr = [[NSMutableArray alloc] init];
while ([rs next]) {
StudentModel *model = [[StudentModel alloc] init];
model.uid = [rs stringForColumn:@"uid"];
model.name = [rs stringForColumn:@"name"];
model.score = [rs doubleForColumn:@"score"];
model.headimage = [rs dataForColumn:@"headimage"];
[arr addObject:model];
}
return arr ;
}
#pragma mark - 查询有多少条记录
- (NSInteger)countOfData {
NSString *sql = @"select count(*) from stu";
FMResultSet *rs = [_database executeQuery:sql];
while ([rs next]) {
return [rs longForColumnIndex:0];
}
return 0;
}
@end
(如果帮到了你,要记得分享哦)