0

我在定位我的错误时遇到问题。代码可以通过 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;
}
4

1 回答 1

0

据我所知,Objective-C 不会像您尝试的那样执行静态类变量,并且符号WDatabase(我假设错字就在 SO 上,而不是在您的代码中)实际上是类标识符而不是您的静态多变的。要实现单例,您将需要一个文件范围变量(在 @implementation 块之外)(我建议您以下划线开头来说明您何时访问它以及何时访问类方法。所以基本上, 你失败的调用很可能是因为你传递的是一个类对象而不是你的 var。一旦你正确设置了静态 var。

访问“类变量”(由于Objective-C的C灵魂,最终只是一个文件范围/静态存储的变量)的正确语法是向类对象发送一条消息:

sqlite3_prepare_v2([CityState wDdatebase], [query UTF8String], ...

此外,只是为了迂腐;如果你没有使用 NSString 的任何特性并且只需要 UTF8(或“C-style”)字符串,你可以像在 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;
}
于 2012-08-20T04:04:24.227 回答