2013-07-09 70 views
0

我想問下我的功能。 當我調用這個函數時,它打印不可用。 你能幫我嗎?sqlite3_prepare_v2!= SQLITE_OK

static sqlite3 *database = nil; 
    static sqlite3_stmt *statement = nil; 

    - (BOOL) findNews:(NSString *)caption{ 
    const char *dbpath = [databasePath UTF8String]; 
    if (sqlite3_open(dbpath, &database) == SQLITE_OK) 
    { 
     NSLog(@"CAPTION ID : %@", caption); 
     NSString *querySQL = [NSString stringWithFormat:@"SELECT * FROM dbase WHERE CONTENT_ID = \"%@\"", caption]; 
     const char *query_stmt = [querySQL UTF8String]; 

     if (sqlite3_prepare_v2(database, query_stmt, -1, &statement, NULL) == SQLITE_OK) 
     { 
      if (sqlite3_step(statement) == SQLITE_ROW) 
      { 
       return YES; 
      } 
      else{ 
       return NO; 
      } 
      sqlite3_reset(statement); 
     }else{ 
      NSLog(@"NOT AVAILABLE"); 
     } 
    } 
    return nil; 
} 
+0

採用單quate,而不是在你的查詢字符串類型數據雙quate ... – Pradeep

+1

對於prepareStatement我們使用結合variables.So,而不是提供%@,給?,並綁定是什麼?隨後有價值。因爲這些是預先編制的陳述。 –

+0

@NuzhatZari你能向我解釋更多細節嗎? – Template09

回答

7

有一些原因是由於該sqlite3_prepare_v2 = SQLITE_OK:

  1. 表可能不存在到數據庫中。

  2. 錯誤的查詢語句。

  3. 錯誤的列名到查詢語句中。

您可以通過將以下的其他使用錯誤的語句找到確切的問題:

NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database)) 
1

sqlite3的open。 「如果文件名是一個空字符串,那麼將創建一個專用的臨時磁盤數據庫,一旦數據庫連接關閉,該專用數據庫將自動刪除。」

所以sqlite3_open將返回SQLITE_OK,如果數據庫沒有複製到Documents目錄中。您應該將數據複製到Bundle中並將該數據庫複製到Documents目錄。

-(void) checkAndCreateDatabase{ 

    BOOL success; 

    NSFileManager *fileManager = [NSFileManager defaultManager]; 

    success = [fileManager fileExistsAtPath:databasePath]; 

    if(success) return; 

    NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"mydb.sqlite"]; 

    [fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil]; 

} 
相關問題