SQLite是否支持“datareader”?

时间:2011-04-18 22:11:38

标签: objective-c sqlite

我正在尝试在SQLite中使用datareader,但我无法在我拥有的文档中找到任何内容(Kreibich的“Using SQLite”)。

有人可以告诉我它是否得到支持以及我可以找到一些例子吗?

2 个答案:

答案 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);