我在以下代码中遇到此异常。我认为这是因为我没有定义两个传入的参数类型。他们是当地的;那么如何定义它们(以及在哪里)。
错误: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) {
}
答案 0 :(得分:1)
[SQLiteDB addRecordToDatabase: symbol.data: symbol.typeName];
假设addRecordToDabase::
是一个类方法,而不是实例方法。
此外,这是一个方法的可怕名称。尝试类似:
- (void)addRecordWithData:(NSData*)aData andType:(NSString*)aType;
也就是说,应该避免裸:你应该总是指定参数的类型(而不是像你在这里那样回退到id
。)
最后,您为什么不使用Core Data,或者至少使用FMDB?原始的SQLite浪费时间。
SQLite很可能比Core Data更难编写代码。如果您是两者的新手,Core Data可以为您提供更好的投资回报。
在任何情况下,评论中的问题都表明您确实需要从了解Objective-C开始。 Apple提供了excellent language guide。
答案 1 :(得分:1)
错误:2011-04-27 11:18:03.226 PointPeek [174:707] *终止应用 由于未被捕获的例外 'NSInvalidArgumentException',原因: '+ [SQLiteDB addRecordToDatabase ::]: 无法识别的选择器发送到类 0x1fe70'
基本上,“unrecognized selector sent to...
”消息意味着您试图告诉对象(或类)做一些它不知道该怎么做的事情。 (“selector”是方法的另一个名称。)
您将SQLiteDB
类的方法定义为实例方法:
- (void) addRecordToDatabase:data: typeName;
我们知道由于方法名称中的-
(请参阅Methods and Messaging和Class Interface)。在您收到的错误消息中,请注意它以+开头,这意味着您试图在SQLiteDB
类本身上调用方法,而不是在该类的实例上调用。
换句话说,您试图这样做:
[SQLiteDB addRecordToDatabase: symbol.data: symbol.typeName];
当你需要做这样的事情时:
SQLiteDB *db = [[[SQLiteDB alloc] init] autorelease]; // an instance
[db addRecordToDatabase: symbol.data: symbol.typeName];
(请注意,之前的两行代码本身并不是很有用。大概是,不是在这个方法中创建SQLiteDB
的实例,而是将它作为实例变量)