我正在尝试制作一个从 SQLite3 数据库读取的应用程序。我计划在开发期间预加载数据,因此应用程序不需要修改数据库中的任何内容,只需从中读取、进行查询等。
单独读取数据的最佳做法是什么?我应该在每次查询时打开数据库、读取数据然后关闭它吗?该应用程序将进行许多小查询和一些大查询。在应用程序运行期间打开数据库,还是在每次提取时打开/关闭数据库更好?
最佳答案
阅读:
<强>1。对于查询,重用编译语句很重要。
2. 确保使用参数,以便重新使用那些已编译的查询
当您调用 sqlite3_prepare_v2 时,它会编译该语句并为您返回对该语句的引用。找到一种方法来保存它并重新使用它。 *语句见下面的代码。您将 &statement 传递给 prepare。
另外,请注意 ?参数。如果您要重新使用该语句,请务必再次调用该语句的 sqlite3_reset(),重新绑定(bind)程序的输入(参数)并再次执行。
sqlite3_stmt *statement;
NSString *querySQL = @"update contacts set name=?,address=?,phone=? where id=?";
NSLog(@"query: %@", querySQL);
const char *query_stmt = [querySQL UTF8String];
// preparing a query compiles the query so it can be re-used.
// find a way to save off the *statement so you can re-use it.
sqlite3_prepare_v2(_contactDb, query_stmt, -1, &statement, NULL);
// use sqlite3_bind_xxx functions to bind in order values to the params
sqlite3_bind_text(statement, 1, [[contact name] UTF8String], -1, SQLITE_STATIC);
sqlite3_bind_text(statement, 2, [[contact address] UTF8String], -1, SQLITE_STATIC);
sqlite3_bind_text(statement, 3, [[contact phone] UTF8String], -1, SQLITE_STATIC);
sqlite3_bind_int64(statement, 4, [[contact id] longLongValue]);
始终检查返回码!并记录或处理错误。
rc = sqlite3_step(stmt);
switch (rc)
{
case SQLITE_ROW:
// ...
break;
case SQLITE_OK:
case SQLITE_DONE:
break;
default:
// ....
}
return NO;
}
如果您遇到错误,请记录或获取错误消息以提供更多信息:
- (NSString*)errorMessage
{
return [NSString stringWithCString:sqlite3_errmsg(_sqlite3) encoding:NSUTF8StringEncoding];
}
关于ios - sqlite iphone读取数据的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7549281/