新建一个继承与NSObject的类,在延展中声明一个字符串类型的属性用来存储数据库文件路径。
@property(nonatomic,strong)NSString* dbFileName;//数据库文件路径
给这个类添加一个单例的方法,保持该类对象的唯一
//单例方法
+ (DatabaseHelper*)shareDataBaseHelper{
static DatabaseHelper* dbHelper = nil;
if (dbHelper == nil) {
dbHelper = [[DatabaseHelper alloc] init];
}
return dbHelper;
}
创建数据库文件存储的路径,一般在Documents或者Library/Caches
- (void)dbFileNameWithName:(NSString *)fileName{
//将fileName中的空格干掉
fileName = [fileName stringByReplacingOccurrencesOfString:@" " withString:@""];
//判断用户传递进来的文件名是否为nil
if (fileName) {
//判断文件名是否为空字符串
if (fileName.length == 0) {
//空字符串@“”
NSLog(@"数据库文件无名称,当程序关闭的时候,数据库文件也会销毁");
}else{
//判断文件名是否带后缀名,如果有直接使用,如果没有后缀名,添加后缀名之后在使用
if (![fileName hasSuffix:@".sqlite"]) {
//如果没有后缀名,先添加在使用
[fileName stringByAppendingString:@".sqlite"];
}
}
}else{
//说明文件名为nil
NSLog(@"数据库文件无名称,当程序关闭的时候,数据库文件也会销毁");
fileName = @"";
}
//将文件名称拼接成有效的文件路径
NSString* documentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
//将处理好的文件名赋值给属性,让其他方法使用
self.dbFileName = [documentsPath stringByAppendingPathComponent:fileName];
}
打开或创建数据库
//打开或者创建数据库
- (sqlite3 *)openOrCreateDB{
sqlite3 *sqlite = nil;
int result = sqlite3_open(self.dbFileName.UTF8String, &sqlite);
if (result == SQLITE_OK) {
NSLog(@"数据库打开成功");
return sqlite;
}else{
NSLog(@"数据库打开失败-----%d",result);
return NULL;
}
}
无返回集的操作方法(非查询方法)
//无返回集执行的方法
- (BOOL)noQueryWithSql:(NSString *)sql{
//执行任何操作之前先打开数据库,操作执行完毕之后,关闭数据库
sqlite3 *sqlite = [self openOrCreateDB];
//执行sql语句
//保证数据库打开成功
if (sqlite) {
int result = sqlite3_exec(sqlite, sql.UTF8String, NULL, NULL, NULL);
//当操作有结果的时候,要关闭数据库
sqlite3_close(sqlite);
if (result == SQLITE_OK) {
NSLog(@"执行非查询操作成功");
return YES;
}else{
NSLog(@"执行非查询操作失败-----%d",result);
return NO;
}
}else{
NSLog(@"执行非查询操作时打开数据库失败");
return NO;
}
}
通用的查询方法
//通用查询的方法
- (NSMutableArray*)queryWithSql:(NSString *)sql{
//创建可变数组,用来存放所有的记录
NSMutableArray* resultMArray = [[NSMutableArray alloc] init];
//打开数据库
sqlite3 *sqlite = [self openOrCreateDB];
//声明伴随指针,用来存放所有的记录
sqlite3_stmt *stmt = nil;
int result = sqlite3_prepare(sqlite, sql.UTF8String, -1, &stmt, NULL);
if (result == SQLITE_OK) {
//说明sql语句没有问题
//从伴随指针中遍历取出每一条记录
while (sqlite3_step(stmt) == SQLITE_ROW) {
//没执行一次循环体,就取出一条记录
NSMutableDictionary* rowMDic = [[NSMutableDictionary alloc] init];
//确定该条记录有几个字段
int sumColumn = sqlite3_column_count(stmt);
//for循环遍历一条记录中的所有字段,给字典赋值
for (int i = 0; i < sumColumn; i++) {
//获取当前列的数据类型
int type = sqlite3_column_type(stmt, i);
//获取当前列的字段名
const char* name = sqlite3_column_name(stmt, i);
NSString* key = [NSString stringWithCString:name encoding:NSUTF8StringEncoding];
switch (type) {
case SQLITE_INTEGER:
//int型
{
//取值
int value = sqlite3_column_int(stmt, i);
//赋值
[rowMDic setObject:@(value) forKey:key];
}
break;
case SQLITE_TEXT:
//字符串类型
{
//取值
const unsigned char *value = sqlite3_column_text(stmt, i);
NSString* stringValue = [NSString stringWithCString:(const char*)(value) encoding:NSUTF8StringEncoding];
//赋值
[rowMDic setObject:stringValue forKey:key];
}
break;
//若需要获取更多类型的表信息,则可以添加对应的case分支
default:
break;
}
}
//for循环结束后把字典添加到数组中
[resultMArray addObject:rowMDic];
}
//while循环结束,所有的记录都已经获取完成
}else{
//说明sql语句有问题
NSLog(@"执行查询操作失败-----%d",result);
}
//释放资源
if (stmt != nil) {
sqlite3_finalize(stmt);
}
//关闭数据库
sqlite3_close(sqlite);
//返回
return resultMArray;
}
最后,在(头文件中).h中暴露相应的方法给外部调用