FMDB的使用方法

 

1.建表

我们可以使用代码建表, 不过代码建表的话代码会比较复杂, 所以这里我们使用工具建表, 工具名字是 SQLiteManager, 百度云下载地址为: http://pan.baidu.com/s/1hq6TtAk
打开 SQLiteManager 工具,创建 SQLite 文件,  如下图:
 
SQLite 文件创建完毕以后 建表:如下图
 
 
2. 把创建好的 SQLite 文件拖进工程里面
 
这时候工程里面就有我们刚才创建的 SQLite 文件和里面的表了
 
3. 引入 FMDB 框架
同时需要引入系统框架  libsqlite3,xcode6为 dylib 后缀, xcode7为 tbd 后缀。
4. 框架使用
1. 由于工程中的文件在打包以后是不能再被修改的, 所以我们不能使用工程里面的 SQLite 文件进行数据存储,我们现在把工程中的文件 copy 进沙盒里面, 这样沙盒里面就有一个一个这样的文件。
 
在.m中引入头文件以及设置属性

#import "DBManager.h"

#import "FMDB.h"

#import "Person.h"

@interface DBManager()

@property(nonatomic, strong)FMDatabaseQueue *openQueue;

@property(nonatomic, copy)NSString *filePath;

@end

 

//重写init方法

- (instancetype)init{

    if (self = [super init]) {

    //存在沙盒中的路径

        self.filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)firstObject] stringByAppendingPathComponent:@"person.sqlite"];

        [self checkSQLiteWithPath:_filePath];

    }

    return self;

}

//判断文件夹路径下, sqlite路径是否存在

- (void)checkSQLiteWithPath:(NSString *)path{

    NSFileManager *fileManager = [NSFileManager defaultManager];

    if ([fileManager fileExistsAtPath:path]) {

        //暂时不做处理

    }else{

      //将工程中的 SQLite 文件拷贝进沙盒里面, 用来存储数据

        //1.工程中 SQLite 路径

        NSString *boundPath = [[NSBundle mainBundle] pathForResource:@"Person" ofType:@"sqlite"];

        if (boundPath.length == 0) {

            NSLog(@"工程中的 SQLite 文件不存在, 请重新引入");

            abort();

        }

       BOOL result = [fileManager copyItemAtPath:boundPath toPath:path error:nil];

        result?NSLog(@"拷贝成功"):NSLog(@"拷贝失败");

    }

    //初始化opeQueue

    //操作沙盒中的数据库文件

    self.openQueue = [FMDatabaseQueue databaseQueueWithPath:path];

}

 
对数据进行操作, 例如添加数据, 查询数据, 删除数据, 修改数据和删除数据库等操作.
在.h中写方法的声明

#import <Foundation/Foundation.h>

@class Person;

@interface DBManager : NSObject

//单例初始化方法

+ (DBManager *)sharedDBManager;

- (void)insertData:(Person *)person;

- (NSArray *)selectData;

- (void)deleteData:(NSString *)name;

- (void)updateDataWithName:(NSString *)name :(NSString *)gender;

- (void)removeDataBase;

@end

 在.m中实现方法

#import "DBManager.h"

#import "FMDB.h"

#import "Person.h"

@interface DBManager()

@property(nonatomic, strong)FMDatabaseQueue *openQueue;

@property(nonatomic, copy)NSString *filePath;

@end

@implementation DBManager

+ (DBManager *)sharedDBManager{

    static DBManager *dbManager = nil;

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        dbManager = [[DBManager alloc] init];

    });

    return dbManager;

}

//重写init方法

- (instancetype)init{

    if (self = [super init]) {

    //存在沙盒中的路径

        self.filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)firstObject] stringByAppendingPathComponent:@"person.sqlite"];

        [self checkSQLiteWithPath:_filePath];

    }

    return self;

}

//判断文件夹路径下, sqlite路径是否存在

- (void)checkSQLiteWithPath:(NSString *)path{

    NSFileManager *fileManager = [NSFileManager defaultManager];

    if ([fileManager fileExistsAtPath:path]) {

        //暂时不做处理

    }else{

      //将工程中的 SQLite 文件拷贝进沙盒里面, 用来存储数据

        //1.工程中 SQLite 路径

        NSString *boundPath = [[NSBundle mainBundle] pathForResource:@"Person" ofType:@"sqlite"];

        if (boundPath.length == 0) {

            NSLog(@"工程中的 SQLite 文件不存在, 请重新引入");

            abort();

        }

       BOOL result = [fileManager copyItemAtPath:boundPath toPath:path error:nil];

        result?NSLog(@"拷贝成功"):NSLog(@"拷贝失败");

    }

    //初始化opeQueue

    //操作沙盒中的数据库文件

    self.openQueue = [FMDatabaseQueue databaseQueueWithPath:path];

}

- (void)insertData:(Person *)person{

    [self.openQueue inDatabase:^(FMDatabase *db) {

        [db open];

       BOOL result = [db executeUpdate:@"insert into PersonTable(name, gender, age) values (?, ?, ?)", person.name, person.gender, @(person.age)];

        result?NSLog(@"添加数据成功"):NSLog(@"添加数据失败");

        [db close];

    }];

}

- (NSArray *)selectData{

    NSMutableArray *perArr = [@[] mutableCopy];

    [self.openQueue inDatabase:^(FMDatabase *db) {

        [db open];

        FMResultSet *result = [db executeQuery:@"select * from PersonTable"];

        while ([result next]) {

            NSString *name = [result stringForColumn:@"name"];

            NSString *gender = [result stringForColumn:@"gender"];

            NSInteger age = [result intForColumn:@"age"];

            Person *person = [Person personWithName:name gender:gender age:age];

            [perArr addObject:person];

        }

        [db close];

    }];

    return perArr;

}

- (void)deleteData:(NSString *)name{

    [self.openQueue inDatabase:^(FMDatabase *db) {

        [db open];

        BOOL result = [db executeUpdate:@"delete from PersonTable where name = ?", name];

        result ?NSLog(@"删除数据成功"):NSLog(@"删除数据失败");

        [db close];

    }];

}

- (void)updateDataWithName:(NSString *)name :(NSString *)gender{

    [self.openQueue inDatabase:^(FMDatabase *db) {

        [db open];

        BOOL result = [db executeUpdate:@"update PersonTable set name = ? where gender = ?", name, gender];

        result ?NSLog(@"更新数据成功"):NSLog(@"更新数据失败");

        [db close];

    }];

}

- (void)removeDataBase{

    NSFileManager *fileManager = [NSFileManager defaultManager];

    BOOL result = [fileManager removeItemAtPath:self.filePath error:nil];

    result ? NSLog(@"删除数据库成功"):NSLog(@"删除数据库失败");

}

@end

 

posted @ 2015-12-14 23:24  星空梦之蓝  阅读(286)  评论(0编辑  收藏  举报