SQLite3在存储和检索大量数据方面非常有效,它能够对数据进行复杂的聚合,与使用对象进行这些操作相比,获得结果的速度更快。例如,我们要从数据集合中获取满足条件的数据的总和,通过SQLtie可以执行这些操作,并且不需要将这些数据加载到内存中,这使得数据检索的效率更高。操作SQLite数据库需要用SQL语句与之交互,可以点击这里来查询相应的SQL语句。
1、创建SQLiteTest,运用single view这个模板,并导入libsqlite3.dylib这个动态库。
2、在指定沙盒目录下创建或者打开数据库,用sqlite3_open这个方法来打开数据库,如果数据库不存在,会创建一个新的数据库。
<span style="font-size:14px;">/*数据库存储路径*/
- (NSString *)dataFilePath
{
NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString * documentDirectory = paths[0];
return [documentDirectory stringByAppendingPathComponent:@"studentsData.sqlite"];
}</span>
<span style="font-size:14px;">if (sqlite3_open([self dataFilePath].UTF8String, &database) != SQLITE_OK) {
sqlite3_close(database);
}
</span>
3、创建数据表,在这里创建一个管理学生的表,包括四个id,name,age和address四个字段,sqlite_exec用于执行无返回值的SQL语句。
<span style="font-size:14px;">- (BOOL)execSQL:(NSString *)sql
{
char * err;
/*sqlite_exec用于执行无返回值的SQL语句*/
if (sqlite3_exec(database, sql.UTF8String, NULL, NULL, &err) != SQLITE_OK) {
NSLog(@"数据库操作失败");
return NO;
}
return YES;
}</span>
<span style="font-size:14px;">NSString * creatSQL = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@ (id INTEGER,name TEXT,age INTEGER,address TEXT)",TABLE_NAME];
[self execSQL:creatSQL];</span>
用火狐浏览器的SQLite Manger插件可以查看创建的数据库和数据表。
4、向表中添加几条数据记录。
首先是用SQL语句的方式增加数据。
<span style="font-size:14px;">NSString * insertSQL1 = [NSString stringWithFormat:@"INSERT INTO '%@' ('%@','%@', '%@', '%@') VALUES ('%@','%@', '%@', '%@')",
TABLE_NAME,@"id",@"name", @"age", @"address",@"001", @"student1", @"23", @"北京市"];
NSString * insertSQL2 = [NSString stringWithFormat:@"INSERT INTO '%@' ('%@','%@', '%@', '%@') VALUES ('%@','%@', '%@', '%@')",
TABLE_NAME,@"id",@"name", @"age", @"address",@"002", @"student2", @"30", @"上海市"];
NSString * insertSQL3 = [NSString stringWithFormat:@"INSERT INTO '%@' ('%@','%@', '%@', '%@') VALUES ('%@','%@', '%@', '%@')",
TABLE_NAME,@"id",@"name", @"age", @"address",@"003", @"student3", @"28", @"广州市"];
[self execSQL:insertSQL1];
[self execSQL:insertSQL2];
[self execSQL:insertSQL3];</span>
除了使用SQL语句添加数据之外,还有一种更好的方法,就是绑定变量。
<span style="font-size:14px;">NSString * insertSQL = [NSString stringWithFormat:@"INSERT OR REPLACE INTO %@ (%@, %@,%@,%@)"
"VALUES (?,?,?,?);",TABLE_NAME,@"id",@"name",@"age",@"address"];
sqlite3_stmt * stmt;
if (sqlite3_prepare_v2(database, insertSQL.UTF8String, -1, &stmt, nil) == SQLITE_OK) {
sqlite3_bind_int(stmt, 1, 004);
sqlite3_bind_text(stmt, 2, "student4", -1, NULL);
sqlite3_bind_int(stmt, 3, 26);
sqlite3_bind_text(stmt, 4, "深圳市",-1,NULL);
}
if (sqlite3_step(stmt) != SQLITE_OK) {
NSLog(@"bind error");
}</span>
5、删除数据,例如删除address为广州市的学生信息。
<span style="font-size:14px;">NSString * deleteSQL = [NSString stringWithFormat:@"DELETE FROM %@ WHERE %@ = '广州市' ",TABLE_NAME,@"address"];
[self execSQL:deleteSQL];</span>
6、修改数据,例如将name为student4的学生的address改为青岛市。
<span style="font-size:14px;">NSString * updataSQL = [NSString stringWithFormat:@"UPDATE %@ SET ADDRESS = '青岛市' WHERE NAME = 'student4' ",TABLE_NAME];
[self execSQL:updataSQL];</span>
7,数据查询,例如,查询所有年龄小于28岁的学生信息。
NSString * selectSQL = [NSString stringWithFormat:@"SELECT * FROM %@ WHERE AGE < 28",TABLE_NAME];
sqlite3_stmt * stmt;
if (sqlite3_prepare_v2(database, selectSQL.UTF8String, -1, &stmt, nil) == SQLITE_OK) {
while (sqlite3_step(stmt) == SQLITE_ROW) {
int student_id = sqlite3_column_int(stmt, 0);
char * name = (char *)sqlite3_column_text(stmt, 1);
int age = sqlite3_column_int(stmt, 2);
char * address = (char *)sqlite3_column_text(stmt, 3);
NSLog(@" id = %d,name = %@, age = %d,address = %@",student_id,[NSString stringWithUTF8String:name],age,[NSString stringWithUTF8String:address]);
}
}
每次操作完数据库之后,不要忘了关闭数据库,调用sqlite3_close。