FMDB2

#import "DatabaseManager.h"
#import "FMDB.h"
#import <objc/runtime.h>

@interface DatabaseManager ()
{
    /**
     *  数据库对象
     */
    FMDatabase *_database;
}

@end

@implementation DatabaseManager


- (instancetype)init
{
    self = [super init];
    if (self)
    {
        NSLog(@"%@",[self databasePath]);
        
        _database = [FMDatabase databaseWithPath:[self databasePath]];
    }
    return self;
}

/**
 *  单例对象
 */
+ (instancetype)databaseManager
{
    
    static DatabaseManager *manager = nil;
    
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        manager = [[self alloc] init];
    });
    
    return manager;

}

/**
 *  返回数据库的路径
 */
- (NSString *)databasePath
{
    NSString *doucmentPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
    
    return [doucmentPath stringByAppendingPathComponent:@"data.db"];
}

/**
 *  判断指定表是否存在
 */
- (BOOL)isExistTableInDatabaseWithTableName:(NSString *)tablename
{
    //sqlite_master是系统表
    NSString *sql = @"select name from sqlite_master where type='table' and name=?";
    //查询
    FMResultSet *results = [_database executeQuery:sql,tablename];
    
    return results.next;
    
}

/**
 *  根据模型创建表
 */
- (BOOL)createTableWithObject:(id)object
{
    //表名
    NSString *tbName = NSStringFromClass([object class]);
    
    NSMutableString *sql = [NSMutableString stringWithFormat:@"create table if not exists %@ (id integer primary key autoincrement",tbName];
    
    //获取字段名字
    NSArray *properties = [self propertiesFromClass:[object class]];
    
    for (NSString *property in properties)
    {
        [sql appendFormat:@",%@ text",property];
    }
    
    [sql appendString:@")"];
    
//    NSLog(@"%@",sql);
    
    //执行sql语句
    return [_database executeUpdate:sql];
    
}

/**
 *  插入数据
 */
- (BOOL)insertObjectToDatabaseWithObject:(id)object
{
    
    /*
     判断表是否创建,如果已经创建,直接插入数据。否则先创建表,在插入数据。
     */
    //打开
    if (![_database open])
    {
        //数据库打开失败了
        return NO;
    }
    
    //表名   表名 = model名字
    NSString *tbName = NSStringFromClass([object class]);
    
    //如果表不存在就创建
    if (![self isExistTableInDatabaseWithTableName:tbName])
    {
        //创建表
        if (![self createTableWithObject:object])
        {
            //如果表创建失败,直接返回NO
            return NO;
        }
    }
    
    //插入数据
    NSMutableString *sql = [NSMutableString stringWithFormat:@"insert into %@ (",tbName];
    
    //values (xx)
    NSMutableString *valueString = [NSMutableString stringWithString:@" values ("];
    
    //获取所有的属性
    NSArray *properties = [self propertiesFromClass:[object class]];
    
    //遍历属性
    for (int i = 0; i < properties.count; i++)
    {
        if (i == properties.count - 1)
        {
            [sql appendFormat:@"%@)",properties[i]];
            [valueString appendFormat:@"'%@')",[object valueForKey:properties[i]]];
        }
        else
        {
            [sql appendFormat:@"%@,",properties[i]];
            [valueString appendFormat:@"'%@',",[object valueForKey:properties[i]]];
        }
    }
    
    [sql appendString:valueString];
    
   // NSLog(@"%@",sql);
    
    
    BOOL isFinish = [_database executeUpdate:sql];
    
    //关闭数据
    [_database close];
    
    return isFinish;
    
}

/**
 *  查询所有的数据
 */
- (NSArray *)queryAllObjectsFromDatabaseWithClass:(Class)cls
{
    if (![_database open])
    {
        return nil;
    }
    
    //保存数据模型
    NSMutableArray *objects = [NSMutableArray array];
    
    NSString *sql = [NSString stringWithFormat:@"select * from %@",NSStringFromClass(cls)];
    
    //执行查询
    FMResultSet *results = [_database executeQuery:sql];
    
    //获取属性
    NSArray *properties = [self propertiesFromClass:cls];
    
    while (results.next)
    {
        id obj = [[cls alloc] init];
        
        //遍历所有属性通过KVC赋值
        for (NSString *property in properties)
        {
            [obj setValue:[results stringForColumn:property] forKey:property];
        }
        
        //添加到数组里面
        [objects addObject:obj];
    }
    
    //关闭数据库
    [_database close];
    
    return objects;
}

/**
 *  删除指定表的数据
 */
- (BOOL)deleteAllObjectsFromDatabaseWithClass:(Class)cls
{
    if (![_database open])
    {
        return NO;
    }
    
    NSString *sql = [NSString stringWithFormat:@"delete from %@",NSStringFromClass(cls)];
    
    //执行sql
    BOOL isOK = [_database executeUpdate:sql];
    
    [_database close];
    
    return isOK;
}

/**
 *  返回指定类的所有属性
 */
- (NSArray *)propertiesFromClass:(Class)cls
{
    //保存所有的属性名字
    NSMutableArray *array = [NSMutableArray array];
    
    //属性个数
    unsigned int outCount;
    //获取所有的属性    copy,retain,create都需要手动释放
    objc_property_t *properties = class_copyPropertyList(cls, &outCount);
    
    
    for (int i = 0; i < outCount; i++)
    {
        //每个属性的结构体
        objc_property_t property = properties[i];
        //获取属性名字
        const char *name = property_getName(property);
        
        [array addObject:[NSString stringWithUTF8String:name]];
    }
    
    //释放资源
    free(properties);
    
    return array;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值