#import "SqliteManager.h"
#import <sqlite3.h>
@interface SqliteManager ()
@property (nonatomic, assign) sqlite3 *db;
@end
/**
sqlite3是iOS中纯C语言操作Sqlite数据库的一个库文件
*/
@implementation SqliteManager
+ (instancetype)sharedManager {
static id instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[self alloc] init];
});
return instance;
}
- (BOOL)openDB {
//获取沙盒路径,将数据库放入沙盒中
NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
filePath = [filePath stringByAppendingPathComponent:@"my.sqlite"];
//如果有队形的数据库,则打开对应的数据库,如果没有对应的数据库,则创建数据库
/**
参数一:文件路径,需要转换成c语言的字符串
参数二:操作数据库的对象
*/
if (sqlite3_open(filePath.UTF8String, &_db) != SQLITE_OK) {
NSLog(@"打开数据库失败");
return NO;
}
//如果打开成功则创建一张表,用于存放数据
return [self createTable];
}
- (BOOL)createTable {
//定义创建表SQL
NSString *createTableSql = @"CREATE TABLE IF NOT EXISTS 't_student' ('id' INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,'name' TEXT,'age' INTEGER);";
//执行sql语句
return [self execSQL:createTableSql];
}
- (BOOL)execSQL:(NSString *)sql {
//执行sql语句
return sqlite3_exec(self.db, sql.UTF8String, nil, nil, nil) == SQLITE_OK;
}
- (NSArray *)querySQL:(NSString *)querySQL {
//定义游标对象
sqlite3_stmt *stmt = nil;
//准备工作:获取查询的游标对象
/**
参数三:查询语句的长度,-1为自动计算
参数四:查询游标对象的地址
*/
if (sqlite3_prepare_v2(self.db, querySQL.UTF8String, -1, &stmt, nil) != SQLITE_OK) {
NSLog(@"没有装备成功");
return nil;
}
//取出某一行的数据
NSMutableArray *tempArray = [NSMutableArray array];
//获取字段的个数
int count = sqlite3_column_count(stmt);
while (sqlite3_step(stmt) == SQLITE_ROW) {
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
for (int i = 0; i < count; i++) {
//取出当前字段的名称(key)
NSString *key = [NSString stringWithUTF8String:sqlite3_column_name(stmt, i)];
//取出当前字段对应的值
const char *cValue = (const char *)sqlite3_column_text(stmt, i);
NSString *value = [NSString stringWithUTF8String:cValue];
//将键值对放入字典中
[dict setObject:value forKey:key];
}
[tempArray addObject:dict];
}
//不使用游标时需要释放对象
sqlite3_finalize(stmt);
return tempArray;
}
@end