2011-03-08 59 views
1

我正在努力與Objective-C ...似乎無法得到它與C#之間的差異......無論如何,我有以下代碼,這是給我一個構建錯誤Objective-C:不兼容的指針類型錯誤

NSString* databasePath = @"some string"; 

if (sqlite3_open(databasePath, &db) == SQLITE_OK) { 
} 

sqlite3_open線,我得到以下編譯器錯誤:

Passing Argument 1 of 'sqlite_open' from incompatible pointer type

回答

0

除了鏈接器錯誤(您需要根據@JeremyP提供的答案將libsqlite3.dylib添加到您的項目中),sqlite3_open命令需要一個恆定的字符指針,您可以從NSString創建該指針你有如下:

// Get the path to the database file 
    NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentPath = [searchPaths objectAtIndex:0]; 
    NSString *databasePath = [documentPath stringByAppendingPathComponent:@"ppcipher.s3db"]; 

    // Open the database file 
    const char *cDatabasePath = [databasePath cStringUsingEncoding:NSUTF8StringEncoding]; 
    sqlite3_open(cDatabasePath, &database); 

如果你看看SQLite documentation,你通常可以看到預期的。例如:

int sqlite3_open(
    const char *filename, /* Database filename (UTF-8) */ 
    sqlite3 **ppDb   /* OUT: SQLite db handle */ 
); 
+0

實際上,我的答案的第一行有一個輕微的錯字。它是libsqlite3.dylib – JeremyP 2011-03-09 10:52:50

+0

@JeremyP感謝您的支持。我相應地更新了我的答案。 :-) – 2011-03-09 12:56:52

1

SQLite是一個C庫,而不是一個Objective-C庫。它不知道NSString *(第一個參數)。它期望char *(或類似的東西)。

用途:

[databasePath UTF8String] 

,以將其轉換參數。

2

它試圖告訴您,您沒有將libsqlite3.dylib鏈接到您的應用程序中。你需要做的是:

  • 選擇目標爲您的應用
  • 右鍵單擊它並選擇「獲取信息」中的「鏈接庫」的第一個選項卡的窗格
  • ,找到的MacOS X圖書館libsqlite3.dylib並將其添加到您的項目。

哦,是的,正如其他人所說,你需要傳遞一個C字符串到函數調用,而不是NSString。最簡單的方法是使用NSString-UTF8String方法。

+0

+1錯過了這一點,直接跳到警告。壞我。 :-) – 2011-03-08 16:35:30

0

這是鏈接器階段,其中解析了編譯階段生成的所有符號。在你的情況下,無法找到sqlite_open函數。你有沒有包含所有合適的庫和框架?

+0

Josh:不能使用FMDB,因爲我在嘗試使用SQLCipher。 JeremyP:說明中沒有任何「佈線」它的應用程序,說什麼有關.dylib Lou Franco:按照您的建議進行了更改......現在我明白了這一點(請參閱:http:// imgur的.com/M04rQ) – SpokaneDude 2011-03-08 16:47:15