fmdb数据库封装
2017-08-04 17:47
99 查看
//
// FMDBTool.h
// SeeTime
//
// Created by aojinrui on 2017/8/3.
// Copyright © 2017年 aojinrui. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <FMDB.h>
#import <FMDatabaseQueue.h>
@interface FMDBTool : NSObject
+(FMDatabaseQueue *)shareFMdataBase;
@end
//
// FMDBTool.m
// SeeTime
//
// Created by aojinrui on 2017/8/3.
// Copyright © 2017年 aojinrui. All rights reserved.
//
#import "FMDBTool.h"
static FMDatabaseQueue *db =
nil;
@implementation FMDBTool
/**
*创建数据库操作对象
*/
+(FMDatabaseQueue *)shareFMdataBase
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
db = [FMDatabaseQueue databaseQueueWithPath:kDBFilePath];
});
return db;
}
@end
//
// FMDBManager.h
// SeeTime
//
// Created by aojinrui on 2017/8/3.
// Copyright © 2017年 aojinrui. All rights reserved.
//
#import "FMDBTool.h"
@interface FMDBManager : FMDBTool
+(void)setFMDBVersion:(uint32_t)aVersion;
+(uint32_t)getFMDBVersion;
+(BOOL)creatTable:(id)tbObj;
+(BOOL)insertTable:(id)tbObj;
+(id)selectWithTable:(id)tbObj withWhere:(NSString*)condition;
+(BOOL)updaTable:(id)tbObj withWhere:(NSString*)condition;
+(BOOL)deleteTable:(id)tbObj withWhere:(NSString*)condition;
@end
//
// FMDBManager.m
// SeeTime
//
// Created by aojinrui on 2017/8/3.
// Copyright © 2017年 aojinrui. All rights reserved.
//
#import "FMDBManager.h"
#import <objc/runtime.h>
@implementation FMDBManager
+(void)setFMDBVersion:(uint32_t)aVersion
{
[[self shareFMdataBase] inDatabase:^(FMDatabase *db) {
[db setUserVersion:aVersion];
}];
}
+(uint32_t)getFMDBVersion
{
__block uint32_t fmversion =
0;
[[self shareFMdataBase] inDatabase:^(FMDatabase *db) {
fmversion = [db userVersion];
}];
return fmversion;
}
+(BOOL)creatTable:(id)tbObj
{
if (!tbObj) {
return
NO;
}
__block
BOOL isSuccess =
NO;
NSString *tbName = NSStringFromClass([tbObj class]);
//数据库名字
NSString *tableName =[NSString stringWithFormat:@"%@",tbName];
//创建语句
NSString *msgSql = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@(Id integer NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE)",tableName];
[[self shareFMdataBase] inDatabase:^(FMDatabase *db) {
isSuccess = [db executeUpdate:msgSql];
///存储属性的个数
unsigned
int propertyCount =
0;
///通过运行时获取当前类的属性
objc_property_t *propertys = class_copyPropertyList([tbObj class], &propertyCount);
//把属性放到数组中
for (int i =
0; i < propertyCount; i ++) {
///取出第一个属性
objc_property_t property = propertys[i];
NSString *propertyName = [NSString stringWithCString:property_getName(property) encoding:NSUTF8StringEncoding];
if (![db columnExists:propertyName inTableWithName:tbName]) {
NSString *propertyAttr = [NSString stringWithCString:property_getAttributes(property) encoding:NSUTF8StringEncoding];
NSArray * attributes = [propertyAttr componentsSeparatedByString:@","];
NSString * typeAttribute = attributes[0];
if ([self comparAttri:typeAttribute]) {
NSString * attrstr =[self getAttributesWith:typeAttribute];
[db executeUpdate:[NSString stringWithFormat:@"ALTER TABLE %@ ADD COLUMN %@ %@",tbName,propertyName,attrstr]];
}
}
}
free(propertys);
}];
return isSuccess;
}
+(BOOL)insertTable:(id)tbObj
{
if (!tbObj) {
return
NO;
}
NSString *tbName = NSStringFromClass([tbObj class]);
//数据库名字
NSString *tableName =[NSString stringWithFormat:@"%@",tbName];
__block
BOOL isok;
if ([self creatTable:tbObj]) {
[[self shareFMdataBase] inDatabase:^(FMDatabase *db) {
NSString * sql = [NSString stringWithFormat:@"INSERT INTO %@",tableName];
sql = [sql stringByAppendingString:@"("];
///存储属性的个数
unsigned
int propertyCount =
0;
///通过运行时获取当前类的属性
objc_property_t *propertys = class_copyPropertyList([tbObj class], &propertyCount);
//属性名数组
NSMutableArray *nameArr = [NSMutableArray array];
//属性值数组
NSMutableArray *attriArr = [NSMutableArray array];
//把属性放到数组中
for (int i =
0; i < propertyCount; i ++) {
///取出第一个属性
objc_property_t property = propertys[i];
NSString *propertyName = [NSString stringWithCString:property_getName(property) encoding:NSUTF8StringEncoding];
NSString *propertyAttr = [NSString stringWithCString:property_getAttributes(property) encoding:NSUTF8StringEncoding];
NSLog(@"%@",propertyAttr);
NSArray * attributes = [propertyAttr componentsSeparatedByString:@","];
NSString * typeattri = attributes[0];
if ([self comparAttri:typeattri]) {
[nameArr addObject:propertyName];
if ([typeattri isEqualToString:@"T@\"NSArray\""]||[typeattri isEqualToString:@"T@\"NSMutableArray\""]){
id attriValue = [tbObj valueForKey:propertyName];
[attriArr addObject:[NSKeyedArchiver archivedDataWithRootObject:attriValue]];
}else
if ([typeattri isEqualToString:@"T@\"NSDictionary\""]||[typeattri isEqualToString:@"T@\"NSMutableDictionary\""]){
id attriValue = [tbObj valueForKey:propertyName];
[attriArr addObject:[NSKeyedArchiver archivedDataWithRootObject:attriValue]];
}else{
id attriValue = [tbObj valueForKey:propertyName];
[attriArr addObject:attriValue];
}
}
}
NSString *vaStr =@"";
for (int i=0; i<nameArr.count; i++) {
NSString *propertyName = nameArr[i];
if (i==0) {
sql = [sql stringByAppendingString:propertyName];
vaStr = [vaStr stringByAppendingString:@"(?"];
}else
if (i==nameArr.count-1){
sql = [sql stringByAppendingFormat:@",%@) VALUES ",propertyName];
vaStr = [vaStr stringByAppendingString:@",?)"];
sql = [sql stringByAppendingString:vaStr];
}else{
sql = [sql stringByAppendingFormat:@",%@",propertyName];
vaStr = [vaStr stringByAppendingString:@",?"];
}
}
isok = [db executeUpdate:sql withArgumentsInArray:attriArr];
free(propertys);
}];
return isok;
}
return
NO;
}
+(id)selectWithTable:(id)tbObj withWhere:(NSString*)condition
{
if (!tbObj) {
return
nil;
}
NSString *tbName = NSStringFromClass([tbObj class]);
//数据库名字
NSString *tableName =[NSString stringWithFormat:@"%@",tbName];
if ([self creatTable:tbObj]) {
NSString *sql = @"";
if (condition) {
sql = [NSString stringWithFormat:@"SELECT * FROM %@ WHERE %@",tableName,condition];
}else{
sql = [NSString stringWithFormat:@"SELECT * FROM %@",tableName];
}
NSMutableArray *arr = [[NSMutableArray alloc]init];
[[self shareFMdataBase] inDatabase:^(FMDatabase *db) {
FMResultSet *set = [db executeQuery:sql];
///存储属性的个数
unsigned
int propertyCount =
0;
///通过运行时获取当前类的属性
objc_property_t *propertys = class_copyPropertyList([tbObj class], &propertyCount);
while ([set next]) {
id model = [[NSClassFromString(tbName) alloc] init];
//把属性放到数组中
for (int i =
0; i < propertyCount; i ++) {
///取出属性
objc_property_t property = propertys[i];
NSString *propertyName = [NSString stringWithCString:property_getName(property) encoding:NSUTF8StringEncoding];
NSString *propertyAttr = [NSString stringWithCString:property_getAttributes(property) encoding:NSUTF8StringEncoding];
NSArray * attributes = [propertyAttr componentsSeparatedByString:@","];
NSString * typeattri = attributes[0];
if ([self comparAttri:typeattri]) {
if ([typeattri isEqualToString:@"T@\"NSData\""]){
[model setValue:[set dataForColumn:propertyName] forKey:propertyName];
}else
if ([typeattri isEqualToString:@"T@\"NSArray\""]||[typeattri isEqualToString:@"T@\"NSMutableArray\""]){
NSArray *tArr = [NSKeyedUnarchiver unarchiveObjectWithData:[set dataForColumn:propertyName]];
[model setValue:tArr forKey:propertyName];
}else
if ([typeattri isEqualToString:@"T@\"NSDictionary\""]||[typeattri isEqualToString:@"T@\"NSMutableDictionary\""]){
NSDictionary *tDic = [NSKeyedUnarchiver unarchiveObjectWithData:[set dataForColumn:propertyName]];
[model setValue:tDic forKey:propertyName];
}else{
[model setValue:[set objectForColumnName:propertyName] forKey:propertyName];
}
}
}
[arr addObject:model];
}
free(propertys);
[set close];
}];
return arr;
}
return
nil;
}
+(BOOL)updaTable:(id)tbObj withWhere:(NSString*)condition
{
if (!tbObj) {
return
nil;
}
NSString *tbName = NSStringFromClass([tbObj class]);
//数据库名字
NSString *tableName =[NSString stringWithFormat:@"%@",tbName];
if ([self creatTable:tbObj]) {
__block
BOOL isSuccess;
[[self shareFMdataBase] inDatabase:^(FMDatabase *db) {
NSString * sql = [NSString stringWithFormat:@"UPDATE %@ set ",tableName];
///存储属性的个数
unsigned
int propertyCount =
0;
///通过运行时获取当前类的属性
objc_property_t *propertys = class_copyPropertyList([tbObj class], &propertyCount);
//属性名数组
NSMutableArray *nameArr = [NSMutableArray array];
//属性值数组
NSMutableArray *attriArr = [NSMutableArray array];
//把属性放到数组中
for (int i =
0; i < propertyCount; i ++) {
///取出第一个属性
objc_property_t property = propertys[i];
NSString *propertyName = [NSString stringWithCString:property_getName(property) encoding:NSUTF8StringEncoding];
NSString *propertyAttr = [NSString stringWithCString:property_getAttributes(property) encoding:NSUTF8StringEncoding];
NSArray * attributes = [propertyAttr componentsSeparatedByString:@","];
NSString * typeattri = attributes[0];
if ([self comparAttri:typeattri]) {
[nameArr addObject:propertyName];
if ([typeattri isEqualToString:@"T@\"NSArray\""]||[typeattri isEqualToString:@"T@\"NSMutableArray\""]){
id attriValue = [tbObj valueForKey:propertyName];
[attriArr addObject:[NSKeyedArchiver archivedDataWithRootObject:attriValue]];
}else
if ([typeattri isEqualToString:@"T@\"NSDictionary\""]||[typeattri isEqualToString:@"T@\"NSMutableDictionary\""]){
id attriValue = [tbObj valueForKey:propertyName];
[attriArr addObject:[NSKeyedArchiver archivedDataWithRootObject:attriValue]];
}else{
id attriValue = [tbObj valueForKey:propertyName];
[attriArr addObject:attriValue];
}
}
}
for (int i=0; i<nameArr.count; i++) {
NSString *propertyName = nameArr[i];
if (i==nameArr.count-1) {
if (condition) {
sql = [sql stringByAppendingFormat:@"%@=? WHERE %@",propertyName,condition];
}else{
sql = [sql stringByAppendingFormat:@"%@=?",propertyName];
}
break;
}else{
sql = [sql stringByAppendingFormat:@"%@=?,",propertyName];
}
}
isSuccess = [db executeUpdate:sql withArgumentsInArray:attriArr];
free(propertys);
}];
return isSuccess;
}
return
NO;
}
+(BOOL)deleteTable:(id)tbObj withWhere:(NSString*)condition
{
if (!tbObj) {
return
NO;
}
NSString *tbName = NSStringFromClass([tbObj class]);
//数据库名字
NSString *tableName =[NSString stringWithFormat:@"%@",tbName];
NSString *sql = @"";
if (condition) {
sql = [NSString stringWithFormat:@"DELETE FROM %@ WHERE %@",tableName,condition];
}else{
sql = [NSString stringWithFormat:@"DELETE FROM %@",tableName];
}
__block
BOOL isSuccess;
[[self shareFMdataBase] inDatabase:^(FMDatabase *db) {
isSuccess = [db executeUpdate:sql];
}];
return isSuccess;
}
+(NSString*)getAttributesWith:(NSString*)typeattri{
/*
NULL 值是一个 NULL
值。
INTEGER
值是一个带符号的整数,根据值的大小存储在 1、2、3、4、6
或 8
字节中。
REAL
值是一个浮点值,存储为 8
字节的 IEEE
浮点数字。
TEXT 值是一个文本字符串,使用数据库编码(UTF-8、UTF-16BE
或 UTF-16LE)存储。
BLOB
值是一个 blob
数据,完全根据它的输入存储。
*/
//==a1==Ti,N,V_a1
//==b1==Tq,N,V_b1
//==c1==Tf,N,V_c1
//==d1==Td,N,V_d1
//==e1==TB,N,V_e1
//==f1==T@"NSString",C,N,V_f1
//==arr==T@"NSArray",&,N,V_arr
//==marr==T@"NSMutableArray",&,N,V_marr
//==dic==T@"NSDictionary",&,N,V_dic
//==mdic==T@"NSMutableDictionary",&,N,V_mdic
//==data==T@"NSData",&,N,V_data
NSString *str = @"TEXT";
if ([typeattri isEqualToString:@"Ti"]||[typeattri isEqualToString:@"Tq"]||[typeattri
isEqualToString:@"TB"]||[typeattri isEqualToString:@"TI"]||[typeattri isEqualToString:@"TQ"])
{
return str =
@"INTEGER";
}else
if ([typeattri isEqualToString:@"Tf"]||[typeattri isEqualToString:@"Td"]){
return str =
@"REAL";
}else
if ([typeattri isEqualToString:@"T@\"NSString\""]){
return str =
@"TEXT";
}else
if ([typeattri isEqualToString:@"T@\"NSData\""]){
return str =
@"BLOB";
}else
if ([typeattri isEqualToString:@"T@\"NSArray\""]||[typeattri isEqualToString:@"T@\"NSMutableArray\""]){
return str =
@"BLOB";
}else
if ([typeattri isEqualToString:@"T@\"NSDictionary\""]||[typeattri isEqualToString:@"T@\"NSMutableDictionary\""]){
return str =
@"BLOB";
}
return str;
}
+(BOOL)comparAttri:(NSString*)typeattri
{
if ([typeattri isEqualToString:@"Ti"]||[typeattri isEqualToString:@"Tq"]||[typeattri
isEqualToString:@"TB"]||[typeattri isEqualToString:@"TI"]||[typeattri isEqualToString:@"TQ"])
{
return
YES;
}else
if ([typeattri isEqualToString:@"Tf"]||[typeattri isEqualToString:@"Td"]){
return
YES;
}else
if ([typeattri isEqualToString:@"T@\"NSString\""]){
return
YES;
}else
if ([typeattri isEqualToString:@"T@\"NSData\""]){
return
YES;
}else
if ([typeattri isEqualToString:@"T@\"NSArray\""]||[typeattri isEqualToString:@"T@\"NSMutableArray\""]){
return
YES;
}else
if ([typeattri isEqualToString:@"T@\"NSDictionary\""]||[typeattri isEqualToString:@"T@\"NSMutableDictionary\""]){
return
YES;
}
return
NO;
}
@end
// FMDBTool.h
// SeeTime
//
// Created by aojinrui on 2017/8/3.
// Copyright © 2017年 aojinrui. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <FMDB.h>
#import <FMDatabaseQueue.h>
@interface FMDBTool : NSObject
+(FMDatabaseQueue *)shareFMdataBase;
@end
//
// FMDBTool.m
// SeeTime
//
// Created by aojinrui on 2017/8/3.
// Copyright © 2017年 aojinrui. All rights reserved.
//
#import "FMDBTool.h"
static FMDatabaseQueue *db =
nil;
@implementation FMDBTool
/**
*创建数据库操作对象
*/
+(FMDatabaseQueue *)shareFMdataBase
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
db = [FMDatabaseQueue databaseQueueWithPath:kDBFilePath];
});
return db;
}
@end
//
// FMDBManager.h
// SeeTime
//
// Created by aojinrui on 2017/8/3.
// Copyright © 2017年 aojinrui. All rights reserved.
//
#import "FMDBTool.h"
@interface FMDBManager : FMDBTool
+(void)setFMDBVersion:(uint32_t)aVersion;
+(uint32_t)getFMDBVersion;
+(BOOL)creatTable:(id)tbObj;
+(BOOL)insertTable:(id)tbObj;
+(id)selectWithTable:(id)tbObj withWhere:(NSString*)condition;
+(BOOL)updaTable:(id)tbObj withWhere:(NSString*)condition;
+(BOOL)deleteTable:(id)tbObj withWhere:(NSString*)condition;
@end
//
// FMDBManager.m
// SeeTime
//
// Created by aojinrui on 2017/8/3.
// Copyright © 2017年 aojinrui. All rights reserved.
//
#import "FMDBManager.h"
#import <objc/runtime.h>
@implementation FMDBManager
+(void)setFMDBVersion:(uint32_t)aVersion
{
[[self shareFMdataBase] inDatabase:^(FMDatabase *db) {
[db setUserVersion:aVersion];
}];
}
+(uint32_t)getFMDBVersion
{
__block uint32_t fmversion =
0;
[[self shareFMdataBase] inDatabase:^(FMDatabase *db) {
fmversion = [db userVersion];
}];
return fmversion;
}
+(BOOL)creatTable:(id)tbObj
{
if (!tbObj) {
return
NO;
}
__block
BOOL isSuccess =
NO;
NSString *tbName = NSStringFromClass([tbObj class]);
//数据库名字
NSString *tableName =[NSString stringWithFormat:@"%@",tbName];
//创建语句
NSString *msgSql = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@(Id integer NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE)",tableName];
[[self shareFMdataBase] inDatabase:^(FMDatabase *db) {
isSuccess = [db executeUpdate:msgSql];
///存储属性的个数
unsigned
int propertyCount =
0;
///通过运行时获取当前类的属性
objc_property_t *propertys = class_copyPropertyList([tbObj class], &propertyCount);
//把属性放到数组中
for (int i =
0; i < propertyCount; i ++) {
///取出第一个属性
objc_property_t property = propertys[i];
NSString *propertyName = [NSString stringWithCString:property_getName(property) encoding:NSUTF8StringEncoding];
if (![db columnExists:propertyName inTableWithName:tbName]) {
NSString *propertyAttr = [NSString stringWithCString:property_getAttributes(property) encoding:NSUTF8StringEncoding];
NSArray * attributes = [propertyAttr componentsSeparatedByString:@","];
NSString * typeAttribute = attributes[0];
if ([self comparAttri:typeAttribute]) {
NSString * attrstr =[self getAttributesWith:typeAttribute];
[db executeUpdate:[NSString stringWithFormat:@"ALTER TABLE %@ ADD COLUMN %@ %@",tbName,propertyName,attrstr]];
}
}
}
free(propertys);
}];
return isSuccess;
}
+(BOOL)insertTable:(id)tbObj
{
if (!tbObj) {
return
NO;
}
NSString *tbName = NSStringFromClass([tbObj class]);
//数据库名字
NSString *tableName =[NSString stringWithFormat:@"%@",tbName];
__block
BOOL isok;
if ([self creatTable:tbObj]) {
[[self shareFMdataBase] inDatabase:^(FMDatabase *db) {
NSString * sql = [NSString stringWithFormat:@"INSERT INTO %@",tableName];
sql = [sql stringByAppendingString:@"("];
///存储属性的个数
unsigned
int propertyCount =
0;
///通过运行时获取当前类的属性
objc_property_t *propertys = class_copyPropertyList([tbObj class], &propertyCount);
//属性名数组
NSMutableArray *nameArr = [NSMutableArray array];
//属性值数组
NSMutableArray *attriArr = [NSMutableArray array];
//把属性放到数组中
for (int i =
0; i < propertyCount; i ++) {
///取出第一个属性
objc_property_t property = propertys[i];
NSString *propertyName = [NSString stringWithCString:property_getName(property) encoding:NSUTF8StringEncoding];
NSString *propertyAttr = [NSString stringWithCString:property_getAttributes(property) encoding:NSUTF8StringEncoding];
NSLog(@"%@",propertyAttr);
NSArray * attributes = [propertyAttr componentsSeparatedByString:@","];
NSString * typeattri = attributes[0];
if ([self comparAttri:typeattri]) {
[nameArr addObject:propertyName];
if ([typeattri isEqualToString:@"T@\"NSArray\""]||[typeattri isEqualToString:@"T@\"NSMutableArray\""]){
id attriValue = [tbObj valueForKey:propertyName];
[attriArr addObject:[NSKeyedArchiver archivedDataWithRootObject:attriValue]];
}else
if ([typeattri isEqualToString:@"T@\"NSDictionary\""]||[typeattri isEqualToString:@"T@\"NSMutableDictionary\""]){
id attriValue = [tbObj valueForKey:propertyName];
[attriArr addObject:[NSKeyedArchiver archivedDataWithRootObject:attriValue]];
}else{
id attriValue = [tbObj valueForKey:propertyName];
[attriArr addObject:attriValue];
}
}
}
NSString *vaStr =@"";
for (int i=0; i<nameArr.count; i++) {
NSString *propertyName = nameArr[i];
if (i==0) {
sql = [sql stringByAppendingString:propertyName];
vaStr = [vaStr stringByAppendingString:@"(?"];
}else
if (i==nameArr.count-1){
sql = [sql stringByAppendingFormat:@",%@) VALUES ",propertyName];
vaStr = [vaStr stringByAppendingString:@",?)"];
sql = [sql stringByAppendingString:vaStr];
}else{
sql = [sql stringByAppendingFormat:@",%@",propertyName];
vaStr = [vaStr stringByAppendingString:@",?"];
}
}
isok = [db executeUpdate:sql withArgumentsInArray:attriArr];
free(propertys);
}];
return isok;
}
return
NO;
}
+(id)selectWithTable:(id)tbObj withWhere:(NSString*)condition
{
if (!tbObj) {
return
nil;
}
NSString *tbName = NSStringFromClass([tbObj class]);
//数据库名字
NSString *tableName =[NSString stringWithFormat:@"%@",tbName];
if ([self creatTable:tbObj]) {
NSString *sql = @"";
if (condition) {
sql = [NSString stringWithFormat:@"SELECT * FROM %@ WHERE %@",tableName,condition];
}else{
sql = [NSString stringWithFormat:@"SELECT * FROM %@",tableName];
}
NSMutableArray *arr = [[NSMutableArray alloc]init];
[[self shareFMdataBase] inDatabase:^(FMDatabase *db) {
FMResultSet *set = [db executeQuery:sql];
///存储属性的个数
unsigned
int propertyCount =
0;
///通过运行时获取当前类的属性
objc_property_t *propertys = class_copyPropertyList([tbObj class], &propertyCount);
while ([set next]) {
id model = [[NSClassFromString(tbName) alloc] init];
//把属性放到数组中
for (int i =
0; i < propertyCount; i ++) {
///取出属性
objc_property_t property = propertys[i];
NSString *propertyName = [NSString stringWithCString:property_getName(property) encoding:NSUTF8StringEncoding];
NSString *propertyAttr = [NSString stringWithCString:property_getAttributes(property) encoding:NSUTF8StringEncoding];
NSArray * attributes = [propertyAttr componentsSeparatedByString:@","];
NSString * typeattri = attributes[0];
if ([self comparAttri:typeattri]) {
if ([typeattri isEqualToString:@"T@\"NSData\""]){
[model setValue:[set dataForColumn:propertyName] forKey:propertyName];
}else
if ([typeattri isEqualToString:@"T@\"NSArray\""]||[typeattri isEqualToString:@"T@\"NSMutableArray\""]){
NSArray *tArr = [NSKeyedUnarchiver unarchiveObjectWithData:[set dataForColumn:propertyName]];
[model setValue:tArr forKey:propertyName];
}else
if ([typeattri isEqualToString:@"T@\"NSDictionary\""]||[typeattri isEqualToString:@"T@\"NSMutableDictionary\""]){
NSDictionary *tDic = [NSKeyedUnarchiver unarchiveObjectWithData:[set dataForColumn:propertyName]];
[model setValue:tDic forKey:propertyName];
}else{
[model setValue:[set objectForColumnName:propertyName] forKey:propertyName];
}
}
}
[arr addObject:model];
}
free(propertys);
[set close];
}];
return arr;
}
return
nil;
}
+(BOOL)updaTable:(id)tbObj withWhere:(NSString*)condition
{
if (!tbObj) {
return
nil;
}
NSString *tbName = NSStringFromClass([tbObj class]);
//数据库名字
NSString *tableName =[NSString stringWithFormat:@"%@",tbName];
if ([self creatTable:tbObj]) {
__block
BOOL isSuccess;
[[self shareFMdataBase] inDatabase:^(FMDatabase *db) {
NSString * sql = [NSString stringWithFormat:@"UPDATE %@ set ",tableName];
///存储属性的个数
unsigned
int propertyCount =
0;
///通过运行时获取当前类的属性
objc_property_t *propertys = class_copyPropertyList([tbObj class], &propertyCount);
//属性名数组
NSMutableArray *nameArr = [NSMutableArray array];
//属性值数组
NSMutableArray *attriArr = [NSMutableArray array];
//把属性放到数组中
for (int i =
0; i < propertyCount; i ++) {
///取出第一个属性
objc_property_t property = propertys[i];
NSString *propertyName = [NSString stringWithCString:property_getName(property) encoding:NSUTF8StringEncoding];
NSString *propertyAttr = [NSString stringWithCString:property_getAttributes(property) encoding:NSUTF8StringEncoding];
NSArray * attributes = [propertyAttr componentsSeparatedByString:@","];
NSString * typeattri = attributes[0];
if ([self comparAttri:typeattri]) {
[nameArr addObject:propertyName];
if ([typeattri isEqualToString:@"T@\"NSArray\""]||[typeattri isEqualToString:@"T@\"NSMutableArray\""]){
id attriValue = [tbObj valueForKey:propertyName];
[attriArr addObject:[NSKeyedArchiver archivedDataWithRootObject:attriValue]];
}else
if ([typeattri isEqualToString:@"T@\"NSDictionary\""]||[typeattri isEqualToString:@"T@\"NSMutableDictionary\""]){
id attriValue = [tbObj valueForKey:propertyName];
[attriArr addObject:[NSKeyedArchiver archivedDataWithRootObject:attriValue]];
}else{
id attriValue = [tbObj valueForKey:propertyName];
[attriArr addObject:attriValue];
}
}
}
for (int i=0; i<nameArr.count; i++) {
NSString *propertyName = nameArr[i];
if (i==nameArr.count-1) {
if (condition) {
sql = [sql stringByAppendingFormat:@"%@=? WHERE %@",propertyName,condition];
}else{
sql = [sql stringByAppendingFormat:@"%@=?",propertyName];
}
break;
}else{
sql = [sql stringByAppendingFormat:@"%@=?,",propertyName];
}
}
isSuccess = [db executeUpdate:sql withArgumentsInArray:attriArr];
free(propertys);
}];
return isSuccess;
}
return
NO;
}
+(BOOL)deleteTable:(id)tbObj withWhere:(NSString*)condition
{
if (!tbObj) {
return
NO;
}
NSString *tbName = NSStringFromClass([tbObj class]);
//数据库名字
NSString *tableName =[NSString stringWithFormat:@"%@",tbName];
NSString *sql = @"";
if (condition) {
sql = [NSString stringWithFormat:@"DELETE FROM %@ WHERE %@",tableName,condition];
}else{
sql = [NSString stringWithFormat:@"DELETE FROM %@",tableName];
}
__block
BOOL isSuccess;
[[self shareFMdataBase] inDatabase:^(FMDatabase *db) {
isSuccess = [db executeUpdate:sql];
}];
return isSuccess;
}
+(NSString*)getAttributesWith:(NSString*)typeattri{
/*
NULL 值是一个 NULL
值。
INTEGER
值是一个带符号的整数,根据值的大小存储在 1、2、3、4、6
或 8
字节中。
REAL
值是一个浮点值,存储为 8
字节的 IEEE
浮点数字。
TEXT 值是一个文本字符串,使用数据库编码(UTF-8、UTF-16BE
或 UTF-16LE)存储。
BLOB
值是一个 blob
数据,完全根据它的输入存储。
*/
//==a1==Ti,N,V_a1
//==b1==Tq,N,V_b1
//==c1==Tf,N,V_c1
//==d1==Td,N,V_d1
//==e1==TB,N,V_e1
//==f1==T@"NSString",C,N,V_f1
//==arr==T@"NSArray",&,N,V_arr
//==marr==T@"NSMutableArray",&,N,V_marr
//==dic==T@"NSDictionary",&,N,V_dic
//==mdic==T@"NSMutableDictionary",&,N,V_mdic
//==data==T@"NSData",&,N,V_data
NSString *str = @"TEXT";
if ([typeattri isEqualToString:@"Ti"]||[typeattri isEqualToString:@"Tq"]||[typeattri
isEqualToString:@"TB"]||[typeattri isEqualToString:@"TI"]||[typeattri isEqualToString:@"TQ"])
{
return str =
@"INTEGER";
}else
if ([typeattri isEqualToString:@"Tf"]||[typeattri isEqualToString:@"Td"]){
return str =
@"REAL";
}else
if ([typeattri isEqualToString:@"T@\"NSString\""]){
return str =
@"TEXT";
}else
if ([typeattri isEqualToString:@"T@\"NSData\""]){
return str =
@"BLOB";
}else
if ([typeattri isEqualToString:@"T@\"NSArray\""]||[typeattri isEqualToString:@"T@\"NSMutableArray\""]){
return str =
@"BLOB";
}else
if ([typeattri isEqualToString:@"T@\"NSDictionary\""]||[typeattri isEqualToString:@"T@\"NSMutableDictionary\""]){
return str =
@"BLOB";
}
return str;
}
+(BOOL)comparAttri:(NSString*)typeattri
{
if ([typeattri isEqualToString:@"Ti"]||[typeattri isEqualToString:@"Tq"]||[typeattri
isEqualToString:@"TB"]||[typeattri isEqualToString:@"TI"]||[typeattri isEqualToString:@"TQ"])
{
return
YES;
}else
if ([typeattri isEqualToString:@"Tf"]||[typeattri isEqualToString:@"Td"]){
return
YES;
}else
if ([typeattri isEqualToString:@"T@\"NSString\""]){
return
YES;
}else
if ([typeattri isEqualToString:@"T@\"NSData\""]){
return
YES;
}else
if ([typeattri isEqualToString:@"T@\"NSArray\""]||[typeattri isEqualToString:@"T@\"NSMutableArray\""]){
return
YES;
}else
if ([typeattri isEqualToString:@"T@\"NSDictionary\""]||[typeattri isEqualToString:@"T@\"NSMutableDictionary\""]){
return
YES;
}
return
NO;
}
@end
相关文章推荐
- IOS使用FMDB封装的数据库增删改查操作
- iOS:LKDBHelper实体对象映射数据库-第三方框架(在FMDB的基础上进行二次封装)
- QF——iOS中的数据库操作:SQLite数据库,第三方封装库FMDB,CoreData
- IOS-20-数据库操作之(SQLite第三方封装库FMDB)的基础入门使用及demo源码
- 源码推荐(4.8):QQ左侧菜单栏拖动手势,FMDB数据库的使用演示和封装工具类
- 自定义封装简单的基于FMDB以及数据model的数据库操作
- IOS开发-封装数据库sqlite3之为何选择FMDB
- 技术共享之数据库框架GreenDao的使用以及二次封装
- 使用XML封装数据库操作语句的实现
- iOS数据库离线缓存思路和网络层封装
- 2016/3/27 ①连接数据库方法的封装 ②连接数据库 制表 网页查询 奥迪
- 连接数据库将JDBC封装成一个工具类
- Android学习笔记之封装数据库工具类
- 封装了ORACLE函数的数据库操作类
- PHP封装的数据库保存session功能类
- FMDB性能优化问题。使用FMDB事务批量更新数据库速度问题。(亲测可以呀---740条数据用和不用事务效率差别20倍+)
- C#菜鸟版SQL Server 类封装(C#数据库增删改查)
- iOS之第三方FMDB框架操作数据库
- vickate_iOS_FMDB 对数据库的增删改查