NSInvalidArgumentException ... как правильно определить аргументы? - PullRequest
0 голосов
/ 27 апреля 2011

Я получаю это исключение в следующем коде. Я думаю, это потому, что я не определил два типа входящих параметров. Они местные; так как мне их определить (и где).

Ошибка: 2011-04-27 11: 18: 03.226 PointPeek [174: 707] * Завершение приложения из-за неисследованного исключения NSInvalidArgumentException, причина: '+ [SQLiteDB addRecordToDatabase ::]: нераспознанный селектор отправлен в класс 0x1fe70'

Вот вызывающая строка кода:

[SQLiteDB addRecordToDatabase: symbol.data: symbol.typeName];

и вот метод, который я вызываю:

- (void) addRecordToDatabase:data: typeName  {

    NSString *insertCommand = [NSString stringWithFormat:@"INSERT INTO CardData (CARD_ID, CARD_NAME, CODE_VAL) VALUES ('/%@', '/%@', '/%@')", data, @"Test Card", typeName];
    if(sqlite3_open_v2(cDatabasePath, &db, SQLITE_OPEN_READWRITE, NULL) == SQLITE_OK) {


    }

Ответы [ 2 ]

1 голос
/ 28 апреля 2011

Ошибка: 2011-04-27 11: 18: 03.226 PointPeek [174: 707] * Завершение приложения из-за неисследованного исключения NSInvalidArgumentException, причина: '+ [SQLiteDB addRecordToDatabase ::]: нераспознанный селектор отправлен в класс 0x1fe70'

По сути, сообщение "unrecognized selector sent to..." означает, что вы пытались сказать объекту (или классу) сделать что-то, что он не знает, как сделать. («селектор» - это другое название метода).

Вы определили свой метод класса SQLiteDB как экземпляр метод:

- (void) addRecordToDatabase:data: typeName;

Мы знаем, что из-за - в имени метода (см. Методы и сообщения и Интерфейс класса ). В полученном вами сообщении об ошибке обратите внимание, что оно начинается с +, что означает, что вы пытались вызвать метод для самого класса SQLiteDB, а не для экземпляра этого класса.

Другими словами, вы пытались сделать это:

[SQLiteDB addRecordToDatabase: symbol.data: symbol.typeName];

когда вам нужно было сделать что-то вроде этого:

SQLiteDB *db = [[[SQLiteDB alloc] init] autorelease]; // an instance
[db addRecordToDatabase: symbol.data: symbol.typeName];

(Обратите внимание, что предыдущие 2 строки кода не так уж и полезны сами по себе. Предположительно, вместо создания экземпляра SQLiteDB в этом методе вы будете иметь его в качестве переменной экземпляра).

1 голос
/ 27 апреля 2011

[SQLiteDB addRecordToDatabase: symbol.data: symbol.typeName];

Это предполагает, что addRecordToDabase:: - это метод класса, а не метод экземпляра.

Кроме того, это ужасное имя для метода. Попробуйте что-то вроде:

- (void)addRecordWithData:(NSData*)aData andType:(NSString*)aType;

То есть следует избегать использования bare: s, и вы всегда должны указывать тип параметра (а не возвращаться к id, как здесь)

Наконец, почему вы не используете Core Data или, по крайней мере, FMDB? Необработанный SQLite - пустая трата времени.

<Ч />

Скорее всего, для SQLite писать код сложнее, чем для Core Data. Если вы новичок в обоих направлениях, Core Data - это лучший возврат вложенных средств вашего времени.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...