1、概述
sqlite是个开源嵌入式关系数据库,SQLite嵌入到使用它的应用程序中,它们共用相同的进程空间,而不是单独的一个进程.sqlite不是覆盖存储,不像其他持久化操作,需要把整个文件读取出来,然后修改数据后把整个内容写入文件,所以他们都不适合存储大量数据。
.字段类型
表面上SQLite将数据分为以下几种类型:
integer:整数
real:实数(浮点数)
text:文本字符串
blob:二进制数据,比如文件,图片之类的。
sqlite数据类型,只是一种数据类型的规范,实际上是无类型的,不指定数据类型依旧可以存储数据,创建表时也可以不用指定类型,不管为了规范都建议设置正确的数据类型,主键的话必须设置为integer类型。
2、操作数据库
1、打开数据库指定数据库文件,指定或者创建一张表
-(void)openDatabase{
// 1.设置文件名
NSString *dbFile = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)firstObject stringByAppendingPathComponet:@"user.db"];
//2.打开数据库文件,
NSString *dbFile = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@"user.db"];
// 2.打开数据库文件,如果没有就会自己创建一个表
NSInteger result = sqlite3_open(dbFile.UTF8String,&sqlite);
if(result = SQLITE_OK){
NSLog(@"打开成功");
//3.创建数据库表,使用sqlite3_exec()方法可以执行任何SQL语句,比如创表,更新,插入和删除操作。但是一般不用它执行查询语句,因为它不会返回查询到的数据。
char &error = NULL;
sqlite3_exec(sqlite,"CREATE TABLE IF NOT EXISTS t_user(id integer primary key autoincrement,name text ,age integer)",NULL,NULL,&error);
if(error){
NSLog(@"create error %S",error);
}
}else {
NSLog("打开失败");
}
}
3、执行指令
使用sqlite_exec()方法执行除查询以外的其他数据库操作
如插入数据:
-(void)insertData{
NSString *name=@"zhangsan";
NSInteger age = 19;
<span style="font-family: 'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif; line-height: 25.2px;"> NSString *sql=[NSString stringWithFormat:@"INSERT INTO t_user (name,age) VALUES('%@',"%ld"),name,age";</span>
<span style="font-family: 'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif; line-height: 25.2px;"> char *error =NULL
sqlite_exec(sqlite,sql.UTF8String,NULL,NULL,&error);</span>
<span style="font-family: 'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif; line-height: 25.2px;">if (error){</span>
<span style="font-family: 'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif; line-height: 25.2px;"> NSLog(@"erorr");</span>
<span style="font-family: 'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif; line-height: 25.2px;">}</span>
}
}
查询指令
查询需要几条语句配合使用sqlite3_prepare_v2检查sql合法性,sqlite3_step()逐行获取查询结果,不断重复,知道最后一条记录
sqlite3_colum_xxx();获取对应字段类容,参数0,smtp,参数1 代表sql语句中字段的顺序。sqlite3_finalize()释放stmt
例:从表中读取数据到数组中:
-(void)selectData{
NSMutableArray *mArray = [NSMutableArray arrayWithCapacity:1000];
char *sql = "select name,age from t_user;";
sqlite3_stmt *stmt;
NSInteger result = sqlite3_prepare_v2(sqlite,sql,-1,&stmt,NULL);
if(result =SQLITE_OK){
while(sqlite3_step(stmt)==SQLITE_ROW){
char *name = sqlite3_column_int(stmt,1);
Person *person = [Person personWithName:[NSString stringWithUTF8String:name]Age:age];
[mArray addObject:person];
}
sqlite3_finalize(stmt);
}
}
总的来说在操作sqlite来说,这种方法比较麻烦都是c语言的一些函数的调用,可以通过第三方开源api进行调用,这样比较方便,也可以使用系统提供的Core Data ,第三方的话推荐使用fmdb来操作数据库。