-1

SqlManager を使用して sqlite で単純なデータベースを作成した後、単純な xcode プロジェクトのリソースにファイル (Person.sqlite) をコピーし、このコードを使用してデータベースにアクセスしましたが、データベースが読み込まれないようです。init の関数 sqlite3_open は 0 (すべて OK) を返しますが、getAllPersons の sqlite3_prepare は、データベース内にあるテーブル "Persona" をデータベースで見つけることができないという結果を返すため、実際のデータベースにアクセスできないという問題があると考えています。おそらくオープンで、データベースが見つからないため、新しい空のデータベースを作成します...では、なぜこれが起こるのでしょうか? データベースのパスを指定する方法が正しくありませんか? ([[NSBundle mainBundle] pathForResource:@"Person" ofType:@"sqlite"];) 本当に、パス (sqliteDb) を定義する変数の nslog は null を返しますが、このパスを呼び出す他の方法をいくつか試しましたが、すべて違う。

- (id)init
{
    self = [super init];
    if (self) {
        NSString *sqlLiteDb = [[NSBundle mainBundle] pathForResource:@"Persone" ofType:@"sqlite"];
        NSLog(@"Path db: %@",sqlLiteDb);
        if(sqlite3_open([sqlLiteDb UTF8String], &database) != SQLITE_OK){
            NSLog(@"Failed to open database");
        }else {
            NSLog(@"Database opened");
        }
    }

    return self;
}

- (NSArray *) getAllPersons{
    NSMutableArray *returnArray=[[NSMutableArray alloc] init];
    NSString *query= @"SELECT Nome FROM Persona";    
    sqlite3_stmt *statement;
    NSLog(@"%d", sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, NULL));
    printf( "could not prepare statemnt: %s\n", sqlite3_errmsg(database) );


    if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, NULL) == SQLITE_OK){
        NSLog(@"kndvnspò");
       while (sqlite3_step(statement)==SQLITE_ROW) {
            int uniqueId = sqlite3_column_int(statement, 0);
            char *nomeChar =(char *) sqlite3_column_text(statement, 1);
            char *cognomeChar =(char *) sqlite3_column_text(statement, 2);
            NSString *nome= [[NSString alloc] initWithUTF8String:nomeChar];
            NSString *cognome= [[NSString alloc] initWithUTF8String:cognomeChar];

            PersonInfo *info= [[PersonInfo alloc] initWithUniqueId:uniqueId nome:nome cognome:cognome];
            [returnArray addObject:info];
        }
        sqlite3_finalize(statement);
    }
    return returnArray;

}

申し訳ありませんが、解決策は簡単だと思いますが、まだ xcode が好きではありません ^^ ありがとう!

更新: いいえ、それは常に「人」でした。2時間の失敗とこの質問の開始の後、私はついに考えました。 . ---' 何らかの理由で、プロジェクトにはクリーンアップのみが必要でした... とにかく、助けてくれてありがとう!


何らかの理由で更新で言ったように、プロジェクトにはクリーンアップのみが必要でした...

確かに準備を2回呼び出すのは良い考えではありません。申し訳ありませんが、私が投稿したコードは、テストのためだけに使用されたコードで汚れていました。開くとアクセス許可に問題がある可能性があることを知っておいてください。これを確認します! ご助力ありがとうございます!

4

1 に答える 1

0

sqlite は、DB ファイルへのアクセス許可が原因で open に失敗することが多く、ディレクトリ ファイル全体が配置されます。

于 2012-04-24T20:10:03.490 に答える