SQLLite (三):sqlite3_prepare_v2,sqlite3_step

来源:互联网 发布:qq飞车暗夜王爵数据 编辑:程序博客网 时间:2024/05/29 13:23

如果既不想写回调函数,又想避免sqlite3_get_table之后麻烦的一维数组遍历,那么利用sqlite3_prepare_v2执行sql select语句,让后sqlite3_step遍历select执行的返回结果是一个非常方便的solution. 当然,你必须要明白sqlite3_prepare_v2不仅仅能够执行table的query selection,也能方便地进行sql Delete, Insert, Update等其他一些操作。它能帮你把sql语句的执行操作变的更加优雅。

[cpp] view plaincopy
  1. int sqlite3_prepare_v2(  
  2.   sqlite3 *db,            <span style="color:#009900;">/* Database handle */</span>  
  3.   const char *zSql,       <span style="color:#009900;">/* SQL statement, UTF-8 encoded */</span>  
  4.   int nByte,              <span style="color:#009900;">/* Maximum length of zSql in bytes. */</span>  
  5.   sqlite3_stmt **ppStmt,  <span style="color:#009900;">/* OUT: Statement handle */</span>  
  6.   const char **pzTail     <span style="color:#009900;">/* OUT: Pointer to unused portion of zSql */</span>  
  7. );  
[cpp] view plaincopy
  1. int sqlite3_step(sqlite3_stmt*);  
下面以一段iOS中的selection查询为例说明二者的用法:

[cpp] view plaincopy
  1. -(void)InitializeFilesTable  
  2. {  
  3.     const char * query = "SELECT * FROM [FileObjects]";  
  4.     sqlite3_stmt * stmt;  
  5.     int result = sqlite3_prepare_v2(mDatabase, query, -1, &stmt, NULL);  
  6.     if(SQLITE_OK != result)  
  7.     {  
  8.         sqlite3_finalize(stmt);  
  9.         <span style="color:#009900;">// The table has not been created. Most likely, this is the first time we create the database.  
  10.         // Therefore, create all tables in it</span>  
  11.         char * sql = "Create TABLE [FileObjects] ([FileId] VARCHAR(128),[FileExt] VARCHAR(128), [FileName] VARCHAR(128), [FileUrl] VARCHAR(128), [FileType] INT  );"; <span style="color:#009900;">// NOXLATE</span>  
  12.         char * errMsg;  
  13.         result = sqlite3_exec(mDatabase, sql, NULL, NULL, &errMsg);  
  14.     }  
  15.     else  
  16.     {  
  17.         <span style="color:#009900;">// Select returns OK, initialize the memory model from the result</span>  
  18.         NSMutableDictionary * files = [NSMutableDictionary new];  
  19.         while(sqlite3_step(stmt) == SQLITE_ROW)  
  20.         {  
  21.             FileObject * file = [FileObject new];  
  22.               
  23.             const char * str = (const char *)sqlite3_column_text(stmt, 0);  
  24.             file.FileId = str? [[NSString alloc] initWithUTF8String:str] : @"";  
  25.               
  26.             str = (const char *)sqlite3_column_text(stmt, 1);  
  27.             file.FileExt = str? [[NSString alloc] initWithUTF8String:str] : @"";  
  28.               
  29.             str = (const char *)sqlite3_column_text(stmt, 2);  
  30.             file.FileName = str? [[NSString alloc] initWithUTF8String:str] : @"";  
  31.               
  32.             str = (const char *)sqlite3_column_text(stmt, 3);  
  33.             file.FileUrl = str? [[NSString alloc] initWithUTF8String:str] : @"";  
  34.               
  35.             file.FileType = sqlite3_column_int(stmt, 4);  
  36.               
  37.             [files setObject:file forKey:file.FileId];  
  38.         }  
  39.           
  40.         sqlite3_finalize(stmt);  
  41.         [mFiles setDictionary:files];  
  42.     }  
  43. }  
这其中包括对sqlite3_exec的调用。sqlite3_exec可以执行任何sql语句,包括事务("BEGIN TRANSACTION")、回滚("ROLLBACK")和提交("COMMIT")等等。
原创粉丝点击