1. 程式人生 > >FMDB中FMDatabaseQueue簡單使用筆記及錯誤整理

FMDB中FMDatabaseQueue簡單使用筆記及錯誤整理

FMDB是什麼

專案需要資料本地快取,所以想到了使用本地資料庫。iOS的本地資料庫就是SQLite,而FMDB就是一個Objective-C編寫的SQLite封裝庫。

FMDB的匯入及使用

1.FMDB地址:Github地址

2.使用Cocoapods匯入,只需要在Podfile中新增pod 'FMDB',然後pod install

FMDatabaseQueue

資料庫建立

NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *filePath = [docPath stringByAppendingPathComponent:[NSString stringWithFormat:@"my.sql"]];
NSLog(@"%@",filePath);
_queueDB = [FMDatabaseQueue databaseQueueWithPath:filePath];

表的建立

[_queueDB inDatabase:^(FMDatabase * _Nonnull db) {
        BOOL result = [db executeUpdate:@"CREATE TABLE IF NOT EXISTS myInfo (myId integer PRIMARY KEY AUTOINCREMENT,myName text NOT NULL)"];
        if (result) {
            NSLog(@"建立表myInfo成功");
        }else{
            NSLog(@"建立表myInfo失敗");
        }
 }];

新增資料

[_queueDB inDatabase:^(FMDatabase * _Nonnull db) {
        BOOL result = [db executeUpdate:@"INSERT INTO myInfo (myId,myName) VALUES (?,?)",@1,@"yu"];
        if (result) {
            NSLog(@"表myInfo新增資料成功");
        }else{
            NSLog(@"表myInfo新增資料失敗");
        }
 }];

新增資料,如果已經存在就更新 

[_queueDB inDatabase:^(FMDatabase * _Nonnull db) {
        BOOL result = [db executeUpdate:@"REPLACE INTO myInfo (myId,myName) VALUES (?,?)",@1,@"yu"];
        if (result) {
            NSLog(@"表myInfo新增資料成功");
        }else{
            NSLog(@"表myInfo新增資料失敗");
        }
 }];

 查詢資料

[_queueDB inDatabase:^(FMDatabase * _Nonnull db) {
        FMResultSet *set = [db executeQuery:@"SELECT myName FROM myInfo WHERE myId = ?",@1];
        while ([set next]) {
            NSString *name = [set intForColumn:@"myName"];
            NSLog(@"%@",name);
        }
        [set close];
 }];

事務的使用

[myDB.queueDB inTransaction:^(FMDatabase * _Nonnull db, BOOL * _Nonnull rollback) {
     BOOL result = [db executeUpdate:@"INSERT INTO curveInfo (m yId,myName) VALUES (?,?)",@1,@""];
     if (!result) {
        *rollback = YES;
        return;
     }
}];

錯誤總結

  • 進入下面語句並報錯崩潰
else if (args) {
     obj = va_arg(args, id);
}

 

解決 :進行INSERT操作時不能插入簡單資料型別(int, long等),必須轉化為NSNumber類,如下:

[NSNumber numberWithInt:1]