2011-03-08 100 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