• 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

  • 相关阅读:
    ugui点击穿透判断
    c#字符串代码,动态创建编译器
    github项目分享
    unity 2d 版的lookAt
    unity全屏截图
    shader例子
    AcWing 329. 围栏障碍训练场
    AcWing 326. XOR和路径
    AcWing 324. 贿赂FIPA
    AcWing 322. 消木块
  • 原文地址:https://www.cnblogs.com/YhhMzl/p/5046872.html
Copyright © 2020-2023  润新知