【iOS】数据库FMDB的使用(一)

SQLite(http://www.sqlite.org/docs.html) 是一个轻量级的关系数据库。iOS SDK 很早就支持了 SQLite,在使用时,只需要加入 libsqlite3.dylib 依赖以及引入 sqlite3.h 头文件即可。但是,原生的 SQLite API 在使用上相当不友好,在使用时,非常不便。于是,开源社区中就出现了一系列将 SQLite API 进行封装的库,而 FMDB (https://github.com/ccgus/fmdb) 则是开源社区中的优秀者。

一、配置FMDB

1.从github上面下载下来

2.把源文件拖入工程


3.导入依赖文件libsqlite3.dylib 

二、相关说明

在FMDB中主要与三个类


FMDatabase:代表一个SQLite数据库用于执行SQL语句。

FMResultSet:FMDatabase里的查询结构。


FMDatabaseQueue:多线程下查询和更新数据库会使用。这个类线程安全。

三、实际操作

在操作一个数据库之前,我们需要先有一个数据库。

1.新建一个数据库

/**
 *  新建一个数据库
 */
- (void)initDataBase{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentDirectory = [paths objectAtIndex:0];
    NSString *dbPath = [documentDirectory stringByAppendingPathComponent:@"Student1.db"];
    NSLog(@"dbPath = %@",dbPath);
    self.dataBase = [FMDatabase databaseWithPath:dbPath];
}
在一个数据库中可以有多张表,所以我们还需要在这个数据库文件中新建一张Student表。

/**
 *  数据库中新建一个表
 */
- (void)creatTabel{
    [self.dataBase open];
    [self.dataBase executeUpdate:@"CREATE TABLE IF  NOT EXISTS Student (rowid INTEGER PRIMARY KEY AUTOINCREMENT, name text,age text,address text)"];
    [self.dataBase close];
}
在这个里面有个: rowid INTEGER PRIMARY KEY AUTOINCREMENT   为什么有加这一句话呢?请移步这里。其实我们也可以自己尝试,看看加和不加后会有什么不同。

2.增删改查

表也有了,下面就是实际应用了。

增:

/**
 *  以学生模型插入数据库
 *
 *  @param student 学生数据模型
 */
- (void)insterStudent:(Student *)student{
    [self.dataBase open];
    [self.dataBase executeUpdate:@"INSERT INTO Student (name,age,address) VALUES (?,?,?)",student.name,student.age,student.address];
    [self.dataBase close];
}
在里有个学生的类,学生的类里面有三个属性和一个类方法:

/**
 *  姓名
 */
@property (nonatomic,copy)NSString *name;
/**
 *  年龄
 */
@property (nonatomic,copy)NSString *age;
/**
 *  地址
 */
@property (nonatomic,copy)NSString *address;


+ (Student *)creatStudent:(NSString *)name age:(NSString *)age address:(NSString *)address;

+ (Student *)creatStudent:(NSString *)name age:(NSString *)age address:(NSString *)address{
    Student *model = [[Student alloc] init];
    model.name = name;
    model.age = age;
    model.address = address;
    return model;
}
其实也是为了操作起来方便而建的这个类。

删:

/**
 *  删除数据库里面 一类名字的学生数据
 *
 *  @param student 学生模型
 */
- (void)deleteStudent:(Student *)student{
    [self.dataBase open];
    [self.dataBase executeUpdate:@"DELETE FROM Student WHERE name = ?",student.name];
    [self.dataBase close];
}

改:

/**
 *  更新一个学生的数据
 *
 *  @param student 学生数据模型
 */
- (void)updateStudent:(Student *)student{
    [self.dataBase open];
    [self.dataBase executeUpdate:@"UPDATE Student SET age= ? WHERE name = ?",student.age, student.name];
    [self.dataBase close];
}

查:

这里写了两个方法

/**
 *  获取表中的所有数据 以学生模型的形式存储在数组中
 *
 *  @return 表中的数据
 */
- (NSMutableArray *)getAllStudent{
    [self.dataBase open];
    FMResultSet *result = [self.dataBase executeQuery:@"SELECT * FROM Student"];
    NSMutableArray *stuArray = [[NSMutableArray alloc] init];
    while ([result next]) {
        Student *model = [Student creatStudent:[result stringForColumn:@"name"] age:[result stringForColumn:@"age"] address:[result stringForColumn:@"address"]];
        [stuArray addObject:model];
    }
    [self.dataBase close];
    return stuArray;
}
/**
 *  根据姓名 查找学生
 *
 *  @param name name
 *
 *  @return 名字为name的学生数组
 */
- (NSMutableArray *)getStudents:(NSString *)name{
    [self.dataBase open];
    FMResultSet *result = [self.dataBase executeQuery:@"SELECT * FROM Student WHERE name = ?",name];
    NSMutableArray *stuArray = [[NSMutableArray alloc] init];
    while ([result next]) {
        Student *model = [Student creatStudent:[result stringForColumn:@"name"] age:[result stringForColumn:@"age"] address:[result stringForColumn:@"address"]];
        [stuArray addObject:model];
    }
    [self.dataBase close];
    return stuArray;
}
查询是操作的重点,主要有这些方式:

                     <1>查询表格中所有数据

                     SELECT * FROM myStudentInfo

                     <2>查询指定的字段

                     实例:  查询所有名字name

                     SELECT name FROMmyStudentInfo

                     <3>根据指定的条件进行查询

                     实例: 查找name为zhansan的所有信息

                     SELECT * FROM myStudentInfo WHEREname = 'zhangsan'

                     <4>根据多个条件进行查询

                     实例: 查找name为zhansan, 并且性别为boy的所有信息

                     SELECT * FROM myStudentInfo WHEREname = 'zhangsan' AND sex = 'boy' 

                     <5>查询后需要排序

                     //根据age升序排列

                     SELECT * FROMmyStudentInfo  ORDER BYage;

                     //根据age降序排列

                     SELECT * FROMmyStudentInfo  ORDER BYage  DESC;

                     <6>获取数据行数

                     SELECT count(*)FROM myStudentInfo

四、最后看结果

在具体位置使用。这个demo的做法是使用5个按钮来操作这5个方法。

/**
 *  随机生成一个学生数据模型
 *
 *  @return 学生数据模型
 */
- (Student *)getStudent{
    Student *student = [Student creatStudent:self.nameArray[arc4random()%6] age:[NSString stringWithFormat:@"%u",arc4random()%100] address:[NSString stringWithFormat:@"%u",arc4random()%1000]];
    return student;
}

/**
 *  插入数据进数据库
 *
 *  @param sender sender description
 */
- (IBAction)addBtn:(UIButton *)sender {
    Student *stu = [self getStudent];
    [self insterStudent:stu];
}
/**
 *  删除一个学生数据  name = 一
 *
 *  @param sender sender description
 */
- (IBAction)delebtn:(UIButton *)sender {
    [self deleteStudent:[Student creatStudent:@"一" age:nil address:nil]];
}
/**
 *  修改学生数据 name = 二
 *
 *  @param sender sender description
 */
- (IBAction)modifyBtn:(UIButton *)sender {
    [self updateStudent:[Student creatStudent:@"二" age:@"1" address:@"0"]];
}
/**
 *  获取所有表中的数据
 *
 *  @param sender sender description
 */
- (IBAction)searchBtn:(UIButton *)sender{
    NSMutableArray *temp = (NSMutableArray *)[self getAllStudent];
    [temp enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        Student *student = (Student *)obj;
        NSLog(@"查找全部: name = %@ age = %@",student.name,student.age);
    }];
}

