数据库操作几点建议:
- 注意sql执行语句的字符串的拼写。(一定要注意拼写,深受其害 T_T )
- Obj-C中SQLite常用函数。
(没几个,sqlite3_open,sqlite3_close,sqlite3_exec,sqlite3_perpare_v2,sqlite3_step,sqlite3_column_*,……)(外加两个对象:sqlite,sqlite_stmt)
- SQLite语法。(一般的数据库操作都一样)
- 如果做大一点的项目的话,数据库操作还是尽可能的封装吧。
- 善用搜索。(没少走弯路)
废话不多说,代码加注释:
//数据库路径
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [paths objectAtIndex:0];
NSString *filePath = [documentsDir stringByAppendingPathComponent:@"test3.sqlite"];
//打开数据库
if (sqlite3_open([filePath UTF8String], &database) != SQLITE_OK)
{
NSLog(@"打开数据库失败");
}
//数据执行操作封装,不想封装直接用sqlite3_exec函数
//sqlite3_exec返回枚举值(整形),可以执行创建表,插入,删除,更新等操作
- (int)execSql:(NSString*)sql
{
char *errmsg;
if (sqlite3_exec(database, [sql UTF8String], nil, nil, &errmsg) != SQLITE_OK) {
NSLog(@"数据库操作失败!");
NSLog(@"%s", errmsg);
return SQLITE_ERROR;
}
return SQLITE_OK;
}
//调用封装后的方法创建数据库
NSString *createTableHistory = @"create table if not exists atable(id integer primary key autoincrement, acolumn nvarchar(20) not null);";
[self execSql:createTableHistory];
//数据库查询,(待封装)
thing = [[NSMutableArray alloc] init];
NSString *selectSql = @"select * from atable";
sqlite3_stmt *statement;
if (sqlite3_prepare_v2(database, [selectSql UTF8String], -1, &statement, nil) == SQLITE_OK) {
while (sqlite3_step(statement) == SQLITE_ROW) {
//nvarchar类型查询出来是char*,赋值给NSString的话需要转换,
//注意,这里是第1列,列数是从第0列开始的
//如果要查询多个字段,如学生信息,可以把学生封装成一个类,然后把该类的事例一个个放到数组里
[thing addObject:[NSString stringWithUTF8String:(char*)sqlite3_column_text(statement, 1)]];
}
}
else
{
NSLog(@"数据查询失败!");
}
//最后当页面关闭,或程序关闭记得关闭数据库
sqlite3_close(database);