最近,不知道为什么,突然想写点数据库的知识。心想数据库很简单,不就是导入那几个包再加上依赖库就可。谁知Xcode 更新后还真的不好弄。我这一些快一天了。遇到了更重问题 ,并对添加一些不常用的功能。下面我们就开始。进入 蓝天岁月:
1、 一些网站上下载FMDB第三方库,很多不给出地址了。下载后将fmbb 文件拖拽到你的工程里面。注意:看下文件是否为黄色。黄色为正确状态。不是就回出现,文件路径问题。
解决:再拖入时弹出的对话框,里面勾选
这三个,就可以
2、添加第三方库后,就是要添加 FMDB 唯一的依赖库 libsqlite3.dylib ,问题来了,怎么Xcode 找不到了呢。但是 又出现了个 libsqlite3.tbd 妈的就是它了。高兴地一运行,MDMD 有错误,为什么呢??? 以前不是导入就OK 了吗?? 查了更新 问题 解决方法是: Other Linker Flag 添加 -lz 和 -libsqlite3 。运行 OK。
3、写一个全局的单利,全工程提供,整个步骤 如下:
//创建一个单利 目的:全工程提供
+(ZSJ_FmdbShare*)fmdbShare_zsj;
实现单利:
/*****************************************************************/
//创建一个单利
+(ZSJ_FmdbShare*)fmdbShare_zsj{
static ZSJ_FmdbShare * ShareManager =nil;
if (ShareManager == nil) {
ShareManager= [[[self class] alloc]init];
}
return ShareManager;
}
//实现单利要实现下面的几个方法 都是保证对象是一个地址
-(id)init{
if ([superinit]) {
//这里写初始化的处理事件
// 进行数据库的创建
[self createFmdb];
}
return self;
}
/*****************************************************************/
4、创建一个表格 table
/*****************************************************************/
-(void)createFmdb{
//创建数据库对象在路径下
RootDataBase_Zsj = [[FMDatabasealloc]initWithPath:[selfgetPathOfFmdb]];
//判断数据库是否打开
if ([selfisOpen]) {
//创建数据表
NSString * Sql_Sentence =@"create table if not exists t_Phone("
"name text,"
"phonenumber text,"
"consumerid long,"
"isshow bit,"
"indexf long"
")";
/*
创建时,写参数是不要和 关键字同名 ,否则将创建失败
"index_t long," 这样写是能创建成功的、
"index long," 这样写是创建失败的
*/
BOOL succed = [RootDataBase_ZsjexecuteUpdate:Sql_Sentence];
if (succed) {
NSLog(@"创建成功");
[self isClose];
}else{
NSLog(@"创建失败");
}
}else{
return;
}
}
/*****************************************************************/
//判断数据库 是否打开
-(BOOL)isOpen;
//判断数据库 是否关闭
-(BOOL)isClose;
/*****************************************************************/
-(BOOL)isOpen{
returnRootDataBase_Zsj.open;
}
/*****************************************************************/
-(BOOL)isClose{
returnRootDataBase_Zsj.close;
}
/*****************************************************************/
/*****************************************************************/
-(NSString*)getPathOfFmdb{
//获取路径数组
NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString *documents = [paths objectAtIndex:0];
//进行路径的拼接
NSLog(@"%@",[documentsstringByAppendingPathComponent:DBNAME]);
return [documentsstringByAppendingPathComponent:DBNAME];
}
这里会有一个大的问题,现在写的是对的
/*****************************************************************/
/*****************************************************************/
//存入数据
//对从传来的数据要进行处理,转化为Nsnumber对象
-(void)saveDate:(id)wantonlyObjiect{
if ([selfisOpen]) {
NSString * Sql_Sentence=@" insert into t_Phone (name,phonenumber,consumerid,isshow,indexf) values ( ?,?,?,?,?)";
BOOL Insert = [RootDataBase_ZsjexecuteUpdate:Sql_Sentence,wantonlyObjiect[@"name"],wantonlyObjiect[@"phonenumber"],[NSNumbernumberWithLong:[wantonlyObjiect[@"consumerid"]intValue]],[NSNumbernumberWithBool:[wantonlyObjiect[@"isshow"]boolValue]],[NSNumbernumberWithLong:[wantonlyObjiect[@"indexf"]longValue]]];
if (Insert) {
NSLog(@"插入成功");
[self isClose];
}else{
NSLog(@"插入数据库失败");
}
}else{
NSLog(@"数据库处于关闭状态");
}
}
注意类型的转化;
/*****************************************************************/
/*****************************************************************/
//更新数据
//更新 indexf 为2的 将名字改为 小明
-(void)update:(NSArray*)up_array{
if ([selfisOpen]) {
NSString * Sql_Sentence = [NSStringstringWithFormat:@"update %@ set name = ? where indexf = ? ",@"t_Phone"];
BOOL isupdate = [RootDataBase_ZsjexecuteQuery:Sql_Sentence,up_array[0],[NSNumbernumberWithLong:[up_array[1]intValue]]];
if (isupdate) {
NSLog(@"更新成功");
[self isClose];
}else{
NSLog(@"更新失败");
}
}else{
NSLog(@"更新数据库,处于关闭状态");
}
}
/*****************************************************************/
/*****************************************************************/
-(NSArray*)selectdict_where:(NSArray*)wherearray{
if ([selfisOpen]) {
NSString * Sql_Sentence =@" select * from t_Phone where name = ?";
NSMutableArray *array = [[NSMutableArrayalloc] init];
FMResultSet * result_zsj = [RootDataBase_ZsjexecuteQuery:Sql_Sentence,@"程倩倩"];
while ([result_zsj next]) {
NSMutableDictionary * parm = [[NSMutableDictionaryalloc]init];
[parm setObject:[result_zsj stringForColumn:@"name"] forKey:@"name"];
[parm setObject:[result_zsj stringForColumn:@"phonenumber"] forKey:@"phonenumber"];
[parm setObject:[result_zsj stringForColumn:@"consumerid"] forKey:@"consumerid"];
[parm setObject:[result_zsj stringForColumn:@"isshow"] forKey:@"isshow"];
[parm setObject:[result_zsj stringForColumn:@"indexf"] forKey:@"indexf"];
[array addObject:parm];
}
[self isClose];
return array;
}else{
NSLog(@"查询数据库,处于关闭状态");
return nil;
}
}
/*****************************************************************/
//删除数据
-(void)deletedata:(NSArray*)deletearray{
if ([selfisOpen]) {
NSString * Sql_Sentence = [NSStringstringWithFormat:@" delete from t_Phone where %@ =?",deletearray[0]];
BOOL isdelete = [RootDataBase_ZsjexecuteUpdate:Sql_Sentence,deletearray[1]];
if (isdelete) {
NSLog(@"删除成功");
[self isClose];
}
}else{
NSLog(@"删除数据库,处于关闭状态");
}
}
/*****************************************************************/
//限制性的获取 数据的个数
-(NSArray*)getdatalimit:(NSArray*)_limit{
if ([selfisOpen]) {
NSString * Sql_Sentence = [NSStringstringWithFormat:@" select * from t_Phone limit %@,%@",_limit[0],_limit[1]];
FMResultSet * islimit = [RootDataBase_ZsjexecuteQuery:Sql_Sentence];
NSMutableArray * MTA = [NSMutableArrayarrayWithCapacity:0];
while ([islimit next]) {
NSMutableDictionary * parm = [[NSMutableDictionaryalloc]init];
[parm setObject:[islimit stringForColumn:@"name"] forKey:@"name"];
[parm setObject:[islimit stringForColumn:@"phonenumber"] forKey:@"phonenumber"];
[parm setObject:[islimit stringForColumn:@"consumerid"] forKey:@"consumerid"];
[parm setObject:[islimit stringForColumn:@"isshow"] forKey:@"isshow"];
[parm setObject:[islimit stringForColumn:@"indexf"] forKey:@"indexf"];
[MTA addObject:parm];
}
[self isClose];
return MTA;
}else{
return nil;
}
}
/*****************************************************************/
//获取数据的排序 desc 降 asc 升
-(NSArray*)getdatesequence:(NSArray*)sequenceparameter sequencetype:(NSArray*)_sequencetype{
if ([selfisOpen]) {
NSString * Sql_Sentence = [NSStringstring];
if (sequenceparameter.count>1) {
Sql_Sentence =@" select * from t_Phone order by ";
for (int i =0 ; i<sequenceparameter.count; i++) {
if (i==_sequencetype.count -1) {
Sql_Sentence = [Sql_Sentence stringByAppendingString:sequenceparameter[i]];
Sql_Sentence = [Sql_Sentence stringByAppendingString: [NSStringstringWithFormat:@"%@",_sequencetype[i]]];
}else{
Sql_Sentence = [Sql_Sentence stringByAppendingString:sequenceparameter[i]];
Sql_Sentence = [Sql_Sentence stringByAppendingString: [NSStringstringWithFormat:@"%@ ,",_sequencetype[i]]];
}
}
}else{
Sql_Sentence = [NSString stringWithFormat:@" select * from t_Phone order by %@ %@ ",sequenceparameter[0],_sequencetype[0]];
}
FMResultSet * issequence = [RootDataBase_ZsjexecuteQuery:Sql_Sentence];
NSMutableArray * MTA = [NSMutableArrayarrayWithCapacity:0];
while ([issequence next]) {
NSMutableDictionary * parm = [[NSMutableDictionaryalloc]init];
[parm setObject:[issequence stringForColumn:@"name"] forKey:@"name"];
[parm setObject:[issequence stringForColumn:@"phonenumber"] forKey:@"phonenumber"];
[parm setObject:[issequence stringForColumn:@"consumerid"] forKey:@"consumerid"];
[parm setObject:[issequence stringForColumn:@"isshow"] forKey:@"isshow"];
[parm setObject:[issequence stringForColumn:@"indexf"] forKey:@"indexf"];
[MTA addObject:parm];
}
[self isClose];
return MTA;
}else{
return nil;
}
}
/******************************************************************/
//数据库的条件查重功能
-(BOOL)preventrecur:(NSDictionary*)_preventrecur{
if ([selfisOpen]) {
NSString * Sql_Sentence =@"select * from t_Phone where indexf = ?";
FMResultSet * result = [RootDataBase_ZsjexecuteQuery:Sql_Sentence,[NSNumbernumberWithLong:[_preventrecur[@"indexf"]longValue]]];
return [result next];
}else{
return nil;
}
}
/***********************************************************/
//创建单利对象
ZSJ_FmdbShare * Fb_ZSJ = [ZSJ_FmdbSharefmdbShare_zsj];
/***********************************************************/
// 将获取的数据,插入到数据库里面 要注意:数据类型的转换
for (NSDictionary * ghin Dict) {
if (![Fb_ZSJ preventrecur:gh]) {
[Fb_ZSJ saveDate:gh];
}
}
/***********************************************************/
// 更新数据库 :index = 3 的用户,将名字改为 小明
[Fb_ZSJ update:@[@"小明",@3]];
/***********************************************************/
//删除数据库:删除 Indexf = 2的用户
[Fb_ZSJ deletedata:@[@"indexf",[NSNumbernumberWithLong:2]]];
/***********************************************************/
//查询用户信息:支持单个条件查询
[Fb_ZSJ selectdict_where:@[@"indexf",[NSNumbernumberWithLong:0]]];
NSLog(@"%@",[Fb_ZSJselectdict_where:@[@"indexf",[NSNumbernumberWithLong:0]]]);
/*打印结果:
2015-12-03 01:24:46.557 ZSJ_FMDB_SQL[3014:97158] (
{
consumerid = 0;
indexf = 12;
isshow = 1;
name = "\U7a0b\U5029\U5029";
phonenumber = 15565267907;
}
)
*/
/***********************************************************/
// 限制的获取指定个数的 数据
[Fb_ZSJ getdatalimit:@[@"1",@"3"]];
NSLog(@"%@",[Fb_ZSJgetdatalimit:@[@"1",@"3"]]);
/*打印结果
2015-12-03 09:19:36.729 ZSJ_FMDB_SQL[3684:123633] (
{
consumerid = 1;
indexf = 12;
isshow = 1;
name = "\U8d75\U6708";
phonenumber = 13643766238;
},
{
consumerid = 2;
indexf = 12;
isshow = 1;
name = "\U674e\U5a77\U5a77";
phonenumber = 13607611831;
},
{
consumerid = 3;
indexf = 12;
isshow = 1;
name = "\U59ec\U8273\U4e3d";
phonenumber = 18839271609;
}
)
*/
/***********************************************************/
// 获取数据的排序 desc 降序 asc 升序
[Fb_ZSJ getdatesequence:@[@"indexf"]sequencetype:@[@"desc"]];
NSLog(@"%@", [Fb_ZSJ getdatesequence:@[@"indexf"]sequencetype:@[@"desc"]]);
/*
打印结果
2015-12-03 10:00:42.887 ZSJ_FMDB_SQL[4169:144204] (
{
consumerid = 4;
indexf = 4;
isshow = 0;
name = "\U66f9\U4e66\U57f9";
phonenumber = 13673461626;
},
{
consumerid = 3;
indexf = 3;
isshow = 0;
name = "\U59ec\U8273\U4e3d";
phonenumber = 18839271609;
},
{
consumerid = 1;
indexf = 1;
isshow = 0;
name = "\U8d75\U6708";
phonenumber = 13643766238;
},
{
consumerid = 0;
indexf = 0;
isshow = 0;
name = "\U7a0b\U5029\U5029";
phonenumber = 15565267907;
}
)
*/