/**
 *  查询 name = 三 的学生
 *
 *  @param sender sender description
 */
- (IBAction)searBtn:(UIButton *)sender {
    NSMutableArray *temp = (NSMutableArray *)[self getStudents:@"三"];
    [temp enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        Student *student = (Student *)obj;
        NSLog(@"查找姓三的: name = %@ age = %@",student.name,student.age);
    }];
}


- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.nameArray = @[@"一",@"二",@"三",@"四",@"五",@"六"];
    [self initDataBase];
    [self creatTabel];
    // Do any additional setup after loading the view, typically from a nib.
}

操作后我们就可以在沙盒中看见我们新建的数据库和数据库中得表。查询增删改查操作的结果可以通过xcode打印和数据库表中的变化看见。

2015-10-23 17:19:31.429 FMDB[3273:131837] dbPath = /Users/xxxx/Library/Developer/CoreSimulator/Devices/B18BEA3B-03D9-45D1-A892-3E7E182DC345/data/Containers/Data/Application/52BC6009-A68A-450E-8692-1C49C5722781/Documents/Student1.db
2015-10-23 17:19:36.322 FMDB[3273:131837] 查找姓三的: name = 三 age = 28
2015-10-23 17:19:36.322 FMDB[3273:131837] 查找姓三的: name = 三 age = 17
2015-10-23 17:19:36.322 FMDB[3273:131837] 查找姓三的: name = 三 age = 94
2015-10-23 17:19:37.594 FMDB[3273:131837] 查找全部: name = 六 age = 97
2015-10-23 17:19:37.594 FMDB[3273:131837] 查找全部: name = 五 age = 71
2015-10-23 17:19:37.594 FMDB[3273:131837] 查找全部: name = 三 age = 28
2015-10-23 17:19:37.594 FMDB[3273:131837] 查找全部: name = 二 age = 1
2015-10-23 17:19:37.594 FMDB[3273:131837] 查找全部: name = 三 age = 17
2015-10-23 17:19:37.594 FMDB[3273:131837] 查找全部: name = 五 age = 51
2015-10-23 17:19:37.595 FMDB[3273:131837] 查找全部: name = 三 age = 94

FMDB的基本操作增删改查介绍完毕。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值