找不到SQLITE语句调用的错误



我在查找错误时遇到问题。代码顺利通过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;
}

据我所知,Objective-C不会像您尝试的那样做静态类变量,符号WDatabase(我假设拼写错误只是在SO上,而不是在您的代码中)实际上是一个类标识符,而不是您的静态变量。要实现singleton,您需要一个文件作用域变量(在@implementation块之外)(我建议您以下划线开头命名它,以明确何时访问该变量以及何时访问class方法。因此,基本上,您失败的调用可能是因为您传递的是class对象而不是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;
}

最新更新