Objective-C: несовместимая ошибка типа указателя - PullRequest
1 голос
/ 08 марта 2011

Я борюсь с Objective-C ... не могу понять разницу между ним и C # ... в любом случае, у меня есть следующий код, который дает мне ошибку сборки

NSString* databasePath = @"some string";

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

В строке sqlite3_open я получаю следующую ошибку компилятора:

Передача аргумента 1 'sqlite_open' из несовместимого типа указателя

Ответы [ 5 ]

2 голосов
/ 08 марта 2011

Он пытается сказать вам, что вы не связываете libsqlite3.dylib с вашим приложением.Что вам нужно сделать, это:

  • выберите цель для вашего приложения
  • щелкните ее правой кнопкой мыши и выберите «получить информацию»
  • на панели «Связанные библиотеки»На первой вкладке найдите MacOS X librarly libsqlite3.dylib и добавьте его в свой проект.

О да, и, как уже говорили другие, вам нужно передать строку C в вызов функции,не NSString.Самый простой способ - использовать метод -UTF8String из NSString.

1 голос
/ 08 марта 2011

sqlite - это библиотека C, а не библиотека Objective-C.Он не знает о NSString * (1-й аргумент).Он ожидает char * (или что-то подобное).

Использование:

[databasePath UTF8String]

в качестве аргумента для его преобразования.

0 голосов
/ 08 марта 2011

Это этап компоновщика, где разрешаются все символы, сгенерированные на этапе компиляции. В вашем случае функция sqlite_open не может быть найдена. Вы включили все соответствующие библиотеки и фреймворки?

0 голосов
/ 08 марта 2011

Я бы использовал это вместо API SQLite.Это оболочка с именем FMDB, которая делает вещи НАМНОГО проще: https://github.com/ccgus/fmdb

0 голосов
/ 08 марта 2011

Помимо ошибки компоновщика (вам нужно добавить libsqlite3.dylib в ваш проект согласно ответу, предоставленному @JeremyP) в этом случае, команда 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 , вы можете в целом увидеть, что ожидается.Например:

int sqlite3_open(
  const char *filename,   /* Database filename (UTF-8) */
  sqlite3 **ppDb          /* OUT: SQLite db handle */
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...