我正在尝试在SQLite中使用datareader,但我无法在我拥有的文档中找到任何内容(Kreibich的“Using SQLite”)。
有人可以告诉我它是否得到支持以及我可以找到一些例子吗?
答案 0 :(得分:1)
是的,你只需要自己System.Data.SQLite。
它有两个变体,一个内置SQLite,另一个需要你也发布一个单独的原生sqlite DLL。
答案 1 :(得分:1)
sqlite api的概念在逻辑上等同于.net阅读器。这意味着,您发出查询,然后根据需要迭代读取数据。因为你没有将完整的结果集拉入内存,所以保持低内存。
首先,看一下像fmdb这样的其他包装器。
这是使用iPhone内部的c api的等价物。您通过传递sql查询(封面下的sqlite解析)来准备语句,然后调用step,它等同于.net reader read方法。你读的列就像.net数据阅读器一样。请注意,此示例准备并完成(清理)。一种更有效的方法是保存预准备语句,然后调用reset以避免让sqlite一遍又一遍地解析查询。
// prep statement
sqlite3_stmt *statement;
NSString *querySQL = @"SELECT id, name FROM contacts";
NSLog(@"query: %@", querySQL);
const char *query_stmt = [querySQL UTF8String];
// preparing a query compiles the query so it can be re-used.
sqlite3_prepare_v2(_contactDb, query_stmt, -1, &statement, NULL);
// process result
while (sqlite3_step(statement) == SQLITE_ROW)
{
int idx = 0;
Contact *contact = [[Contact alloc] init];
NSNumber *idField = [NSNumber numberWithLongLong:sqlite3_column_int64(statement, idx++)];
[contact setId:idField];
NSString *nameField = [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement, idx)];
[contact setName:nameField];
NSLog(@"id: %@", [contact id]);
NSLog(@"name: %@", [contact name]);
[nameField release];
[contactsList addObject:contact];
[contact release];
}
sqlite3_finalize(statement);