FMDB的基本使用

小编,最近的项目需要用到数据库存储,所以在网上搜索学习了一些相关的只是,下面我简单的说一下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];

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值