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 ブロックの外側) が必要です (そして、いつそれにアクセスしているのか、いつクラス メソッドにアクセスしているのかを明確にするために、アンダースコアで始まる名前を付けることをお勧めします。つまり、基本的には、変数の代わりにクラスオブジェクトを渡しているため、失敗している呼び出しが発生する可能性があります.静的変数を適切に設定したら.

「クラス変数」(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;
}
于 2012-08-20T04:04:24.227 に答える