1

これはばかげた問題に違いありませんが、クエリを機能させることができません。私のデータベースが空であるかのようです(私は二重にチェックしましたが、そうではありません)。単純なSELECT * FROM tableクエリです。これは私がそれを試す方法です:

+(MyDatabase *)database{
    if (database == nil) {
        database = [[MyDatabase alloc] init];
    }
    return database;
}
- (id)init
{
    self = [super init];
    if (self) {
        NSString *sqliteDb = [[NSBundle mainBundle] pathForResource:@"personsDB" ofType:@"sqlite3"];
        if (sqlite3_open([sqliteDb UTF8String], &database) != SQLITE_OK) {
            NSLog(@"Fail to open Database.");
        }
    }
    return self;
}

-(NSArray *)getAllRows{
    NSMutableArray *retArray =  [[NSMutableArray alloc] init];
    NSString *query = @"SELECT * FROM persons";

    sqlite3_stmt *statement;
    NSLog(@"checking SQLITE_OK?");
    if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) == SQLITE_OK) {
        NSLog(@"SQLITE_OK");
        while (sqlite3_step(statement) == SQLITE_ROW) {
            int personID = sqlite3_column_int(statement, 0);
            char *personChars = (char *) sqlite3_column_text(statement, 1);
            int gender = sqlite3_column_int(statement, 2);
            int related = sqlite3_column_int(statement, 3);

            NSString *person = [[NSString alloc] initWithUTF8String:personChars];
            MyDBInfo *info = [[MyDBInfo alloc] initWithpersonID:personID person:person gender:gender related:related ];

            [retArray addObject:info];
        }
        sqlite3_finalize(statement);
    }
    return retArray;
}

これはすべて興味深いものだと思います。

私のログには が表示されますchecking SQLITE_OK?が、いいえSQLITE_OK。私は得ていないFail to open Database.ので、そこはすべて良いと思います。

データベースがいっぱいで、 というテーブルがありますpersons。私はに非常に新しいsqliteですiOS apps

ありがとうございました。

4

1 に答える 1

3
  1. データベースがバンドルに含まれていますか? のデフォルトの動作sqlite3_openSQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATEであるため、デバイス/シミュレーターにまだ存在しない場合は作成されるため、 は表示されませんFail to open Databasesqlite3_open_v2したくない場合に使用しますSQLITE_OPEN_CREATE。とにかく、Xcode プロジェクトにファイルを追加したことがありますが、それらは自動的にバンドルに含まれません。プロジェクト ナビゲーターの上部でターゲットを選択し、ターゲットをクリックして、メイン パネルでターゲットを選択し、[ビルド フェーズ] を選択して、データベースが [バンドル リソースのコピー] に含まれているかどうかを確認します。

  2. おそらく無関係ですが、データベースをバンドルからドキュメントフォルダーに常にコピーします(まだ存在しない場合)。

  3. 期待どおりの SQLITE_OK を受信しない場合は、常にリターン コードを確認するか、エラー メッセージとエラー コードをログに記録します (これにより、問題のテーブルが見つからなかったことが報告される可能性があり、問題を特定することができます)。

したがって、

NSLog(@"%s db err '%s' (%1d)", __FUNCTION__, sqlite3_errmsg(contactDB), sqlite3_errcode(contactDB));
于 2012-06-26T23:39:09.000 に答える