oc中FMDB數(shù)據(jù)存儲(chǔ)工具類

先上代碼

#import "FMDBManager.h"
#import <FMDB/FMDB.h>

@implementation FMDBManager {
    FMDatabase *_db;
}

+ (instancetype)sharedManager {
    static FMDBManager *manager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        manager = [[FMDBManager alloc] init];
        [manager setupDatabase];
    });
    return manager;
}

- (void)setupDatabase {
    NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    NSString *databasePath = [documentsPath stringByAppendingPathComponent:@"mydatabase.sqlite"];
    _db = [FMDatabase databaseWithPath:databasePath];
    if ([_db open]) {
        NSString *createTableSql = @"CREATE TABLE IF NOT EXISTS mytable (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)";
        if (![_db executeUpdate:createTableSql]) {
            NSLog(@"創(chuàng)建表失敗:%@", [_db lastErrorMessage]);
        }
    } else {
        NSLog(@"打開數(shù)據(jù)庫失?。?@", [_db lastErrorMessage]);
    }
}

- (void)insertDataWithDictionary:(NSDictionary *)dictionary {
    NSString *name = dictionary[@"name"];
    NSNumber *age = dictionary[@"age"];
    NSString *insertSql = @"INSERT INTO mytable (name, age) VALUES (?, ?)";
    if (![_db executeUpdate:insertSql, name, age]) {
        NSLog(@"插入數(shù)據(jù)失敗:%@", [_db lastErrorMessage]);
    }
}

- (NSArray *)getAllData {
    NSMutableArray *result = [NSMutableArray array];
    NSString *querySql = @"SELECT * FROM mytable";
    FMResultSet *resultSet = [_db executeQuery:querySql];
    while ([resultSet next]) {
        NSInteger id = [resultSet intForColumn:@"id"];
        NSString *name = [resultSet stringForColumn:@"name"];
        NSInteger age = [resultSet intForColumn:@"age"];
        NSDictionary *dictionary = @{@"id": @(id), @"name": name, @"age": @(age)};
        [result addObject:dictionary];
    }
    return result;
}

- (void)deleteDataWithId:(NSInteger)id {
    NSString *deleteSql = @"DELETE FROM mytable WHERE id = ?";
    if (![_db executeUpdate:deleteSql, @(id)]) {
        NSLog(@"刪除數(shù)據(jù)失?。?@", [_db lastErrorMessage]);
    }
}

- (void)updateDataWithDictionary:(NSDictionary *)dictionary {
    NSInteger id = [dictionary[@"id"] integerValue];
    NSString *name = dictionary[@"name"];
    NSNumber *age = dictionary[@"age"];
    NSString *updateSql = @"UPDATE mytable SET name = ?, age = ? WHERE id = ?";
    if (![_db executeUpdate:updateSql, name, age, @(id)]) {
        NSLog(@"更新數(shù)據(jù)失敗:%@", [_db lastErrorMessage]);
    }
}

@end

這個(gè)工具類名為 FMDBManager,使用了單例模式。在單例的初始化方法 setupDatabase 中,首先獲取應(yīng)用程序沙盒中的 Documents 目錄,然后在該目錄下創(chuàng)建一個(gè)名為 mydatabase.sqlite 的 SQLite 數(shù)據(jù)庫文件,并使用 FMDatabase 類創(chuàng)建一個(gè)名為 _db 的數(shù)據(jù)庫對(duì)象。

然后,通過執(zhí)行 SQL 語句創(chuàng)建一個(gè)名為 mytable 的表。在 insertDataWithDictionary 方法中,使用 executeUpdate:arguments: 方法執(zhí)行插入數(shù)據(jù)的 SQL 語句。在 getAllData方法中,使用 executeQuery: 方法執(zhí)行查詢數(shù)據(jù)的 SQL 語句,得到一個(gè) FMResultSet 對(duì)象。然后使用 while 循環(huán)遍歷查詢結(jié)果,將每一行數(shù)據(jù)轉(zhuǎn)換為字典對(duì)象,并添加到一個(gè)可變數(shù)組中。最后,返回該數(shù)組。

deleteDataWithId 方法中,使用 executeUpdate:arguments: 方法執(zhí)行刪除數(shù)據(jù)的 SQL 語句。在 updateDataWithDictionary 方法中,使用 executeUpdate:arguments: 方法執(zhí)行更新數(shù)據(jù)的 SQL 語句。

使用方法

// 插入數(shù)據(jù)
NSDictionary *dictionary = @{@"name": @"Tom", @"age": @18};
[[FMDBManager sharedManager] insertDataWithDictionary:dictionary];

// 查詢所有數(shù)據(jù)
NSArray *result = [[FMDBManager sharedManager] getAllData];
NSLog(@"查詢結(jié)果:%@", result);

// 刪除數(shù)據(jù)
NSInteger idToDelete = 1;
[[FMDBManager sharedManager] deleteDataWithId:idToDelete];

// 更新數(shù)據(jù)
NSDictionary *dictionaryToUpdate = @{@"id": @2, @"name": @"Jerry", @"age": @20};
[[FMDBManager sharedManager] updateDataWithDictionary:dictionaryToUpdate];

這個(gè)示例中,首先插入了一條數(shù)據(jù),然后查詢所有數(shù)據(jù)并輸出結(jié)果。接著刪除了一條數(shù)據(jù),最后更新了一條數(shù)據(jù)。需要注意的是,示例中的 SQL 語句都比較簡(jiǎn)單,實(shí)際開發(fā)中可能需要更加復(fù)雜的 SQL 語句來實(shí)現(xiàn)更加靈活的數(shù)據(jù)存儲(chǔ)和查詢。

存儲(chǔ)Model

.h

@interface Person : NSObject

@property (nonatomic, assign) NSInteger id;
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSInteger age;

@end

.m

@implementation Person

@end

在存儲(chǔ) Person 對(duì)象時(shí),可以先將其轉(zhuǎn)換為 NSDictionary:

- (void)insertPerson:(Person *)person {
    NSString *sql = @"INSERT INTO person (name, age) VALUES (?, ?)";
    NSDictionary *arguments = @{@"name": person.name, @"age": @(person.age)};
    BOOL success = [self.db executeUpdate:sql withParameterDictionary:arguments];
    if (!success) {
        NSLog(@"插入數(shù)據(jù)失敗");
    }
}

在查詢 Person 對(duì)象時(shí),可以先將查詢結(jié)果轉(zhuǎn)換為 NSDictionary 或 NSArray,再將其轉(zhuǎn)換為 Person 對(duì)象:

- (NSArray<Person *> *)getAllPersons {
    NSString *sql = @"SELECT * FROM person";
    FMResultSet *result = [self.db executeQuery:sql];
    NSMutableArray *persons = [NSMutableArray array];
    while ([result next]) {
        NSInteger personId = [result intForColumn:@"id"];
        NSString *name = [result stringForColumn:@"name"];
        NSInteger age = [result intForColumn:@"age"];
        Person *person = [[Person alloc] init];
        person.id = personId;
        person.name = name;
        person.age = age;
        [persons addObject:person];
    }
    return persons;
}

需要注意的是,在進(jìn)行 Model 轉(zhuǎn)換時(shí),要保證 Model 中的屬性名與數(shù)據(jù)庫中的列名一致,否則可能會(huì)出現(xiàn)錯(cuò)誤。另外,如果 Model 中的屬性比較復(fù)雜,如包含了數(shù)組、字典等嵌套結(jié)構(gòu),轉(zhuǎn)換可能會(huì)比較復(fù)雜,需要進(jìn)行適當(dāng)?shù)奶幚怼?/p>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容