2017-04-10 50 views
1

這裏是我的代碼從sqlite3_prepare_v2失敗。錯誤是:內存不足

- (void) SaveImagesToSql: (NSData*) imgData { 
    // NSLog(@"\n*****Save image to SQLite*****\n"); 
    sqlite3 *sqlite3DatabaseObject; 
    sqlite3_stmt* sqlite3Statement; 
    NSString *databasePath = [self.documentsDirectory stringByAppendingPathComponent:self.databaseFilename]; 

    const char* sqlite3Query = "INSERT INTO ABCD (image) VALUES (?)"; 

     BOOL openDatabaseResult = sqlite3_open_v2([databasePath UTF8String], &sqlite3DatabaseObject, -1, sqlite3Query); 
     if (openDatabaseResult == SQLITE_OK) { 
      sqlite3_stmt* sqlite3Statement; 

      BOOL sqlite3Prepare = sqlite3_prepare_v2(sqlite3DatabaseObject, sqlite3Query, -1, &sqlite3Statement, NULL); 
      if(sqlite3Prepare == SQLITE_OK) { 


       sqlite3_bind_blob(sqlite3Statement, 1, [imgData bytes], [imgData length], SQLITE_TRANSIENT); 
       sqlite3_step(sqlite3Statement); 


      } 
     } 
     else NSLog(@"SaveBody: Failed from sqlite3_prepare_v2. Error is: %s", sqlite3_errmsg(sqlite3DatabaseObject)); 

     sqlite3_finalize(sqlite3Statement); 
    } 

及其引發錯誤爲:

SaveBody:從sqlite3_prepare_v2失敗。錯誤是:內存不足

任何人都可以請幫助我這個。

在此先感謝。


編輯:

現在,我已經解決了sqlite3_open_v2問題和一些低於所指出的其他問題,我現在收到一個不同的錯誤信息:

SaveBody:準備失敗:沒有這樣的表:ABCD

這是我修改後的代碼:

- (void) SaveImagesToSql: (NSData*) imgData { 
    // NSLog(@"\n*****Save image to SQLite*****\n"); 
    sqlite3 *sqlite3DatabaseObject; 
    sqlite3_stmt* sqlite3Statement; 
    NSString *databasePath = [self.documentsDirectory stringByAppendingPathComponent:@"picdb.sqlite"]; 

    const char* sqlite3Query = "INSERT INTO ABCD (image) VALUES (?)"; 
    int openDatabaseResult = sqlite3_open_v2([databasePath UTF8String], &sqlite3DatabaseObject, SQLITE_OPEN_READWRITE , NULL); 
    // int openDatabaseResult = sqlite3_open_v2([databasePath UTF8String], &sqlite3DatabaseObject, -1, sqlite3Query); 
    if (openDatabaseResult == SQLITE_OK) { 
     sqlite3_stmt* sqlite3Statement; 
     int sqlite3Prepare = sqlite3_prepare_v2(sqlite3DatabaseObject, sqlite3Query, -1, &sqlite3Statement, NULL); 
     if(sqlite3Prepare == SQLITE_OK) { 

      sqlite3_step(sqlite3Statement); 
      sqlite3_bind_blob(sqlite3Statement, 1, [imgData bytes], [imgData length], SQLITE_TRANSIENT); 
     } 
     else 
     { 
     NSLog(@"Prepare failure: %s", sqlite3_errmsg(sqlite3DatabaseObject)); 
     } 
    } 
    else NSLog(@"SaveBody: Failed from sqlite3_prepare_v2. Error is: %s", sqlite3_errmsg(sqlite3DatabaseObject)); 

    sqlite3_finalize(sqlite3Statement); 
} 
+1

不要改變問題,使現有答案失效。 –

+0

是的,堆棧溢出的整個想法是有一個可搜索的問題和答案庫,如果你實質上改變了這個問題,未來的讀者會被一個與修訂後的問題無關的答案迷惑。如果我們回答您的原始問題,[接受下面的答案](http://stackoverflow.com/help/someone-answers)。如果您還有其他問題,請在Stack Overflow中搜索相關問題(因爲此前已被回答過),並且只有當您找不到答案時,發佈_new_問題,才能顯示您在新問題上所做的研究。 – Rob

+0

好吧,對不起,我沒有意識到這一點,我是StackOverflow的新手。以後要小心。 –

回答

1

幾個問題:

  1. 日誌聲明說,它的日誌sqlite3_prepare_v2錯誤,但事實並非如此。它記錄了sqlite3_open_v2錯誤。

  2. sqlite3_open_v2失敗的原因是:

    • 第三個參數是無效的(這應該是你需要的東西的標誌,如SQLITE_OPEN_READWRITE或其他);和

    • 你提供了一個指針sqlite3Query爲最後一個參數,但這不是第四個參數的用途。

    欲瞭解更多信息,請參閱documentation for sqlite3_open_v2

  3. 誤導性的「內存不足」錯誤發生是因爲sqlite3_errmsg未傳遞有效的數據庫指針。顯然,由於打開失敗,您沒有有效的數據庫指針,因此您不能使用sqlite3_errmsg打開失敗。只需登錄openDatabaseResult值。

  4. 請注意,這些sqlite3_xxx函數不返回BOOL。他們返回int。在sqlite3_open_v2的情況下,檢查返回值是診斷正在進行的唯一方法,並且如果使用BOOL,則可能會丟失重要的數值。

+0

好吧,現在請檢查我更新的code.Now我面臨的問題在sqlite3_prepare_v2方法,它說我的表不存在。 –

+0

所以,這意味着該表不存在。如果數據庫不存在,那麼會發生這種情況,並且'SQLITE_OPEN_CREATE'說「如果找不到空數據庫,就創建一個空數據庫」。所以,如果真的有一個空白的數據庫,請刪除它。然後找出數據庫與實際表的位置。 – Rob

+0

就個人而言,當使用預建數據庫時,我會看到數據庫是否存在於Documents文件夾中(或者我將檢查數據庫的版本),如果沒有,將它從bundle複製到Documents文件夾,然後始終打開數據庫只有'SQLITE_OPEN_READWRITE'(不是'SQLITE_OPEN_CREATE')。它避免了SQLite從未創建空白數據庫。請注意,一旦你有空白的數據庫,你可能會想要卸載應用程序,然後重新安裝,以確保刪除任何空白數據庫。 – Rob