sqlite操作与封装的示例分析
小编给大家分享一下sqlite操作与封装的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
ocsqlite.h
[plain]
view plaincopy
//
//OCSqlite.m
//sqlite
//
//Createdbyfengshon12-12-3.
//Copyright(c)2012年sqlite_Lib.Allrightsreserved.
//
/*
对SQLITE的封装,主要设计是操作上的习惯。对于轻量级数据量可以。
对于在数据量就需要注意内存的开销了。
*/
#import<Foundation/Foundation.h>
#import<sqlite3.h>
enumfieldtype
{
ftInt,ftFloat,ftDouble,ftString,ftBlob,ftBool,ftDate,ftTime,ftDateTime,ftBinary
};
/*
字段类
作用:主要用于与数据库中的字段属性进行对应
字段名,字段类型,字段值,字段索引号
*/
@interfaceOCField:NSObject
{
NSString*fieldName;
idfieldValue;
enumfieldtypemtype;
intseq_column;
}
-(NSString*)toString;
-(NSInteger)toInteger;
-(NSDate*)toDate;
-(NSString*)toDateString;
-(NSString*)toTimeString;
-(NSString*)toDateTimeString;
-(NSNumber*)toNumber;
-(enumfieldtype)getFieldType;
@property(nonatomic)intseq_column;
@end
/*
数据集类
作用:
类似于数据源的集合,带游标,可访问数据源中的数据
*/
@interfaceOCDataset:NSObject
{
NSMutableArray*records;
NSIntegercursor;
}
-(void)clear;
-(NSInteger)count;
-(BOOL)next;
-(BOOL)first;
-(BOOL)move:(NSInteger)index;
-(OCField*)fieldbyname:(NSString*)fieldname;
-(OCField*)indexOffield:(NSInteger)index;
@end
/*
简单的数据定义语言操作及数据库查询的封装
未支持参数绑定,因此在处理blob上还需要扩展代码。
后续完善
*/
@interfaceOCSqlite:NSObject
{
sqlite3*db;
OCDataset*dataset;
}
-(id)init;
-(BOOL)ConnectToDB:(NSString*)dbfilepath;
-(void)DisconnectDB;
-(BOOL)startTranslation;
-(BOOL)commitTranslation;
-(BOOL)rollbackTranslation;
-(BOOL)excesql:(NSString*)ddlsql;
-(BOOL)query:(NSString*)qysql;
@property(nonatomic,readonly)OCDataset*dataset;
@end
ocsqlite.m
[plain]
view plaincopy
//
//OCSqlite.m
//sqlite
//
//Createdbyfengshon12-12-3.
//Copyright(c)2012年sqlite_Lib.Allrightsreserved.
//
#import"OCSqlite.h"
@implementationOCField
@synthesizeseq_column;
-(id)init
{
self=[superinit];
if(self){
fieldValue=NULL;
returnself;
}
returnnil;
}
-(void)setfield:(NSString*)namewithvalue:(sqlite3_value*)valuewithtype:(NSString*)tp
{
fieldName=name;
NSString*result=@"";
if([tpisEqualToString:@"integer"]||[tpisEqualToString:@"smallint"])
{
mtype=ftInt;
fieldValue=(id)sqlite3_value_int(value);
return;
}
elseif([tpisEqualToString:@"boolean"])
{
mtype=ftBool;
}
elseif([tpisEqualToString:@"float"])
{
mtype=ftFloat;
}
elseif([tpisEqualToString:@"double"]||[tpisEqualToString:@"real"])
{
mtype=ftDouble;
}
elseif([tpisEqualToString:@"text"]||[tpisEqualToString:@"varchar"])
{
mtype=ftString;
}
elseif([tpisEqualToString:@"blob"])
{
mtype=ftBlob;
return;
}
elseif([tpisEqualToString:@"date"])
{
mtype=ftDate;
}
elseif([tpisEqualToString:@"time"])
{
mtype=ftTime;
}
elseif([tpisEqualToString:@"timestamp"])
{
mtype=ftDateTime;
}
elseif([tpisEqualToString:@"binary"])
{
mtype=ftBinary;
return;
}
char*floatstr=(char*)sqlite3_value_text(value);
if(floatstr){
result=[NSStringstringWithCString:floatstrencoding:NSUTF8StringEncoding];
}
fieldValue=result;
}
-(NSString*)toString
{
return(NSString*)fieldValue;
}
-(NSInteger)toInteger
{
return(int)fieldValue;
}
-(NSNumber*)toNumber
{
switch(mtype){
caseftFloat:
return[NSNumbernumberWithFloat:[(NSString*)fieldValuefloatValue]];
break;
caseftDouble:
return[NSNumbernumberWithDouble:[(NSString*)fieldValuedoubleValue]];
break;
caseftBool:
return[NSNumbernumberWithBool:[(NSString*)fieldValueboolValue]];
break;
default:
return[NSNumbernumberWithInt:[(NSString*)fieldValueintValue]];
break;
}
}
-(NSString*)toDateString
{
NSDateFormatter*fmt=[[[NSDateFormatteralloc]init]autorelease];
[fmtsetDateFormat:@"yyyy-mm-dd"];
NSDate*date=[fmtdateFromString:fieldValue];
NSString*datestr=[fmtstringFromDate:date];
return(datestr==nil)?@"":datestr;
}
-(NSString*)toTimeString
{
NSDateFormatter*fmt=[[[NSDateFormatteralloc]init]autorelease];
[fmtsetDateFormat:@"HH:mm:ss"];//H为0-23,h为1-12
NSDate*time=[fmtdateFromString:fieldValue];
NSString*timestr=[fmtstringFromDate:time];
return(timestr==nil)?@"":timestr;
}
-(NSString*)toDateTimeString;
{
NSDateFormatter*fmt=[[[NSDateFormatteralloc]init]autorelease];
[fmtsetDateFormat:@"yyyy-MM-ddHH:mm:ss"];//H为0-23,h为1-12
NSDate*datetime=[fmtdateFromString:fieldValue];
NSString*dtimestr=[fmtstringFromDate:datetime];
return(dtimestr==nil)?@"":dtimestr;
}
-(NSDate*)toDate
{
NSDateFormatter*fmt=[[NSDateFormatteralloc]init];
[fmtsetDateFormat:@"yyyy-MM-ddHH:mm:ss"];
NSDate*date=[fmtdateFromString:fieldValue];
returndate;
}
-(enumfieldtype)getFieldType
{
returnmtype;
}
@end
@implementationOCDataset
-(id)init
{
self=[superinit];
if(self){
cursor=-1;
records=[[NSMutableArrayalloc]init];
returnself;
}
returnnil;
}
-(void)dealloc
{
[recordsrelease];
[superdealloc];
}
-(void)reset
{
cursor=0;
}
-(void)fillData:(sqlite3_stmt*)cmd
{
NSIntegercolcount=sqlite3_column_count(cmd);
NSMutableDictionary*fields=[[[NSMutableDictionaryalloc]init]autorelease];
for(NSIntegeri=0;i<colcount;i++){
char*fieldname=(char*)sqlite3_column_name(cmd,i);
NSString*strfieldname=[NSStringstringWithCString:fieldnameencoding:NSUTF8StringEncoding];
sqlite3_value*mvalue=sqlite3_column_value(cmd,i);
char*ity=(char*)sqlite3_column_decltype(cmd,i);
NSString*stype=[NSStringstringWithCString:ityencoding:NSUTF8StringEncoding];
//inttype=sqlite3_column_type(cmd,i);
OCField*field=[[OCFieldalloc]init];
[fieldsetfield:strfieldnamewithvalue:mvaluewithtype:stype];
field.seq_column=i;
[fieldssetObject:fieldforKey:strfieldname];
}
[recordsaddObject:fields];
}
-(void)clear
{
[recordsremoveAllObjects];
cursor=-1;
}
-(NSInteger)count
{
return[recordscount];
}
-(OCField*)fieldbyname:(NSString*)fieldname
{
NSMutableDictionary*dic=[recordsobjectAtIndex:cursor];
return(OCField*)[dicobjectForKey:fieldname];
}
-(BOOL)next
{
++cursor;
intrcount=[recordscount];
if(cursor<=rcount){
returnYES;
}
else
{
cursor=rcount+1;
returnNO;
}
}
-(BOOL)first
{
if([recordscount]>0){
cursor=0;
returnYES;
}
else
{
cursor=-1;
returnNO;
}
}
-(BOOL)move:(NSInteger)index
{
intidx=index-1;
if(-1<idx<[recordscount]){
cursor=idx;
returnYES;
}
returnNO;
}
-(OCField*)indexOffield:(NSInteger)index
{
OCField*ret=nil;
intct=0;
NSMutableDictionary*dic=[recordsobjectAtIndex:cursor];
for(NSString*keyindic)
{
ret=[dicobjectForKey:key];
if(index==ct)
break;
else
ct++;
}
returnret;
}
@end
@implementationOCSqlite
@synthesizedataset;
-(id)init
{
self=[superinit];
if(self){
dataset=[[OCDatasetalloc]init];
returnself;
}
returnnil;
}
-(void)dealloc
{
[datasetrelease];
sqlite3_close(db);
[superdealloc];
}
-(BOOL)ConnectToDB:(NSString*)dbfilepath
{
BOOLsuccessful;
successful=sqlite3_open([dbfilepathUTF8String],&db)==SQLITE_OK;
if(!successful){
sqlite3_close(db);
returnNO;
}
returnYES;
}
-(void)DisconnectDB
{
sqlite3_close(db);
}
-(BOOL)excesql:(NSString*)ddlsql
{
char*err;
if(sqlite3_exec(db,[ddlsqlUTF8String],NULL,NULL,&err)!=SQLITE_OK)
{
returnNO;
}
returnYES;
}
-(BOOL)query:(NSString*)qysql
{
sqlite3_stmt*cmd;
if(sqlite3_prepare_v2(db,[qysqlUTF8String],-1,&cmd,nil)!=SQLITE_OK)
{
returnNO;
}
[datasetclear];
while(sqlite3_step(cmd)==SQLITE_ROW)
{
[datasetfillData:cmd];
}
[datasetreset];
sqlite3_finalize(cmd);
returnYES;
}
-(BOOL)startTranslation
{
char*err;
if(sqlite3_exec(db,"begintransaction",NULL,NULL,&err)!=SQLITE_OK)
{
returnNO;
}
returnYES;
}
-(BOOL)commitTranslation
{
char*err;
if(sqlite3_exec(db,"committransaction",NULL,NULL,&err)!=SQLITE_OK)
{
returnNO;
}
returnYES;
}
-(BOOL)rollbackTranslation
{
char*err;
if(sqlite3_exec(db,"rollbacktransaction",NULL,NULL,&err)!=SQLITE_OK)
{
returnNO;
}
returnYES;
}
@end
以上是“sqlite操作与封装的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。