使用SQLITE语句调用无法找到错误

时间:2012-08-20 03:49:18

标签: xcode 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;
}

1 个答案:

答案 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;
}