私は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文を実行しようとしましたが、値を返すことができました。
私のコードの問題は分かりますか?
コードに大きな問題はないと思います。以下のフィールドのスペルをデータベースで確認してください。 ボイスン、ボイスケート、音声通話、ボイスケア – objectivecdeveloper