一种实体数据库读写的方法与流程

文档序号:13446469阅读:374来源:国知局
本发明涉及数据库
技术领域
:,具体说是一种实体数据库读写的方法。
背景技术
::随着数据库技术的发展,各种需求不断出现,不断督促着进一步的技术革新、升级。在程序开发中,程序员有时会遇到如下情况:在公司上班时,有时候白天的活没干完,程序员就会把工作带回家晚上加班继续做。但是,公司为程序开发配套的开发用数据库通常是实体数据库,是部署在开发支持服务器上的,所述开发支持服务器是公司局域网内部的一台服务器,服务端正常运行依赖于开发支持服务器上的开发用数据库。由于在家加班是无法接入公司局域网内部的,因此就不能连上开发支持服务器上的开发用数据库,这就导致服务端不能正常工作,程序开发时功能也就没办法调试。现有技术中,一种解决方法就是使用虚拟数据库。在公司上班时,就使用公司为程序开发配套的开发用数据库;回到家,就使用内存中的虚拟数据库模拟开发用数据库,做一些基本的功能调试,一般情况下绝对是足够了。实体数据库读取数据需要以下步骤:1、跟数据库建立连接,2、编写sql查询语句,3、执行查询语句,4、得到查询结果,5、关闭数据库。显然,在需要频繁跟数据库进行交互、需要频繁读取/存储数据的今天,访问数据库的工作量非常大,程序员繁琐的编写sql语句,不但工作量大,而且容易导致出错,有必要对此进一步进行合理的优化。技术实现要素:针对现有技术中存在的缺陷,本发明的目的在于提供一种实体数据库读写的方法,将繁琐、重复的sql语句封装,访问数据库时不用再重复编写sql语句,用一条代码即可实现对应的功能,降低了工作量,提高了开发效率,有效避免重复劳动导致的错误。为达到以上目的,本发明采取的技术方案是:一种实体数据库读写的方法,其特征在于,包括如下步骤:在数据类型解析层,将各种数据类型解析为数据库支持的对应的类型,供sql语句生成层使用,其中:通过系统运行时函数:class_copypropertylist()来获得类属性相关信息数组,通过运行时函数:property_getattributes()来获得相应属性信息,通过对比系统类型参照表来获得相应信息,所述数据库支持的对应的类型为:integer,real,text,blob,在对象数据布局层,将oc对象解析为数据库表对应的结构,通过解析出最基本的类型信息,以实现快速读取的目的,在sql语句生成层,根据数据类型解析层和对象数据布局层产生的结果,生成sql语句,在数据库操作层,根据sql语句生成层产生的sql语句,结合对象数据布局层产生的结果,操作数据库,得到查询结果。在上述技术方案的基础上,在对象数据布局层,根据用户定义,产生是否升级数据库的选项。在上述技术方案的基础上,在sql语句生成层,根据传入的对象数据布局的情况,识别是否需要升级数据库表。本发明所述的实体数据库读写的方法,将繁琐、重复的sql语句封装,访问数据库时不用再重复编写sql语句,用一条代码即可实现对应的功能,降低了工作量,提高了开发效率,有效避免重复劳动导致的错误。附图说明本发明有如下附图:图1本发明的流程框图。具体实施方式以下结合附图对本发明作进一步详细说明。如图1所示,本发明所述的实体数据库读写的方法,包括如下步骤:在数据类型解析层,将各种数据类型解析为数据库支持的对应的类型,供sql语句生成层使用,在对象数据布局层,将oc对象解析为数据库表对应的结构,所述oc对象指objective-c对象,在sql语句生成层,根据数据类型解析层和对象数据布局层产生的结果,生成sql语句,在数据库操作层,根据sql语句生成层产生的sql语句,结合对象数据布局层产生的结果,操作数据库,得到查询结果。首先需要进入数据类型解析层,解析出相应的数据类型信息:其中number数字类型又有整数类型和浮点数类型。通过系统运行时函数:class_copypropertylist()来获得类属性相关信息数组,通过运行时函数:property_getattributes()来获得相应属性信息。通过property_getattributes()函数会获得如:tq,d,n;t@”nsnumber”,&,d,n;此类的属性信息,通过对比系统类型参照表来获得相应信息。比如q在这里代表的是nsinteger类型等。这样我们可以通过下列算法来获得具体类型信息:+(sstypecode)typecodewithattributes:(constchar*)attribute{if(attribute[0]!='t')return__type_unknown;constchar*type=&attribute[1];if(type[0]=='@'&&type[1]!='""')return__type_unknown;if(type[0]=='i')return__type_number;if(type[0]=='q')return__type_integer;if(type[0]=='d')return__type_float;if(type[0]=='b')return__type_bool;chartypeclazz[128]={0};constchar*clazz=&type[2];constchar*clazzend=strchr(clazz,'"');if(clazzend&&clazz!=clazzend){unsignedintsize=(unsignedint)(clazzend-clazz);strncpy(&typeclazz[0],clazz,size);if(!strcmp((constchar*)typeclazz,"nsnumber")){return__type_number;}elseif(!strcmp((constchar*)typeclazz,"nsstring")){return__type_string;}elseif(!strcmp((constchar*)typeclazz,"nsdata")){return__type_data;}elseif(!strcmp((constchar*)typeclazz,"uiimage")){return__type_uiimage;}elseif(!strcmp((constchar*)typeclazz,“nsdate”)){return__type_date;}else{return__type_unknown;}}return__type_unknown;}由于在sqlite数据库中只有:integer,real,text,blob所以会针对oc对象类型和数据库类型做一次转换:+(nsstring*)sqltypewithtypecode:(sstypecode)typecode{nsstring*sqltype=@"text";switch(typecode){case__type_number:case__type_integer:case__type_bool:sqltype=@"integer";break;case__type_float:sqltype=@"real";break;case__type_data:case__type_uiimage:sqltype=@"blob";break;case__type_string:case__type_date:sqltype=@"text";break;default:break;}returnsqltype;}然后进入对象数据布局层,解析出最基本的类型信息,以实现快速读取的目的:nsstring*constksqlstoreselectwherekey=@"ksqlstoreselectwherekey";nsstring*constksqlstoreselectwherevalue=@"ksqlstoreselectwherevalue";nsstring*constksqlstoreselectlimit=@"ksqlstoreselectlimit";nsstring*constksqlstoreselectoffset=@"ksqlstoreselectoffset";在此处提供数据快速查询函数,快速组织字段并查询信息:-(nsarray*)selectvaluewithtable:(class)clazzwherekey:(nsstring*)wherekeywherevalue:(nsstring*)wherevaluelimit:(nsuinteger)limitoffset:(nsuinteger)offset{nsmutablestring*selectsqlstr=[nsmutablestringstringwithformat:@"select*from%@where%@='%@'",[selftablenamewithclazz:clazz],wherekey,wherevalue];if(limit){if(offset){[selectsqlstrappendformat:@"limit%luoffset%lu",(unsignedlong)limit,(unsignedlong)offset];}else{[selectsqlstrappendformat:@"limit%lu",(unsignedlong)limit];}}return[selfselectvaluewithtable:clazzselectstr:selectsqlstr];}-(nsarray*)selectvaluewithtable:(class)clazzselectstr:(nsstring*)selectstr{nsmutablearray*resultarray=[[nsmutablearrayalloc]init];if(!selectstr){selectstr=[nsstringstringwithformat:@"select*from%@",[selftablenamewithclazz:clazz]];}[_databasequeueindatabase:^(fmdatabase*db){fmresultset*rs=[dbexecutequery:selectstr];while([rsnext]){nsdictionary*dic=[rsresultdictionary];idinstanceobj=[selfcreateinstancebyclassname:[clazzdescription]];/***根据key遍历dic*/for(nsstring*keyin[dicallkeys]){idvalue=[dicvalueforkey:key];if([valueiskindofclass:[nsnumberclass]]){if(![keyisequaltostring:@"id"]){value=[nsstringstringwithformat:@"%@",value];[instanceobjsetvalue:valueforkey:key];}}else{if([valueiskindofclass:[nsstringclass]]){if([valueisequaltostring:@"(null)"]){value=@"";}}[instanceobjsetvalue:valueforkey:key];}}if(instanceobj){[resultarrayaddobject:instanceobj];}}[rsclose];}];returnresultarray;}下面是特殊快速查询函数:-(nsuinteger)rowsnumberwithtable:(class)clazzwherekey:(nsstring*)wherekeywherevalue:(nsstring*)wherevalue{__blockunsignedintresultcount=0;nsstring*selectsqlstr=[nsstringstringwithformat:@"selectcount(*)asnumrowsfrom%@",[selftablenamewithclazz:clazz]];if(wherekey&&wherevalue){selectsqlstr=[nsstringstringwithformat:@"selectcount(*)asnumrowsfrom%@where%@='%@'",[selftablenamewithclazz:clazz],wherekey,wherevalue];}[_databasequeueindatabase:^(fmdatabase*db){fmresultset*resultset=[dbexecutequery:selectsqlstr];if(resultset){if([resultsetnext]){resultcount=(unsignedint)[resultsetunsignedlonglongintforcolumn:@"numrows"];}}[dbcloseopenresultsets];}];returnresultcount;}在上述技术方案的基础上,在对象数据布局层,根据用户定义,产生是否升级数据库的选项。在上述技术方案的基础上,在sql语句生成层,根据传入的对象数据布局的情况,识别是否需要升级数据库表。本说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1