我在查找错误时遇到问题。代码通过ID(init)好了,我知道数据库正在加载。我的问题是IF(sqlite3_prepare_v2 ...)语句。当我运行代码时,这一行不会== SQLITE_OK,它会跳到最后。非常感谢。感谢。
@implementation CityState
static CityState *WDdatabase;
+(CityState *)WDdatabase {
if(WDdatabase == nil) {
WDdatabase = [[CityState alloc] init];
}
return WDdatabase;
}
- (id)init {
self = [super init];
if (self) {
NSString *sqliteDB = [[NSBundle mainBundle] pathForResource:@"CityAndState" ofType:@"sqlite"];
if(sqlite3_open([sqliteDB UTF8String], &WDdatebase) != SQLITE_OK){
NSLog(@"Failed to open database");
}
}
return self;
}
-(NSArray *)getAllCities {
NSMutableArray *returnArray = [[NSMutableArray alloc] init];
NSString *query = @"SELECT * FROM Test_Table";
sqlite3_stmt *statement;
if(sqlite3_prepare_v2(WDdatebase, [query UTF8String], -1, &statement, NULL) == SQLITE_OK) {
while (sqlite3_step(statement) == SQLITE_ROW) {
}
sqlite3_finalize(statement);
}
return returnArray;
}
答案 0 :(得分:0)
据我所知,Objective-C不会像您尝试的那样执行静态类变量,并且符号WDatabase
(我假设拼写错误就在这里,而不是在您的代码中)是实际上是一个类标识符而不是静态变量。要实现单例,你需要一个文件范围变量(在@implementation块之外)(我建议你从下划线开始命名,以便在访问它时和访问类方法时澄清。所以基本上,你失败的调用很可能是因为你传递了一个类对象而不是你的var。一旦你正确设置了静态var。
然后用于访问“类变量”(最终只是一个文件范围/静态存储的变量,凭借Objective-C的C灵魂)的正确语法是向类对象发送消息:
sqlite3_prepare_v2([CityState wDdatebase], [query UTF8String], ...
此外,只是为了迂腐;如果您没有使用任何NSString的功能并且只需要UTF8(或“C风格”)字符串,您可以像在C中一样使用它们:
-(NSArray *)getAllCities {
NSMutableArray *returnArray = [[NSMutableArray alloc] init];
char query[] = "SELECT * FROM Test_Table";
sqlite3_stmt *statement;
if(sqlite3_prepare_v2([CityState wDdatebase], query, -1, &statement, NULL) == SQLITE_OK) {
while (sqlite3_step(statement) == SQLITE_ROW) {
}
sqlite3_finalize(statement);
}
return returnArray;
}