2011-04-18 115 views
1

我想在SQLite中使用數據讀取器,但無法找到我擁有的文檔中的任何內容(Kreibich使用的「使用SQLite」)。SQLite是否支持「datareader」?

有人可以告訴我它是否受支持,我可以在哪裏找到一些示例?

+0

通過datareader你的意思.NET的datareader? – MPelletier 2011-04-18 22:13:33

+0

呃哦...我想我現在有麻煩了...是的,我想這是.NET的數據採集器...在SQLite中有沒有相當的東西? – SpokaneDude 2011-04-18 22:21:37

+0

我跟着你很難過。 SQLite是一個數據庫實用程序。它可用作DLL或EXE。它沒有「有」一個datareader在裏面。如果我瞭解你,你將需要像@enverpex所建議的互操作庫。 – MPelletier 2011-04-18 23:05:23

回答

1

是的,你只需要讓自己System.Data.SQLite

它有兩種變體,一種是內置SQLite的,另一種需要您也提供獨立的本地sqlite DLL。

+0

我忘了提及這是Objective-C代碼...我已經知道System.Data.SQLite ...對不起,誤導你... – SpokaneDude 2011-04-18 23:04:50

+0

@ Spokane-Dude:哦,你現在很麻煩,先生! ;) – MPelletier 2011-04-19 00:30:09

1

sqlite api的概念在邏輯上等同於.net閱讀器。這意味着,您發出查詢,然後根據需要迭代讀取數據。由於不將完整的結果集拉入內存,因此可以保持較低的內存。

首先,看看其他包裝如fmdb。

這裏是使用iPhone內部的c api的等價物。你通過傳遞sql查詢來準備語句(sqlite在封面下解析),然後調用與.net閱讀器讀取方法等效的步驟。你像.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);