今天总结一下iOS中使用SQLite。其实用到SQLite的话想要存储的数据就已经比较大了。那么开始,首先要做的事导入SQLite3库到工程环境中。
接下来我们要做的开始数据库方面的编写工作。
首先,查看工作环境的沙盒中有没有数据库文件,如果有就打开,如果没有就直接创建数据库。代码如下:
// 0.获得沙盒中的数据库文件名
NSString *filename = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"student.sqlite"];
// 1.创建(打开)数据库(如果数据库文件不存在,会自动创建)
int result = sqlite3_open(filename.UTF8String, &_db);
if (result == SQLITE_OK) {
NSLog(@"成功打开数据库");
// 2.创表
const char *sql = "create table if not exists t_student (id integer primary key autoincrement, name text, age integer);";
char *errorMesg = NULL;
int result = sqlite3_exec(_db, sql, NULL, NULL, &errorMesg);
if (result == SQLITE_OK) {
NSLog(@"成功创建t_student表");
} else {
NSLog(@"创建t_student表失败:%s", errorMesg);
}
} else {
NSLog(@"打开数据库失败");
}
打开数据库之后我们就要做一点事情了,对于数据库无非就是增删改查,那么接下来我们来完成插入句
for (int i = 0; i<30; i++) {
NSString *name = [NSString stringWithFormat:@"Jack-%d", arc4random()%100];
int age = arc4random()%100;
NSString *sql = [NSString stringWithFormat:@"insert into t_student (name, age) values('%@', %d);", name, age];
char *errorMesg = NULL;
int result = sqlite3_exec(_db, sql.UTF8String, NULL, NULL, &errorMesg);
if (result == SQLITE_OK) {
NSLog(@"成功添加数据");
} else {
NSLog(@"添加数据失败:%s", errorMesg);
}
}
然后就是查询语句,关于查询语句,要注意的是,防止SQL注入,所以查询语句不应该是直接通过账号和密码去数据库查询如下下面的代码(select * from t_user where username = '123' and password = '456' )
正确的写法应该是如下的查询代码:
// 1.定义sql语句
const char *sql = "select id, name, age from t_student where name = ?;";
// 2.定义一个stmt存放结果集
sqlite3_stmt *stmt = NULL;
// 3.检测SQL语句的合法性
int result = sqlite3_prepare_v2(_db, sql, -1, &stmt, NULL);
if (result == SQLITE_OK) {
NSLog(@"查询语句是合法的");
// 设置占位符的内容
sqlite3_bind_text(stmt, 1, "jack", -1, NULL);
// 4.执行SQL语句,从结果集中取出数据
// int stepResult = sqlite3_step(stmt);
while (sqlite3_step(stmt) == SQLITE_ROW) { // 真的查询到一行数据
// 获得这行对应的数据
// 获得第0列的id
int sid = sqlite3_column_int(stmt, 0);
// 获得第1列的name
const unsigned char *sname = sqlite3_column_text(stmt, 1);
// 获得第2列的age
int sage = sqlite3_column_int(stmt, 2);
NSLog(@"%d %s %d", sid, sname, sage);
}
} else {
NSLog(@"查询语句非合法");
}
SQLite是厉害,可是总觉得不方便,总是要用到C语言,还要写那么多的查询语句,麻烦。当然如果只是在iOS设备上使用数据存储那么,你还可以使用Core Data来完成上面的增,查的效果,还不要写一丢丢的sql语句。关于Core Data还可以这里有几篇文章还是写的非常好的。
http://www.cocoachina.com/ios/20140615/8832.html
http://www.cocoachina.com/ios/20140430/8275.html