2013-04-11 47 views
1

我在此代碼中遇到問題:它在iPhone和iPad Mini上運行正常,但它在大iPad上提供了錯誤消息。有什麼理由嗎?sqlite3_prepare_v2在iPhone和iPad迷你設備上返回OK,但在普通iPad設備上出現錯誤

代碼:從LLDB

- (sqlite3_stmt *)executeQuery:(char *)aQuery { 
    NSString *dbPath = [[NSUserDefaults standardUserDefaults] objectForKey:kDBPath]; 
    sqlite3_stmt *statement = NULL; 
    sqlite3 *database; 
    if (sqlite3_open((char *)[dbPath UTF8String], &database) == SQLITE_OK) { 
     if (sqlite3_prepare_v2(database, aQuery, -1, &statement, NULL) != SQLITE_OK) { 
      //Here is the point: on iPad Mini and iPhone it works fine, but on the normal iPad it can't execute this query 
      NSLog(@"Error on SQL - (sqlite3_stmt *)executeWithReturn:(char *)aQuery"); 
      statement = NULL; 
     } 
    } else { 
     NSLog(@"Error on Open database"); 
    } 
    return statement; 
} 

打印:

(lldb) print (BOOL)[[NSFileManager defaultManager] isWritableFileAtPath:dbPath] 
(BOOL) $0 = YES 
(lldb) print (char *)aQuery 
(char *) $1 = 0x1f0a1000 "select CodAplicacao, CodLocalidade, Nome, Desc, DataCriacao, Editando from Aplicacao_en" 

任何想法?

問候!

編輯:

它越來越錯誤 「數據庫磁盤映像格式有誤」。我無法在互聯網上找到如何解決這個問題。

+0

請參閱修改後的答案「數據庫磁盤映像格式不正確」。 – Rob 2013-04-12 00:29:04

回答

2

在您修改的問題中,您通知我們sqlite3_errmsg報告「數據庫磁盤映像格式錯誤」。這表示您的數據庫已損壞。如果您的應用在某個之前的某個日期執行某些數據庫操作時崩潰,則可能發生這種情況

您可以通過運行以下SQL證實了這一點:

PRAGMA integrity_check; 

如果你想通過這個過程,你可以將數據庫從備份設備複製到您的Mac(使用Xcode的組織者,並轉到「設備」部分),然後使用您選擇的Mac SQLite數據庫工具(最壞的情況下,命令行sqlite3程序),然後運行先前的PRAGMA命令。你甚至可以以編程方式執行它(它返回一個結果集,如SELECT語句)。

事情是,我們相當確信它會報告問題。簡單的解決方法是重建數據庫(例如,刪除數據庫,如果您最初是從軟件包中複製數據庫,請重新執行該操作,如果以編程方式創建它,請重複該過程)。

如果您決定嘗試從數據庫中恢復用戶數據,則可以考慮遵循Sergei Dorogin's technical blog - SQLiteException "database disk image is malformed"中概述的過程。他爲不同的平臺編寫了這個平臺,但基本過程可能適用於此。事情是,除非你絕對需要恢復用戶數據,否則這個過程可能是不必要的。

因此,簡而言之,您設備上的數據庫已損壞,您需要重新構建它。只需刪除應用程序(如果您的數據庫位於Documents文件夾中,則需要刪除應用程序以清空該文件夾)並重新安裝該應用程序,您應該很好。


從更改日誌中的語句:

NSLog(@"Error on SQL - (sqlite3_stmt *)executeWithReturn:(char *)aQuery"); 

NSLog(@"Error on SQL - %s: %s", __FUNCTION__, sqlite3_errmsg(database)); 

這應該給你,告訴你什麼是錯的錯誤提示信息。

通常,這些問題是由特定設備上的數據庫版本引起的。這與設備本身無關。

也許你的應用程序在某個時候創建​​了一個空白數據庫,因此沒有找到該表。如果您使用Xcode的Organizer,請轉到「設備」部分,然後您可以將應用程序文件夾複製到Mac,然後檢查Mac上的數據庫並查看您是否確認數據庫與預期的一致。

+0

好,它幫助我找到究竟是什麼錯誤,但我仍然無法解決它 – Claudio 2013-04-11 19:53:00

+0

我之前完成了所說的,但根據PRAGMA integrity_check,我的數據庫沒問題。我做了一個coppy,但它不起作用 – Claudio 2013-04-12 19:45:34

+0

@Claudio - 引人入勝。你說你在那個數據庫上做了'PRAGMA integrity_check'(大概是'Documents'中的那個,可能不是你可能坐在捆綁包中的原始數據庫),但是當你執行你的應用程序執行的SQL時,你仍然得到這個「數據庫磁盤映像格式不正確」的錯誤?雖然我覺得很奇怪,但我認爲預測,重建數據庫(大概是通過刪除應用程序並重新開始)仍然適用。 – Rob 2013-04-12 21:20:14

相關問題