#import <Foundation/Foundation.h>
@interface QHDatabaseManager : NSObject
+ (instancetype)databaseManager;
//创建表
- (BOOL)insertIntoTableWithObject:(id)object;
//查询所有数据
- (NSArray *)queryAllUserObjectsFromDatabase;
- (NSArray *)queryAllUserObjectsFromDatabaseWithParameters:(NSDictionary *)parameters;
//更新数据
- (BOOL)updateUserObjectWithParameters:(NSDictionary *)parameters;
- (void)deleteUserObjectFromDatabaseWithName:(NSString *)name;
- (BOOL)close;
@end
#import "QHDatabaseManager.h"
#import "FMDatabase.h"
#import "User.h"
@interface QHDatabaseManager()
{
FMDatabase *_database;
}
@end
@implementation QHDatabaseManager
- (instancetype)init
{
self = [super init];
if (self) {
//1.创建数据库
if(![self createDatabaseAndOPen])
{
//创建失败
return nil;
}
[self createUserTable];
}
return self;
}
#pragma mark - 单例创建
//创建单例对象
+ (instancetype)databaseManager
{
static QHDatabaseManager *manager =nil;
@synchronized(self)
{
if(!manager)
{
manager = [[QHDatabaseManager alloc]init];
}
}
return manager;
#if 0
//如果数据库创建失败 我们不能再次创建 以为gcd dispatch_once 方法只走一次
//GCD 的方法创建
static QHDatabaseManager *manager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
manager = [[QHDatabaseManager alloc]init];
});
return manager;
#endif
}
//返回数据库路径
- (NSString *)databasePath
{
NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
return [documentPath stringByAppendingPathComponent:@"user.db"];
}
//创建数据库并打开
- (BOOL)createDatabaseAndOPen
{
//1.初始化数据库
_database = [FMDatabase databaseWithPath:[self databasePath]];
if (![_database open]) {
NSLog(@"打开失败");
return NO;
} else {
NSLog(@"打开成功");
}
//return YES;
return [_database open];
}
- (void)createUserTable
{
NSString *sql = @"create table if not exists User(id integer primary key autoincrement,name text,age integer)";
BOOL isOK = [_database executeUpdate:sql];
if (isOK) {
NSLog(@"创建表成功");
}
else
{
NSLog(@"创建表失败");
}
}
//插入数据
- (BOOL)insertIntoTableWithObject:(id)object
{
#if 0
//NSString *sql = nil;
if ([object isKindOfClass:[User class]]) {
User *user = object;
return [_database executeUpdate:[NSString stringWithFormat:@"insert into User (name,age) values('%@','%@')",user.name,@(user.age)]];
}
return NO;
#endif
NSString *sql = nil;
if ([object isKindOfClass:[User class]]) {
User *user = object;
sql = @"insert into User (name,age) values(?,?)";
return [_database executeUpdate:sql,user.name,@(user.age)];
}
return NO;
}
//查询所有数据
- (NSArray *)queryAllUserObjectsFromDatabase
{
NSString *sql = @"select * from User";
//创建个数组保存模型
NSMutableArray *mArray = [NSMutableArray array];
FMResultSet *result = [_database executeQuery:sql];
while (result.next) {
//根据字段取值
NSString *name = [result stringForColumn:@"name"];
int age = [result intForColumn:@"age"];
User *user = [[User alloc]init];
user.name = name;
user.age = age;
[mArray addObject:user];
}
return mArray;
}
//有条件查询
- (NSArray *)queryAllUserObjectsFromDatabaseWithParameters:(NSDictionary *)parameters
{
NSMutableString *string = [NSMutableString string];
//获取字典所有的key
NSArray *allKeys = parameters.allKeys;
for (int i = 0; i < parameters.count; i++) {
//key
NSString *key = allKeys[i];
if (i == parameters.count -1) {
[string appendFormat:@"%@=%@",key,parameters[key]];
}
else
{
[string appendFormat:@"%@=%@ and",key,parameters[key]];
}
}
return nil;
}
- (BOOL)updateUserObjectWithParameters:(NSDictionary *)parameters
{
return YES;
}
- (void)deleteUserObjectFromDatabaseWithName:(NSString *)name
{
NSString *sql = @"delete from User where name = ?";
[_database executeUpdate:sql,name];
}
- (BOOL)close
{
return [_database close];
}
@end