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

#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)

- (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());
}

插入:

- (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 ? @"插入成功":@"插入失败");
}

删除:

- (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"];
}

更新:

- (IBAction)update:(UIButton *)sender {
    BOOL isUpdate = [self.db executeUpdate:@"update Person set gender = ? where id = ?",@"男",@4];
    NSLog(@"%@",isUpdate ? @"更新成功":@"更新失败");
}

查询:

- (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类

传值使用:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    //获取segue起始端的视图控制器对象
    ViewController *rootVC  = [segue sourceViewController];

    //通过segue完成跳转的时候会触发这个方法,在跳转之前触发,一般用来传值
    //获取push过去后的视图控制器对象
    DetailViewController *detailVC = [segue destinationViewController];
    //属性传值
    detailVC.dataSource = rootVC.dataArray;

}

准备一个UIViewController:

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实现;

布局如下:

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类:

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

iOS中 FMDB第三方SQLite数据库 UI_20的更多相关文章

  1. 从C#到Objective-C,循序渐进学习苹果开发(7)--使用FMDB对Sqlite数据库进行操作

    本随笔系列主要介绍从一个Windows平台从事C#开发到Mac平台苹果开发的一系列感想和体验历程,本系列文章是在起步阶段逐步积累的,希望带给大家更好,更真实的转换历程体验.本篇主要开始介绍基于XCod ...

  2. Windows Phone8 中如何引用 SQLite 数据库2

    本博文编写环境 VS2013 + WP8 SDK 上篇介绍完了SQLite在wp中的部署(具体请参阅 Windows Phone8 中如何引用 SQLite 数据库),下面来看如何使用 SQLite ...

  3. iOS中FMDB的使用

    1在日常的开发中,我们需要用到离线缓存将数据信息存入数据库,在没有网络的时候进行加载,而我们IOS用的就是sqlite3数据库,用原生的sql我们也能实现,但是书写起来比较麻烦,尤其是其它语言转过来的 ...

  4. iOS 使用FMDB SQLCipher给数据库加密

    关于SQLite,SQLCipher和FMDB SQLite是一个轻量的.跨平台的.开源的数据库引擎,它的在读写效率.消耗总量.延迟时间和整体简单性上具有的优越性,使其成为移动平台数据库的最佳解决方案 ...

  5. Qt5 开发 iOS 应用之访问 SQLite 数据库

    开发环境: macOS 10.12.1 Xcode 8.1 Qt 5.8 iPhone 6S+iOS 10.1.1   源代码: 我在 Qt 程序里指定了数据库的名称来创建数据库,在 Win10.An ...

  6. Windows Phone8 中如何引用 SQLite 数据库

    SQLite数据库介绍 1.SQLite是一款轻型的嵌入式数据库,使用C++开发,使用非常广泛 2.SQLite是一款跨平台的数据库,支持Windows.Linux.Android.IOS.Windo ...

  7. iOS中FMDB和GCD剖析

    转载至:http://www.cocoachina.com/industry/20130819/6821.html 英文链接:https://github.com/ccgus/fmdb 由于FMDB是 ...

  8. 在ios中使用第三方类库

    在项目开发中经常会用到一些第三方类库,通常有两种方法来做到:一种方法是直接把所有的.h和.m文件复制到项目中:另一种方法是把.xcodeproj拖到项目中生成静态链接库并引用. 方法一:直接复制所有源 ...

  9. IOS数据存储之Sqlite数据库

    前言: 之前学习了数据存储的NSUserDefaults,归档和解档,沙盒文件存储,但是对于数据量比较大,需要频繁查询,删除,更新等操作的时候无论从效率上还是性能上,上述三种明显不能满足我们的日常开发 ...

随机推荐

  1. C语言 分支与循环 递推思想 穷举 流程的转移控制

    条件语句 开关控制语句(SWITCH语句) 象坐电梯一样,break是按的楼层,不加break则会一直执行下去. 上面程序有细节BUG,边界测试输入-5,105时由于整除会得到错误的结果. 解决方法: ...

  2. 简介JSP与FreeMarker及Volicity区别

    FreeMarker FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具. 它不是面向最终用户的,而是一个 ...

  3. JVM常见问题 一(转载)

    1. 内存模型以及分区 JVM内存模型如下图所示: 此处我们集中注意中间绿色的部分,该部分为JVM的运行时内存,该部分包含了: 线程私有的(灰色): 程序计数器:记录执行到第几条指令 虚拟机方法栈:执 ...

  4. Django笔记--模型

    ORM是"对象-关系-映射"的简称,在Django当中,ORM就是模型类的管理器对象.操作顺序是先定义模型类,再定义模型类管理器,然后在模型类中实例化一个模型类管理器的对象,作为模 ...

  5. 2018年4月更新70多个公司dnc招聘职位

    2018年4月更新70多个公司dnc招聘职位 请在本页回复,补充dnc招聘信息.公司案例 dnc简介 dnc = .NET Core.dotnet Core简写 dnc是微软新一代主力编程平台,开源. ...

  6. js保留两位小数数字

    /* * @descript: 保留两位小数,如果小数点大于两位小数,就向上取值保留两位小数<br/> * @time 2016-07-13 */function mathCeil(num ...

  7. java里String类为何被设计为final

    前些天面试遇到一个非常难的关于String的问题,"String为何被设计为不可变的"?类似的问题也有"String为何被设计为final?"个人认为还是前面一 ...

  8. docker iotop :OSError: Netlink error: No such file or directory

    在容器内使用iotop ,错误信息: raceback (most recent call last): File "/usr/sbin/iotop", line 16, in & ...

  9. [CSDN_Markdown]Markdown基本语法2

    简介 前文 Markdown基本语法 中介绍了Markdown的基本语法,知道那些基本的语法,实际上已经可以写纯文本的博客了.对我们这群写代码的人或者将要写代码的人来说,貌似这些还不够,我们还希望能插 ...

  10. 国内外主流BI工具介绍和点评

    商业智能的应用在国外已广为普及,并且开始不断探索大数据和云技术.而国内,商业智能BI工具在这几年才开始慢慢被接受,企业开始有意识地建立一体化数据分析平台,为经营决策提供分析. 从国内企业使用情况来看, ...