小编,最近的项目需要用到数据库存储,所以在网上搜索学习了一些相关的只是,下面我简单的说一下FMDB的基本使用:
说FMDB之前小说一下sqlite能存储那些数据:**
SQLite具有以下五种数据类型:
1.NULL:空值。
2.INTEGER:带符号的整型,具体取决有存入数字的范围大小。
3.REAL:浮点数字,存储为8-byte IEEE浮点数。
5.BLOB:二进制对象。
但实际上,
sqlite3也接受如下的数据类型:
smallint 16 位元的整数。
interger 32 位元的整数。
decimal(p,s) p 精确值和 s 大小的十进位整数,精确值p是指全部有几个数(digits)大小值,s是指小数点後有几位数。如果没有特别指定,则系统会设为 p=5; s=0 。
float 32位元的实数。
char(n) n 长度的字串,n不能超过 254。
varchar(n) 长度不固定且其最大长度为 n 的字串,n不能超过 4000。
graphic(n) 和 char(n) 一样,不过其单位是两个字元 double-bytes, n不能超过127。这个形态是为了支援两个字元长度的字体,例如中文字。
vargraphic(n) 可变长度且其最大长度为 n 的双字元字串,n不能超过 2000
date 包含了 年份、月份、日期。
time 包含了 小时、分钟、秒。
timestamp 包含了 年、月、日、时、分、秒、千分之一秒。
datetime 包含日期时间格式,必须写成’2010-08-05’不能写为’2010-8-5’,否则在读取时会产生错误!
1.FMDB:
FMDB是一款简洁、易用的封装库。因此,在这里推荐使用第三方框架FMDB,它是对libsqlite3框架的封装,用起来的步骤与SQLite使用类似,并且它对于多线程的并发操作进行了处理,所以是线程安全的。
FMDB PK Sqlite
优点:
对多线程的并发操作进行处理,所以是线程安全的;
以OC的方式封装了SQLite的C语言API,使用起来更加的方便;
FMDB是轻量级的框架,使用灵活。
缺点:
因为它是OC的语言封装的,只能在ios开发的时候使用,所以在实现跨平台操作的时候存在局限性。
FMDB框架中重要的框架类
FMDatabase
FMDatabase对象就代表一个单独的SQLite数据库,用来执行SQL语句
FMResultSet
使用FMDatabase执行查询后的结果集
FMDatabaseQueue
用于在多线程中执行多个查询或更新,它是线程安全的
话不多说直接上代码:
FLS_DBManager.h 文件
@class UserModel;
@interface FLS_DBManager : NSObject
//单例模式
+ (instancetype)shareDBManager;
//插入数据
- (void)insertDataWithModel:(UserModel *)model;
//修改数据
- (void)updateDataWithModel:(UserModel *)model;
//删除数据
- (void)deleteDataWithId:(NSString *)userId;
//查询所有数据
- (NSArray *)selectAllData;
//根据条件查询
// 根据名字查询,这条数据是否已经存在.存在返回YES。
- (BOOL)selectDataIsExistsWithName:(NSString *)name;
@end
FLS_DBManager.m文件
#import “FLS_DBManager.h”
#import “FMDB.h”
static FLS_DBManager * _dbManager = nil;
@interface FLS_DBManager() NSCopying,NSMutableCopying>
@property(nonatomic,strong)FMDatabase * db;
@end
宁波整形美容医院http://www.iyestar.com/
宁波整容医院http://www.lyxcl.org/
@implementation FLS_DBManager
//单例
+ (instancetype)shareDBManager{
if (_dbManager == nil) {
_dbManager = [[FLS_DBManager alloc] init];
[_dbManager initWithDBmanager];
}
return _dbManager;
}
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
if (_dbManager == nil) {
_dbManager = [super allocWithZone:zone];
}
return _dbManager;
}
- (id)copy{
return self;
}
- (id)mutableCopy{
return self;
}
- (id)copyWithZone:(NSZone *)zone{
return self;
}
- (id)mutableCopyWithZone:(NSZone *)zone{
return self;
}
- (void)initWithDBmanager{
// 获得Documents目录路径
NSString * documentPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
// 文件路径
NSString * filePath = [documentPath stringByAppendingString:@”/user.sqlite”];
//创建数据库对象
self.db = [FMDatabase databaseWithPath:filePath];
if ([self.db open]) {
NSString * sql =@”create table if not exists user(id integer primary key autoincrement,user_id varchar(300), user_name varchar(1), user_age integer, user_image blob)”;
// @”CREATE TABLE ‘user’ (‘id’ INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL ,’user_id’ VARCHAR(255),’user_name’ VARCHAR(255),’uset_age’ INTEGER,’user_image’ BLOB “;
BOOL success = [self.db executeUpdate:sql];
if (success) {
LFLog(@”建表成功”);
}else{
LFLog(@”建表失败:%@”,self.db.lastErrorMessage);
}
}else{
LFLog(@”%@”,self.db.lastErrorMessage);
}
[self.db close];
}
//插入数据
- (void)insertDataWithModel:(UserModel *)model{
[self.db open];
NSNumber * maxID = @(0);
FMResultSet * res = [self.db executeQuery:@"SELECT * FROM user"];
//获取数据库中最大的ID
while ([res next]) {
if ([maxID integerValue] < [[res stringForColumn:@"user_id"] integerValue]) {
maxID = @([[res stringForColumn:@"user_id"] integerValue]);
}
}
maxID = @([maxID integerValue] + 1);
//用户ID
NSString * userId = [NSString stringWithFormat:@"%@",maxID];
//将图片转化成NSData
NSData * imageData = UIImagePNGRepresentation(model.userImage);
// NSString * sql = @”INSERT INTO user(user_id,user_name,uset_age,user_image) VALUES(?,?,?,?)”;
NSString *sql = @”insert into user(user_id,user_name, user_age, user_image) values(?, ?, ?, ?)”;
//插入数据库
NSNumber * age = @(model.userAge);
BOOL success = [self.db executeUpdate:sql,userId,model.userName,age,imageData];
if (success) {
LFLog(@”插入成功”);
}else{
LFLog(@”插入失败:%@”,self.db.lastErrorMessage);
}
[self.db close];
}
//修改数据
- (void)updateDataWithModel:(UserModel *)model{
[self.db open];
NSNumber * age = @(model.userAge);
NSData * imageData = UIImagePNGRepresentation(model.userImage);
NSString * sql = @"update user set user_name = ?, user_age = ?, user_image = ? where user_id = ?";
BOOL success = [self.db executeUpdate:sql,model.userName,age,imageData,model.userId];
if (success) {
LFLog(@"修改成功");
}else{
LFLog(@"修改失败:%@",self.db.lastErrorMessage);
}
[self.db close];
}
//删除数据
- (void)deleteDataWithId:(NSString *)userId{
[self.db open];
NSString * sql = @”delete from user where user_id = ?”;
BOOL success = [self.db executeUpdate:sql,userId];
if (success) {
LFLog(@”删除成功”);
}else{
LFLog(@”删除失败:%@”,self.db.lastErrorMessage);
}
[self.db close];
}
//查询所有数据
- (NSArray *)selectAllData{
[self.db open];
NSMutableArray * array = [NSMutableArray arrayWithCapacity:0];
NSString * sql =@”select * from user”;
//结果集
FMResultSet * res = [self.db executeQuery:sql];
while ([res next]) {
UserModel * model = [[UserModel alloc] init];
model.userId = [res stringForColumn:@”user_id”];
model.userName = [res stringForColumn:@”user_name”];
model.userAge = [res intForColumn:@”user_age”];
NSData * imageData = [res dataForColumn:@”user_image”];
model.userImage = [UIImage imageWithData:imageData];
[array addObject:model];
}
[self.db close];
return array;
}
//根据条件查询
- (BOOL)selectDataIsExistsWithName:(NSString *)name{
[self.db open];
NSString * sql = @"select * from user where user_name = ?";
FMResultSet * res = [self.db executeQuery:sql,name];
[self.db close];
return [res next];
}