2011-11-10 18 views
0

私はiPadアプリケーションを開発しています。
リソースフォルダにSQLiteデータベースがあります。
私のアプリケーションが起動すると、これらのコードはデータベースをNSDocumentDirectoryにコピーします。SQLiteデータベースから値を取得できません

- (void) copyDatabaseIfNeeded { 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSError *error; 
    NSString *dbPath = [self getDBPath]; 
    BOOL success = [fileManager fileExistsAtPath:dbPath]; 

    if(!success) { 

    NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Mydata.sqlite"]; 
    success = [fileManager copyItemAtPath:defaultDBPath toPath:dbPath error:&error]; 

    if (!success) 
     NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]); 
    } 
} 

- (NSString *) getDBPath { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES); 
    NSString *documentsDir = [paths objectAtIndex:0]; 
    return [documentsDir stringByAppendingPathComponent:@"Mydata.sqlite"]; 
} 

私のアプリケーションの別の見解では、データベースを開き、いくつかの値を取得するこれらのコードがあります。

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDir = [paths objectAtIndex:0]; 
if(sqlite3_open([[documentsDir stringByAppendingPathComponent:@"Mydata.sqlite"] UTF8String], &db) != SQLITE_OK){ 
    sqlite3_close(db); 
    NSAssert(0, @"Failed to open database."); 
} 
NSString *sql = [[NSString alloc] initWithFormat:@"SELECT HOMEONE, HOMETWO, HOMETHREE, HOMEFOUR FROM STUDENTS WHERE NAME='%@'",Name]; 
sqlite3_stmt *statement; 
if(sqlite3_prepare_v2(db, [sql UTF8String], -1, &statement, nil)== SQLITE_OK) 
{ 
    while(sqlite3_step(statement) == SQLITE_ROW){ 
     char *one = (char *) sqlite3_column_text(statement,0); 
     ActionOne = [[NSString alloc] initWithUTF8String:one]; 
     char *two = (char *) sqlite3_column_text(statement,1); 
     ActionTwo = [[NSString alloc] initWithUTF8String:two]; 
     char *three = (char *) sqlite3_column_text(statement,2); 
     ActionThree = [[NSString alloc] initWithUTF8String:three]; 
     char *four = (char *) sqlite3_column_text(statement,3); 
     ActionFour = [[NSString alloc] initWithUTF8String:four]; 
    } 
    sqlite3_finalize(statement); 
} 

はい、これらのコードでは、データベースから値を取得できます。
しかし、今私は私のコードを編集するために、より多くの値を取得する必要があります。

NSString *sql = [[NSString alloc] initWithFormat:@"SELECT HOMEONE, HOMETWO, HOMETHREE, HOMEFOUR, VOICEONE, VOICETWO, VOICETHREE, VOICEFOUR FROM STUDENTS WHERE NAME='%@'",Name]; 
sqlite3_stmt *statement; 
if(sqlite3_prepare_v2(db, [sql UTF8String], -1, &statement, nil)== SQLITE_OK) 
{ 
    while(sqlite3_step(statement) == SQLITE_ROW){ 
     char *one = (char *) sqlite3_column_text(statement,0); 
     ActionOne = [[NSString alloc] initWithUTF8String:one]; 
     char *two = (char *) sqlite3_column_text(statement,1); 
     ActionTwo = [[NSString alloc] initWithUTF8String:two]; 
     char *three = (char *) sqlite3_column_text(statement,2); 
     ActionThree = [[NSString alloc] initWithUTF8String:three]; 
     char *four = (char *) sqlite3_column_text(statement,3); 
     ActionFour = [[NSString alloc] initWithUTF8String:four]; 

     char *vone = (char *) sqlite3_column_text(statement,4); 
     VoiceOne = [[NSString alloc] initWithUTF8String:vone]; 
     char *vtwo = (char *) sqlite3_column_text(statement,5); 
     VoiceTwo = [[NSString alloc] initWithUTF8String:vtwo]; 
     char *vthree = (char *) sqlite3_column_text(statement,6); 
     VoiceThree = [[NSString alloc] initWithUTF8String:vthree]; 
     char *vfour = (char *) sqlite3_column_text(statement,7); 
     VoiceFour = [[NSString alloc] initWithUTF8String:vfour]; 
    } 
    sqlite3_finalize(statement); 
} 

ここでも、HOMEONE、HOMETWO、HOMETHREE、HOMEFOURの値は取得されません。 私はVOICEONE、VOICETWO、VOICETHREE、VOICEFOURの値だけを取得するためにSQL文を変更しようとしましたが、それはまた私に何の値も与えません。

は、私はいくつかのチェックを行なったし、アプリケーションもこの行にステップインしていないことが判明:

if(sqlite3_prepare_v2(db, [sql UTF8String], -1, &statement, nil)== SQLITE_OK) 

成功していないsqlite3_prepare_v2を意味しますか? データベースのフィールドタイプを確認しました。
'SQLite Database Browser'でSQL文を実行しようとしましたが、値を返すことができました。

私のコードの問題は分かりますか?

+0

コードに大きな問題はないと思います。以下のフィールドのスペルをデータベースで確認してください。 ボイスン、ボイスケート、音声通話、ボイスケア – objectivecdeveloper

答えて

1

この問題は、データベースを変更して新しいものをコピーし、シミュレータまたはデバイスからアプリケーションを削除してプロジェクトを実行しようとしたのを忘れたために発生することがあります。私はあなたがシミュレータでそれを実行している場合は、plzデータベースパスをコピーし、SQLiteデータベースブラウザでこのパスから開き、あなたのSQL文をここで実行しようとすると、あなたはそれもここで実行されていないことがわかります。新しいデータベースをプロジェクトにコピーする場合は、シミュレータまたはデバイスからアプリを削除してください。

+0

ありがとうございました!これは私の問題を解決しました! – Lloydworth

関連する問題