//
<span style="font-family: Arial, Helvetica, sans-serif;">static Data * data;</span>
static FMDatabase * dataBase;
+(instancetype)shardData{
static dispatch_once_tonceToken;
dispatch_once(&onceToken,^{
data = [[Data alloc]init];
[datainitData]; });
return data;
}
+(instancetype)allocWithZone:(struct _NSZone*)zone{
if (data == nil){
data = [superallocWithZone:zone];
} return data;
}//imageName;//imagee kkid
在操作数据库之前,首先要打开数据库。这个函数打开一个sqlite数据库文件的连接并且返回一个数据库连接对象。这个操作同时程序中的第一个调用的sqlite函数,同时也是其他sqlite api的先决条件。许多的sqlite接口函数都需要一个数据库连接对象的指针作为它们的第一个参数。
//创建表
-(void)initData{
//获取数据库的路径
NSString *strpath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
//拼接路径
NSString *path = [strpath stringByAppendingString:@"FMDB.TABLE"];
//初始化数据表
dataBase = [[FMDatabase alloc]initWithPath:path];
//打开数据库
if ([dataBase open]) {
NSLog(@"打开成功");
[dataBase executeUpdate:@"create table Mondel(kkid integer primary key autoincrement,imageName text,imagee text)"]; } else { NSLog(@"打开失败"); }
}
假如这个要被打开的数据文件不存在,则一个同名的数据库文件将被创建。如果使用sqlite3_open和sqlite3_open_v2的话,数据库将采用UTF-8的编码方式,sqlite3_open16采用UTF-16的编码方式
-(BOOL)insertData:(Model *)mmoo{
//打开数据库
[dataBase open];
//创建插入语句
BOOL result = [dataBase executeUpdate:@"insert into Mondel(imageName,imagee)values(?,?)",mmoo.imageName,UIImagePNGRepresentation(mmoo.imagee)];
if (result) { NSLog(@"添加成功"); } else { NSLog(@"添加失败"); }
//关闭数据库
[dataBase close];
return result;}
这个函数将sql文本转换成一个准备语句(prepared statement)对象,同时返回这个对象的指针。这个接口需要一个数据库连接指针以及一个要准备的包含SQL语句的文本。它实际上并不执行(evaluate)这个SQL语句,它仅仅为执行准备这个sql语句
//删除
-(BOOL)deleteData:(NSInteger)iidd{
//打开数据库
[dataBase open];
//创建删除语句
BOOL result =[dataBase executeUpdateWithFormat:@"delete from Mondel where kkid = %ld",iidd];
if (result) { NSLog(@"删除成功"); } else { NSLog(@"删除失败"); }
//关闭数据库
[dataBase close];
return result;}
nByte:如果nByte小于0,则函数取出zSql中从开始到第一个0终止符的内容;如果nByte不是负的,那么它就是这个函数能从zSql中读取的字节数的最大值。如果nBytes非负,zSql在第一次遇见’/000/或’u000’的时候终止.如果用户知道被传入的 sql 语句是以 '\0' 结尾的, 那么有一个更好的做法是:把nbytes的值设为该字符串的长度(包含'\0'), 这样可以避免 SQLite 复制该字符串的一份拷贝, 以提高程序的效率.
pzTail:上面提到zSql在遇见终止符或者是达到设定的nByte之后结束,假如zSql还有剩余的内容,那么这些剩余的内容被存放到pZTail中,不包括终止符。如果 pszTail 不为 NULL, 则 *pszTail 指向 sql 中第一个被传入的 SQL 语句的结尾. 该函数只编译 sql 的第一个语句, 所以 *pszTail 指向的内容则是未被编译的.
ppStmt:能够使用sqlite3_step()执行的编译好的准备语句的指针,如果错误发生,它被置为NULL,如假如输入的文本不包括sql语句。调用过程必须负责在编译好的sql语句完成使用后使用sqlite3_finalize()删除它
//更新
-(BOOL)updataData:(Model*)mmoo{
//打开数据库
[dataBase open];
//创建修改语句
BOOL result = [dataBase executeUpdateWithFormat:@"update Mondel set imageName = %@,imagee = %@ where kkid = %ld",mmoo.imageName,UIImagePNGRepresentation(mmoo.imagee),mmoo.kkid];
if (result) { NSLog(@"修改成功"); } else { NSLog(@"修改失败"); }
//关闭数据库
[dataBase close];
return result;}
在sqlite中并没有定义sqlite3_stmt这个结构的具体内容,它只是一个抽象类型,在使用过程中一般以它的指针进行操作,而sqlite3_stmt类型的指针在实际上是一个指向Vdbe的结构体得指针
//查询
-(NSMutableArray *)selectData{
//打开数据库
[dataBase open];
//创建查找语句
FMResultSet *resultset = [dataBase executeQuery:@"select *from Mondel"];
NSMutableArray *Marr = [NSMutableArray array];
while ([resultset next]) {
Model *mon = [[Model alloc]init];
mon.kkid = [resultset intForColumn:@"kkid"];
mon.imagee = [UIImage imageWithData:[resultset dataForColumn:@"imagee"]];
mon.imageName = [resultset stringForColumn:@"imageName"];
[Marr addObject:mon];
}
return Marr;}