iOS中 FMDB第三方SQLite数据库
2015-11-16 21:05
399 查看
博主原文:http://blog.csdn.net/qq_31810357/article/details/49180715
1.什么是FMDB?
FMDB是iOS平台下SQLite数据库,只不过它是OC方式封装了C语言的SQLite语句,使用起来更加面向对象
2.FMDB的优点:1.使用起来更加面向对象; 2.对比苹果自带的 Core Data 数据管理工具更加的轻量级,更加的灵活,而且FMDB支持跨平台; 3.提供多线程下的数据安全保护机制,有效地防止数据混乱
3.FMDM中重要的类:
FMDBDataBase: 它代表一个数据库对象,(我们需要创建数据库对象时就使用这个类)
FMDBDataBaseQueue: 它提供多线程下执行查找删除,或者更新的数据安全保护
FMResultSet: 用来存储sql语句执行结果的集(我们执行完sql语句后得到的结果都在这个类的对象中)
ViewController.m
[objc] view
plaincopy
#import "FMDB.h"
#import "Person.h"
#import "DetailViewController.h"
@interface ViewController ()
@property(nonatomic,retain)FMDatabase *db;
@property(nonatomic,retain)NSMutableArray *dataArray;//存储查询到的所有Person对象
@end
@implementation ViewController
- (void)dealloc
{
self.db = nil;
self.dataArray = nil;
[super dealloc];
}
- (NSMutableArray *)dataArray{
if (_dataArray == nil) {
self.dataArray = [NSMutableArray arrayWithCapacity:0];
}
return [[_dataArray retain]autorelease];
}
调用:(介绍FMDB)
[objc] view
plaincopy
- (void)viewDidLoad {
[super viewDidLoad];
//获取Documents文件夹路径
NSString *urlString = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
//在Documents文件夹里创建数据库文件 db.sqlite
NSString *dbPath = [urlString stringByAppendingPathComponent:@"db.sqlite"];
//创建数据库对象
//参数:数据库的路径
//执行结束后并没有帮我们生成数据库文件,只是帮我们创建了数据库对象
FMDatabase *db = [FMDatabase databaseWithPath:dbPath];
NSLog(@"%@",NSHomeDirectory());
//代开数据库
//open操作才帮我们真正的创建数据库文件,且如果已经打开,直接返回YES,此时可以直接使用,如果打开失败会打印报错信息
BOOL isOpen = [db open];
if (isOpen) {
NSLog(@"打开成功");
//创建表格
//executeUpdate 除了查询之外,其他数据创建表格,插入数据、删除数据都是用这个方法
//blob 二进制流 相当于oc的NSData
BOOL isCreat = [db executeUpdate:@"create table if not exists Person(id integer primary key autoincrement,name text,gender text,age integer,photo blob)"];
NSLog(@"%@",isCreat ? @"建表成功":@"建表失败");
}else{
NSLog(@"打开失败");
}
//给属性赋值
self.db = db;
NSLog(@"%@",NSHomeDirectory());
}
插入:
[objc] view
plaincopy
- (IBAction)insert:(UIButton *)sender {
Person *p = [[Person alloc]initWithName:@"郭美美" gender:@"女" age:20 photo:[UIImage imageNamed:@"3.gif"]];
//将图片转化成NSData对象
NSData *data = UIImagePNGRepresentation(p.photo);
//@(p.age)参数必须是对象类型的才能使用
//插入操作
BOOL isInsert = [self.db executeUpdate:@"insert into Person(name,gender,age,photo)values(?,?,?,?)",p.name,p.gender,@(p.age),data];
NSLog(@"%@",isInsert ? @"插入成功":@"插入失败");
}
删除:
[objc] view
plaincopy
- (IBAction)delete:(UIButton *)sender {
//根据条件删除
BOOL result = [self.db executeUpdate:@"delete from Person where id = ?",@3];
NSLog(@"%@",result ? @"删除成功":@"删除失败");
//删除全部表格内容
// BOOL isResult1 = [self.db executeUpdate:@"delete from Person"];
//删除表格
// BOOL isResult2 = [self.db executeUpdate:@"drop table Person"];
}
更新:
[objc] view
plaincopy
- (IBAction)update:(UIButton *)sender {
BOOL isUpdate = [self.db executeUpdate:@"update Person set gender = ? where id = ?",@"男",@4];
NSLog(@"%@",isUpdate ? @"更新成功":@"更新失败");
}
查询:
[objc] view
plaincopy
- (IBAction)select:(UIButton *)sender {
//查询全部
FMResultSet *set = [self.db executeQuery:@"select * from Person"];
//按条件查询
// FMResultSet *set = [self.db executeQuery:@"select *from Person where name = ?",@"郭美美"];
self.dataArray = [NSMutableArray arrayWithCapacity:0];
//循环取出表中的数据
//[set next] 判断写一行是否有数据
while ([set next]) {
//取出每一个字段对应的数据
NSInteger ID = [set intForColumn:@"id"];//取出id字段下的数据
NSString *name = [set stringForColumn:@"name"];//取出name字段下的数据
NSString *gender = [set stringForColumn:@"gender"];//取出gender字段下的数据
NSInteger age = [set intForColumn:@"age"];//取出age字段下的数据
NSData *data = [set dataForColumn:@"photo"];//取出photo字段下的数据
//创建model类
//将二进制流转成图片
UIImage *image = [UIImage imageWithData:data];
Person *p = [[Person alloc]initWithName:name gender:gender age:age photo: image];
p.ID = ID;
[self.dataArray addObject:p];
[p release];
}
}
为了展现效果,我们push到下个页面查看效果:
需要准备一个自定义cell、UIViewController界面和model类
传值使用:
[objc] view
plaincopy
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
//获取segue起始端的视图控制器对象
ViewController *rootVC = [segue sourceViewController];
//通过segue完成跳转的时候会触发这个方法,在跳转之前触发,一般用来传值
//获取push过去后的视图控制器对象
DetailViewController *detailVC = [segue destinationViewController];
//属性传值
detailVC.dataSource = rootVC.dataArray;
}
准备一个UIViewController:
[objc] view
plaincopy
DetailViewController.h
@interface DetailViewController : UITableViewController
@property(nonatomic,retain)NSMutableArray *dataSource;//属性传值使用
@end
DetailViewController.m
#import "DetailViewController.h"
#import "Person.h"
#import "PersonCell.h"
#define kPersonCell @"personcell"
@interface DetailViewController ()
@end
@implementation DetailViewController
- (void)dealloc
{
self.dataSource = nil;
[super dealloc];
}
- (void)viewDidLoad {
[super viewDidLoad];
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
// Return the number of sections.
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
// Return the number of rows in the section.
return self.dataSource.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
PersonCell *cell = [tableView dequeueReusableCellWithIdentifier:kPersonCell forIndexPath:indexPath];
//建立model类
Person *person = self.dataSource[indexPath.row];
//调用cell赋值的方法
[cell assginValues:person];
return cell;
}
准备一个自定义cell:通过storyBoard实现;
布局如下:
[objc] view
plaincopy
PersonCell.h
#import <UIKit/UIKit.h>
@class Person;
@interface PersonCell : UITableViewCell
@property (retain, nonatomic) IBOutlet UILabel *nameLabel;
@property (retain, nonatomic) IBOutlet UILabel *genderLabel;
@property (retain, nonatomic) IBOutlet UILabel *ageLabel;
@property (retain, nonatomic) IBOutlet UIImageView *photoView;
@property (retain, nonatomic) IBOutlet UILabel *IDLabel;
//写一个赋值方式
- (void)assginValues : (Person *)person;
@end
//=================================================
PersonCell.m
#import "PersonCell.h"
#import "Person.h"
@implementation PersonCell
- (void)awakeFromNib {
// Initialization code
}
//写一个赋值方式
- (void)assginValues : (Person *)person{
self.nameLabel.text = person.name;
self.genderLabel.text = person.gender;
self.ageLabel.text = [NSString stringWithFormat:@"%ld",person.age];
self.photoView.image = person.photo;
self.IDLabel.text = [NSString stringWithFormat:@"%ld",person.ID];
}
- (void)dealloc {
[_nameLabel release];
[_genderLabel release];
[_ageLabel release];
[_photoView release];
[_IDLabel release];
[super dealloc];
}
@end
准备一个model类:
[objc] view
plaincopy
Person.h
#import <Foundation/Foundation.h>
@class UIImage;
@interface Person : NSObject
@property(nonatomic,copy)NSString *name,*gender;
@property(nonatomic)NSInteger age,ID;//基本数据类型可以省略内存修饰符assign,因为默认使用的就是assign
@property(nonatomic,retain)UIImage *photo;
//自定义初始化方法
- (id)initWithName : (NSString *)name gender : (NSString *)gender age : (NSInteger)age photo : (UIImage *)photo;
@end
//=============================
Person.m
#import "Person.h"
#import <UIKit/UIKit.h>
@implementation Person
- (void)dealloc
{
self.name = nil;
self.gender = nil;
self.photo = nil;
[super dealloc];
}
//自定义初始化方法
- (id)initWithName : (NSString *)name gender : (NSString *)gender age : (NSInteger)age photo : (UIImage *)photo{
if (self = [super init]) {
self.name = name;
self.gender = gender;
self.age = age;
self.photo = photo;
}
return self;
}
- (NSString *)description
{
return [NSString stringWithFormat:@"%@ %@ %ld %@", self.name,self.gender,self.age,self.photo];
}
@end
大概效果不能展示全部(仅供参考):
==============================
第三方FMDB下载:http://pan.baidu.com/s/1ntMo3ZN
1.什么是FMDB?
FMDB是iOS平台下SQLite数据库,只不过它是OC方式封装了C语言的SQLite语句,使用起来更加面向对象
2.FMDB的优点:1.使用起来更加面向对象; 2.对比苹果自带的 Core Data 数据管理工具更加的轻量级,更加的灵活,而且FMDB支持跨平台; 3.提供多线程下的数据安全保护机制,有效地防止数据混乱
3.FMDM中重要的类:
FMDBDataBase: 它代表一个数据库对象,(我们需要创建数据库对象时就使用这个类)
FMDBDataBaseQueue: 它提供多线程下执行查找删除,或者更新的数据安全保护
FMResultSet: 用来存储sql语句执行结果的集(我们执行完sql语句后得到的结果都在这个类的对象中)
ViewController.m
[objc] view
plaincopy
#import "FMDB.h"
#import "Person.h"
#import "DetailViewController.h"
@interface ViewController ()
@property(nonatomic,retain)FMDatabase *db;
@property(nonatomic,retain)NSMutableArray *dataArray;//存储查询到的所有Person对象
@end
@implementation ViewController
- (void)dealloc
{
self.db = nil;
self.dataArray = nil;
[super dealloc];
}
- (NSMutableArray *)dataArray{
if (_dataArray == nil) {
self.dataArray = [NSMutableArray arrayWithCapacity:0];
}
return [[_dataArray retain]autorelease];
}
调用:(介绍FMDB)
[objc] view
plaincopy
- (void)viewDidLoad {
[super viewDidLoad];
//获取Documents文件夹路径
NSString *urlString = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
//在Documents文件夹里创建数据库文件 db.sqlite
NSString *dbPath = [urlString stringByAppendingPathComponent:@"db.sqlite"];
//创建数据库对象
//参数:数据库的路径
//执行结束后并没有帮我们生成数据库文件,只是帮我们创建了数据库对象
FMDatabase *db = [FMDatabase databaseWithPath:dbPath];
NSLog(@"%@",NSHomeDirectory());
//代开数据库
//open操作才帮我们真正的创建数据库文件,且如果已经打开,直接返回YES,此时可以直接使用,如果打开失败会打印报错信息
BOOL isOpen = [db open];
if (isOpen) {
NSLog(@"打开成功");
//创建表格
//executeUpdate 除了查询之外,其他数据创建表格,插入数据、删除数据都是用这个方法
//blob 二进制流 相当于oc的NSData
BOOL isCreat = [db executeUpdate:@"create table if not exists Person(id integer primary key autoincrement,name text,gender text,age integer,photo blob)"];
NSLog(@"%@",isCreat ? @"建表成功":@"建表失败");
}else{
NSLog(@"打开失败");
}
//给属性赋值
self.db = db;
NSLog(@"%@",NSHomeDirectory());
}
插入:
[objc] view
plaincopy
- (IBAction)insert:(UIButton *)sender {
Person *p = [[Person alloc]initWithName:@"郭美美" gender:@"女" age:20 photo:[UIImage imageNamed:@"3.gif"]];
//将图片转化成NSData对象
NSData *data = UIImagePNGRepresentation(p.photo);
//@(p.age)参数必须是对象类型的才能使用
//插入操作
BOOL isInsert = [self.db executeUpdate:@"insert into Person(name,gender,age,photo)values(?,?,?,?)",p.name,p.gender,@(p.age),data];
NSLog(@"%@",isInsert ? @"插入成功":@"插入失败");
}
删除:
[objc] view
plaincopy
- (IBAction)delete:(UIButton *)sender {
//根据条件删除
BOOL result = [self.db executeUpdate:@"delete from Person where id = ?",@3];
NSLog(@"%@",result ? @"删除成功":@"删除失败");
//删除全部表格内容
// BOOL isResult1 = [self.db executeUpdate:@"delete from Person"];
//删除表格
// BOOL isResult2 = [self.db executeUpdate:@"drop table Person"];
}
更新:
[objc] view
plaincopy
- (IBAction)update:(UIButton *)sender {
BOOL isUpdate = [self.db executeUpdate:@"update Person set gender = ? where id = ?",@"男",@4];
NSLog(@"%@",isUpdate ? @"更新成功":@"更新失败");
}
查询:
[objc] view
plaincopy
- (IBAction)select:(UIButton *)sender {
//查询全部
FMResultSet *set = [self.db executeQuery:@"select * from Person"];
//按条件查询
// FMResultSet *set = [self.db executeQuery:@"select *from Person where name = ?",@"郭美美"];
self.dataArray = [NSMutableArray arrayWithCapacity:0];
//循环取出表中的数据
//[set next] 判断写一行是否有数据
while ([set next]) {
//取出每一个字段对应的数据
NSInteger ID = [set intForColumn:@"id"];//取出id字段下的数据
NSString *name = [set stringForColumn:@"name"];//取出name字段下的数据
NSString *gender = [set stringForColumn:@"gender"];//取出gender字段下的数据
NSInteger age = [set intForColumn:@"age"];//取出age字段下的数据
NSData *data = [set dataForColumn:@"photo"];//取出photo字段下的数据
//创建model类
//将二进制流转成图片
UIImage *image = [UIImage imageWithData:data];
Person *p = [[Person alloc]initWithName:name gender:gender age:age photo: image];
p.ID = ID;
[self.dataArray addObject:p];
[p release];
}
}
为了展现效果,我们push到下个页面查看效果:
需要准备一个自定义cell、UIViewController界面和model类
传值使用:
[objc] view
plaincopy
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
//获取segue起始端的视图控制器对象
ViewController *rootVC = [segue sourceViewController];
//通过segue完成跳转的时候会触发这个方法,在跳转之前触发,一般用来传值
//获取push过去后的视图控制器对象
DetailViewController *detailVC = [segue destinationViewController];
//属性传值
detailVC.dataSource = rootVC.dataArray;
}
准备一个UIViewController:
[objc] view
plaincopy
DetailViewController.h
@interface DetailViewController : UITableViewController
@property(nonatomic,retain)NSMutableArray *dataSource;//属性传值使用
@end
DetailViewController.m
#import "DetailViewController.h"
#import "Person.h"
#import "PersonCell.h"
#define kPersonCell @"personcell"
@interface DetailViewController ()
@end
@implementation DetailViewController
- (void)dealloc
{
self.dataSource = nil;
[super dealloc];
}
- (void)viewDidLoad {
[super viewDidLoad];
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
// Return the number of sections.
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
// Return the number of rows in the section.
return self.dataSource.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
PersonCell *cell = [tableView dequeueReusableCellWithIdentifier:kPersonCell forIndexPath:indexPath];
//建立model类
Person *person = self.dataSource[indexPath.row];
//调用cell赋值的方法
[cell assginValues:person];
return cell;
}
准备一个自定义cell:通过storyBoard实现;
布局如下:
[objc] view
plaincopy
PersonCell.h
#import <UIKit/UIKit.h>
@class Person;
@interface PersonCell : UITableViewCell
@property (retain, nonatomic) IBOutlet UILabel *nameLabel;
@property (retain, nonatomic) IBOutlet UILabel *genderLabel;
@property (retain, nonatomic) IBOutlet UILabel *ageLabel;
@property (retain, nonatomic) IBOutlet UIImageView *photoView;
@property (retain, nonatomic) IBOutlet UILabel *IDLabel;
//写一个赋值方式
- (void)assginValues : (Person *)person;
@end
//=================================================
PersonCell.m
#import "PersonCell.h"
#import "Person.h"
@implementation PersonCell
- (void)awakeFromNib {
// Initialization code
}
//写一个赋值方式
- (void)assginValues : (Person *)person{
self.nameLabel.text = person.name;
self.genderLabel.text = person.gender;
self.ageLabel.text = [NSString stringWithFormat:@"%ld",person.age];
self.photoView.image = person.photo;
self.IDLabel.text = [NSString stringWithFormat:@"%ld",person.ID];
}
- (void)dealloc {
[_nameLabel release];
[_genderLabel release];
[_ageLabel release];
[_photoView release];
[_IDLabel release];
[super dealloc];
}
@end
准备一个model类:
[objc] view
plaincopy
Person.h
#import <Foundation/Foundation.h>
@class UIImage;
@interface Person : NSObject
@property(nonatomic,copy)NSString *name,*gender;
@property(nonatomic)NSInteger age,ID;//基本数据类型可以省略内存修饰符assign,因为默认使用的就是assign
@property(nonatomic,retain)UIImage *photo;
//自定义初始化方法
- (id)initWithName : (NSString *)name gender : (NSString *)gender age : (NSInteger)age photo : (UIImage *)photo;
@end
//=============================
Person.m
#import "Person.h"
#import <UIKit/UIKit.h>
@implementation Person
- (void)dealloc
{
self.name = nil;
self.gender = nil;
self.photo = nil;
[super dealloc];
}
//自定义初始化方法
- (id)initWithName : (NSString *)name gender : (NSString *)gender age : (NSInteger)age photo : (UIImage *)photo{
if (self = [super init]) {
self.name = name;
self.gender = gender;
self.age = age;
self.photo = photo;
}
return self;
}
- (NSString *)description
{
return [NSString stringWithFormat:@"%@ %@ %ld %@", self.name,self.gender,self.age,self.photo];
}
@end
大概效果不能展示全部(仅供参考):
==============================
第三方FMDB下载:http://pan.baidu.com/s/1ntMo3ZN
相关文章推荐
- 解决最近遇到的高并发下,mysql innodb引擎的死锁问题
- 使用SQLite3存储和读取数据
- www服务器架设linux+apache+mariadb+php
- mysql初步备份方案
- 分享一个VBA连接mysql数据库的方法
- ubuntu 14.04 安装mysql
- MongoDB介绍以及在linux平台的安装使用
- [mysql]explain语句中的key_len计算
- mysqlslap压力测试
- 我的mysql使用心得
- mongodb里的集合数据迁移到mysql库
- Spider based on scrapy
- sql常用
- hibernate连接Oracle rac
- Oracle exp 數據備份
- Linux 下Redis安装与集群配置 Redis配置文件详解
- SQL Server学习总结--初级
- memcached数据库未授权访问漏洞解决
- sqlite循环批量插入数据采用批处理文件实现
- Ormlite数据库