不明觉厉iOSiOS面试资料上海恩美路演

09.iOS FMDB的基本使用

2016-01-16  本文已影响7725人  Liwx

@(〓〓 iOS-实用技术)[SQLite 数据库]


目录


1.FMDB基本使用

FMDB简介

FMDB是iOS平台的SQLite数据库框架
FMDB以OC的方式封装了SQLite的C语言API

使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码
提供了多线程安全的数据库操作方法,有效地防止数据混乱

FMDB的安装方式

pod 'FMDB'

1.导入FMDB文件
2.导入系统依赖库sqlite3.0.tbd


FMDB核心类

FMDatabase数据库

一个FMDatabase对象就代表一个单独的SQLite数据库
用来执行SQL语句

FMResultSet查询结果集

使用FMDatabase执行查询后的结果集

FMDatabaseQueue线程安全数据库操作

用于在多线程中执行多个查询或更新,它是线程安全


FMDB使用步骤

// 1.打开数据库
FMDatabase *db = [FMDatabase databaseWithPath:path];
if ([db open])  { NSLog(@"打开成功!"); }

在FMDB中,除查询以外的所有操作,都称为“更新”
create、drop、insert、update、delete
使用executeUpdate:方法执行更新

// FMDB更新方法
-(BOOL)executeUpdate:(NSString)sql, ...
-(BOOL)executeUpdateWithFormat:(NSString
)format, ...
-(BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments

// 2.执行更新
[db executeUpdate:@"UPDATE t_student SET age = ? WHERE name = ?;", @20, @"Jack"]

    - (FMResultSet *)executeQuery:(NSString*)sql, ...
    - (FMResultSet *)executeQueryWithFormat:(NSString*)format, ...
    - (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray *)arguments
// 查询数据
FMResultSet *rs = [db executeQuery:@"SELECT * FROM t_student"];

// 遍历结果集
while ([rs next]) {
    NSString *name = [rs stringForColumn:@"name"];
    int age = [rs intForColumn:@"age"];
    double score = [rs doubleForColumn:@"score"];
}

[self.db close];

2.FMDabaseQueue的简单使用

FMDabaseQueue简介

FMDatabase这个类是线程不安全的,如果在多个线程中同时使用一个FMDatabase实例,会造成数据混乱等问题
为了保证线程安全,FMDB提供方便快捷的FMDatabaseQueue类

FMDabaseQueue的使用

    FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:path];
简单使用
    [queue inDatabase:^(FMDatabase *db) {
        [db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Jack"];
        // 查询
        FMResultSet *rs = [db executeQuery:@"select * from t_student"];
    }];
使用事务
    [queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
        [db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Jack"];
        //查询
        FMResultSet *rs = [db executeQuery:@"select * from t_student"];
    }];

3.FMDB FMDatabase类的简单使用


手动集成FMDB步骤

FMDB GitHub链接: https://github.com/ccgus/fmdb

01.将fmdb框架文件夹拖入工程.png
2.添加系统依赖库sqlite3.0.tbd.png
3.导入FMDB.h头文件.png

创建数据库和数据表基本步骤



- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 0.拼接数据库存放的沙盒路径
    NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
    NSString *sqlFilePath = [path stringByAppendingPathComponent:@"student.sqlite"];
    
    // 1.通过路径创建数据库
    self.db = [FMDatabase databaseWithPath:sqlFilePath];
    
    // 2.打开数据库
    if ([self.db open]) {
        NSLog(@"打开成功");
        
        BOOL success = [self.db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_student (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER DEFAULT 1)"];
        
        if (success) {
            NSLog(@"创建表成功");
        } else {
            NSLog(@"创建表失败");
        }
        
    } else {
        NSLog(@"打开失败");
    }
}

FMDatabase数据库的增删改查(CRUD)

// 插入数据
static NSInteger age = 10;
age++;

BOOL success = [self.db executeUpdate:@"INSERT INTO t_student (name, age) VALUES (?, ?);", @"jack", @(age)];

if (success) {
    NSLog(@"插入成功");
} else {
    NSLog(@"插入失败");
}
// 删除数据
BOOL success = [self.db executeUpdate:@"DELETE FROM t_student WHERE age > 20 AND age < 25;"];
// 修改数据
BOOL success = [self.db executeUpdate:@"UPDATE t_student SET name = 'liwx' WHERE age > 12 AND age < 15;"];
// 查询数据
FMResultSet *result = [self.db executeQuery:@"SELECT id, name, age FROM t_student WHERE age > 25;"];

while ([result next]) {
    int ID = [result intForColumnIndex:0];
    NSString *name = [result stringForColumnIndex:1];
    int age = [result intForColumn:@"age"];
    
    NSLog(@"ID: %zd, name: %@, age: %zd", ID, name, age);
}

4.FMDatabaseQueue数据库队列基本使用

使用FMDatabaseQueue类在多线程中执行多个查询或更新是线程安全的.

使用FMDatabaseQueue创建数据库

只要成功创建数据库队列对象,FMDB内部就会自动给我们加载数据库对象.无需再执行打开数据库操作.

使用 inDatabase:方法传递数据库对象.

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 0.拼接数据库存放的沙盒路径
    NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
    NSString *sqlFilePath = [path stringByAppendingPathComponent:@"student.sqlite"];
    
    // 1.创建一个FMDatabaseQueue对象
    // 只要创建数据库队列对象, FMDB内部就会自动给我们加载数据库对象
    self.dbQueue = [FMDatabaseQueue databaseQueueWithPath:sqlFilePath];
    
    // 2.执行操作
    // 会通过block传递队列中创建好的数据库
    [self.dbQueue inDatabase:^(FMDatabase *db) {
        
        BOOL success = [db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_student (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER DEFAULT 1);"];
        
        if (success) {
            NSLog(@"创建表成功");
        } else {
            NSLog(@"创建表失败");
        }
        
    }];
    
}

FMDatabaseQueue队列数据库的增删改查(CRUD)

- (IBAction)insertClick {
    
    static NSInteger age = 10;
    age++;
    
    [self.dbQueue inDatabase:^(FMDatabase *db) {
        
        BOOL success = [db executeUpdate:@"INSERT INTO t_student (name, age) VALUES (?, ?);", @"jack", @(age)];
        
        if (success) {
            NSLog(@"插入成功");
        } else {
            NSLog(@"插入失败");
        }
    }];
    
}
// 删除数据
[self.dbQueue inDatabase:^(FMDatabase *db) {
    
    BOOL success = [db executeUpdate:@"DELETE FROM t_student WHERE age > 20 AND age < 25;"];
        
    // 判断是否SQL是否执行成功   
    // ...
}
// 修改数据
[self.dbQueue inDatabase:^(FMDatabase *db) {
        
    BOOL success = [db executeUpdate:@"UPDATE t_student SET name = 'liwx' WHERE age > 12 AND age < 15;"];
    
    // 判断是否SQL是否执行成功  
    // ...
}
// 查询数据
- (IBAction)queryClick {
    
    [self.dbQueue inDatabase:^(FMDatabase *db) {
        
        FMResultSet *result = [db executeQuery:@"SELECT id, name, age FROM t_student WHERE age > 25;"];
        
        while ([result next]) {
            int ID = [result intForColumnIndex:0];
            NSString *name = [result stringForColumnIndex:1];
            int age = [result intForColumn:@"age"];
            
            NSLog(@"ID: %zd, name: %@, age: %zd", ID, name, age);
        }
    }];
    
    
}
上一篇下一篇

猜你喜欢

热点阅读