2011-04-27 51 views
0

我在下面的代码中得到这个异常。我想这是因为我没有定义两个传入的参数类型。他们是本地的;所以我如何定义它们(以及在哪里)。NSInvalidArgumentException ...如何正确定义参数?

Error: 2011-04-27 11:18:03.226 PointPeek[174:707] * Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[SQLiteDB addRecordToDatabase::]: unrecognized selector sent to class 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) { 


    } 

回答

1

Error: 2011-04-27 11:18:03.226 PointPeek[174:707] * Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[SQLiteDB addRecordToDatabase::]: unrecognized selector sent to class 0x1fe70'

基本上,“unrecognized selector sent to...”消息意味着你试图告诉一个对象(或类)做一些事情,它不知道该怎么办。 (“选择器”是方法的另一个名称)。

您已定义的类SQLiteDB方法为实例方法:

- (void) addRecordToDatabase:data: typeName; 

我们知道,因为在方法名-(见Methods and MessagingClass Interface)。在出现的错误消息中,请注意它以+开头,这意味着您试图在SQLiteDB类本身上调用方法,而不是在该类的实例上。

换句话说,你试图做到这一点:

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

,当你需要做这样的事情:

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

(请注意,前两行代码是不是所有的它们本身是有用的。假定,不是在这个方法中创建一个SQLiteDB的实例,而是将它作为一个实例变量)。

+0

啊......现在对我来说非常有意义......非常感谢你!我真的很感激它! :d – SpokaneDude 2011-04-27 20:23:32

1

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

那会假设addRecordToDabase::是类方法,而不是实例方法。

此外,这是一个方法可怕的名字。尝试是这样的:

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

也就是说,裸:■要避免,你应该始终指定参数的类型(和你在这里做回退到id)。

最后,为什么你不使用核心数据,或者至少是FMDB?原始SQLite是浪费时间。


很可能SQLite比Core Data更难编写代码。如果你对这两者都是新手,核心数据是你的时间投资更好的回报。

在任何情况下,您评论中的问题都表明您确实需要从理解Objective-C开始。 Apple提供了一个excellent language guide

+0

所以我现在很困惑......什么是“电话”(或消息)应该看起来像?而且,“和类型”是什么? (有没有一个文件,你可以指示我如何构建消息和方法?) 另外,我没有使用CoreData,因为我是一个新手,需要学习如何在Obj-C中编码,需要知道FMite的工作原理以及我读过的内容,FMDB不适用于XC4。我不想XC4(这是另一个故事)的麻烦现在...需要得到这个工作... – SpokaneDude 2011-04-27 19:48:27

+0

顺便说一句:FMDB工作正常与Xcode 4. – bbum 2011-04-27 19:57:52

+0

我认为你击中了头!我不太了解Obj-C那么好......我对C#,C,C++非常熟悉,而且我正在一个人的时间让我的思绪围绕着Obj-C。学习CoreData和/或FMDB(同时阅读)不会解决我不知道Obj-C的问题。与此同时,我有这个应用程序“鞭打”,并正在努力,如你所见。 谢谢你的帮助...我会继续卡车'... D – SpokaneDude 2011-04-27 20:03:32