123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215 |
- //
- // DBManager.m
- // LenzCameraNativeModuleForRN
- //
- // Created by 王昭威 on 2023/1/29.
- //
- #import "DBManager.h"
- #import <sqlite3.h>
- #import "LenzCachedResourceModel.h"
- #import "LenzHeader.h"
- @interface LenzDBManager ()
- @property (nonatomic, strong) dispatch_queue_t serialQueue;
- @end
- @implementation LenzDBManager{
- sqlite3 *_db; // 句柄
- }
- + (instancetype)shared{
- static dispatch_once_t token;
- static LenzDBManager* instance = nil;
- dispatch_once(&token, ^{
- instance = [[self alloc] init];
- });
-
- return instance;
- }
- - (instancetype)init{
- self = [super init];
- if(self){
- _serialQueue = dispatch_queue_create("db", DISPATCH_QUEUE_SERIAL);
- }
-
- return self;
- }
- // 打开数据库
- - (void)openSqlDataBase {
- dispatch_sync(self.serialQueue, ^{
- // _db是数据库的句柄,即数据库的象征,如果对数据库进行增删改查,就得操作这个示例
-
- // 获取数据库文件的路径
- NSString *docPath = [PCSTools shared].documentPath;
- NSString *fileName = [docPath stringByAppendingPathComponent:@"image_disk_cache.sqlite"];
- NSLog(@"fileNamePath = %@",fileName);
- // 将 OC 字符串转换为 C 语言的字符串
- const char *cFileName = fileName.UTF8String;
-
- // 打开数据库文件(如果数据库文件不存在,那么该函数会自动创建数据库文件)
- int result = sqlite3_open(cFileName, &_db);
-
- if (result != SQLITE_OK) { // 打开成功
- NSLog(@"打开数据库失败");
- return;
- }
- NSLog(@"打开数据库成功");
-
- // 创建表
- /**
- type
- 1: photo
- 2: movie
- 3: others
- */
- const char *sql = "CREATE TABLE IF NOT EXISTS t_cached_resources (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, type integer NOT NULL, unique (name, type));";
- char *errMsg = NULL;
-
- result = sqlite3_exec(_db, sql, NULL, NULL, &errMsg);
- if (result == SQLITE_OK) {
- NSLog(@"创建表成功");
- }
- else {
- NSLog(@"创建表失败");
- printf("创表失败---%s----%s---%d",errMsg,__FILE__,__LINE__);
- }
- });
- }
- - (BOOL)insertWithName:(NSString*)name type: (int)type{
- __block BOOL success = NO;
- dispatch_sync(self.serialQueue, ^{
- if(_db == NULL){
- return;
- }
-
- const char *sql = "INSERT INTO t_cached_resources (name, type) VALUES (?, ?);";
- sqlite3_stmt* stmt = NULL;
- if(sqlite3_prepare_v2(_db, sql, -1, &stmt, NULL) == SQLITE_OK){
- sqlite3_bind_text(stmt, 1, name.UTF8String, -1, SQLITE_TRANSIENT);
- sqlite3_bind_int(stmt, 2, type);
- int ret = sqlite3_step(stmt);
- success = ret == SQLITE_DONE;
- if(ret == SQLITE_DONE){
-
- }
- else{
- NSLog(@"insert error");
- }
- }
-
- sqlite3_finalize(stmt);
- });
-
- return success;
- }
- - (LenzCachedResourceModel*)queryByName: (NSString*)name type: (int)type{
- __block LenzCachedResourceModel* ret = nil;
- dispatch_sync(self.serialQueue, ^{
- const char* sql = "SELECT * FROM t_cached_resources where name=? and type =?;";
- sqlite3_stmt* stmt = NULL;
- NSInteger state = sqlite3_prepare_v2(_db, sql, -1, &stmt, NULL);
- sqlite3_bind_text(stmt, 1, name.UTF8String, -1, SQLITE_TRANSIENT);
- sqlite3_bind_int(stmt, 2, type);
- if (state == SQLITE_OK)
- // 成功指向一条记录
- while (sqlite3_step(stmt) == SQLITE_ROW) {
- // 封装的实体
- LenzCachedResourceModel *model = [[LenzCachedResourceModel alloc] init];
- const unsigned char* str = sqlite3_column_text(stmt, 1);
- if(str != NULL){
- model.name = [NSString stringWithUTF8String:(const char*)str];
- }
- model.type = sqlite3_column_int(stmt, 2);
- ret = model;
- }
- else
- NSLog(@"----- 读取数据失败 -----");
- sqlite3_finalize(stmt);
- });
-
- return ret;
- }
- - (void)deleteByName: (NSString*)name type: (int)type{
- dispatch_sync(self.serialQueue, ^{
- const char *sql = "DELETE FROM t_cached_resources where name=? and type =?;";
- sqlite3_stmt* stmt = NULL;
- sqlite3_prepare_v2(_db, sql, -1, &stmt, NULL);
- sqlite3_bind_text(stmt, 1, name.UTF8String, -1, SQLITE_TRANSIENT);
- sqlite3_bind_int(stmt, 2, type);
- sqlite3_step(stmt);
- sqlite3_finalize(stmt);
- });
- }
- - (void)deleteModels:(NSArray<LenzCachedResourceModel *> *)models{
- dispatch_sync(self.serialQueue, ^{
- const char *sql = "DELETE FROM t_cached_resources where name=? and type =?;";
- sqlite3_stmt* stmt = NULL;
- sqlite3_exec(_db, "BEGIN EXCLUSIVE TRANSACTION", 0, 0, 0);
- if(sqlite3_prepare_v2(_db, sql, -1, &stmt, NULL) == SQLITE_OK){
- [models enumerateObjectsUsingBlock:^(LenzCachedResourceModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
-
- sqlite3_bind_text(stmt, 1, obj.name.UTF8String, -1, SQLITE_TRANSIENT);
- sqlite3_bind_int(stmt, 2, (int)obj.type);
- sqlite3_step(stmt);
- sqlite3_reset(stmt);
- }];
- }
- if(sqlite3_finalize(stmt) != SQLITE_OK){
- NSLog(@"SQL Error: %s",sqlite3_errmsg(_db));
- }
- if (sqlite3_exec(_db, "COMMIT TRANSACTION", 0, 0, 0) != SQLITE_OK)
- NSLog(@"SQL Error: %s",sqlite3_errmsg(_db));
- });
- }
- - (NSArray<LenzCachedResourceModel*>*)fetchAll{
- NSMutableArray<LenzCachedResourceModel*>* ret = nil;
- @autoreleasepool {
- ret = [NSMutableArray array];
- dispatch_sync(self.serialQueue, ^{
- const char* sql = "SELECT * FROM t_cached_resources;";
- sqlite3_stmt* stmt = NULL;
- NSInteger state = sqlite3_prepare_v2(_db, sql, -1, &stmt, NULL);
- if (state == SQLITE_OK)
- // 成功指向一条记录
- while (sqlite3_step(stmt) == SQLITE_ROW) {
- // 封装的实体
- LenzCachedResourceModel *model = [[LenzCachedResourceModel alloc] init];
- const unsigned char* str = sqlite3_column_text(stmt, 1);
- if(str != NULL){
- model.name = [NSString stringWithUTF8String:(const char*)str];
- }
- model.type = sqlite3_column_int(stmt, 2);
- [ret addObject:model];
- }
- else
- NSLog(@"----- 读取数据失败 -----");
- sqlite3_finalize(stmt);
- });
- }
- return [ret copy];
- }
- - (BOOL)close{
- __block BOOL success = NO;
- dispatch_sync(self.serialQueue, ^{
- int ret = sqlite3_close(_db);
- success = SQLITE_OK == ret;
- });
-
- return !!success;
- }
- @end
|