1

AppDelegateで、データベースのパスを取得しました。

NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentDirectory=[paths objectAtIndex:0];
self.sqlFile=[[NSString alloc]init];
self.sqlFile=[documentDirectory stringByAppendingPathComponent:@"AnimalData.sqlite"];

データベースから値を選択する必要があるビューコントローラーの1つで、次のコードを実行します。

NSString *trimString=[appDelegate.mainBreedSelected stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

NSString *selectSQL=[NSString stringWithFormat:@"select breed from AnimalsTable where mainBreed=\"%@\"",trimString];
sqlite3_stmt *selectStatement;
const char *select_stmt=[selectSQL UTF8String];
if (sqlite3_open([appDelegate.sqlFile UTF8String],&database)==SQLITE_OK)
{
    sqlite3_prepare_v2(database,select_stmt,-1,&selectStatement,NULL);
    if (sqlite3_step(selectStatement)==SQLITE_DONE)
    {
        while(sqlite3_step(selectStatement) == SQLITE_ROW)
        {
            NSString *animalBreed = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectStatement, 2)];
            NSLog(@"Breed:%@",animalBreed);
        }
    }
    else
        NSAssert1(0, @"Error while deleting. '%s'", sqlite3_errmsg(database));
    sqlite3_finalize(selectStatement);
    sqlite3_close(database);
}
else
    NSLog(@"Database cannot be opened");

次のようなエラーが発生します:

*キャッチされなかった例外'NSInternalInconsistencyException'が原因でアプリを終了しています。理由:'選択中にエラーが発生しました。'不明なエラー''

この問題を解決するにはどうすればよいですか?

4

4 に答える 4

2
    select breed from AnimalsTable where mainBreed=\"%@\"",trimString

テーブルで1つの列を選択していますが、

    NSString *animalBreed = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectStatement, 2);

そこで3番目の列を取得したいので、以下のように2を0に変更します。

    NSString *animalBreed = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectStatement, 0);
于 2012-04-17T08:14:29.387 に答える
1

これを試して、データベースパスを確認してください:-

NSString *trimString=[appDelegate.mainBreedSelected stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

sqlite3 *database;

NSString *selectSQL=[NSString stringWithFormat:@"select breed from AnimalsTable where mainBreed ='%@'",trimString];
sqlite3_stmt *selectStatement;
if (sqlite3_open([appDelegate.sqlFile UTF8String],&database)==SQLITE_OK) 
   {
        sqlite3_prepare_v2(database,[selectSQL cStringUsingEncoding:NSUTF8StringEncoding],-1,&selectStatement,NULL);
        if (sqlite3_step(selectStatement)==SQLITE_DONE) 
            {
         while(sqlite3_step(selectStatement) == SQLITE_ROW) 
             {
            NSString *animalBreed = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectStatement, 0)];
            NSLog(@"Breed:%@",animalBreed);
             }
        }
        else
         NSAssert1(0, @"Error while deleting. '%s'", sqlite3_errmsg(database));
         sqlite3_finalize(selectStatement);
        sqlite3_close(database);
    }
    else
     NSLog(@"Database cannot be opened");

フェッチデータベースで列番号を確認してくださいsqlite3_column_text(selectStatement, 0)];

于 2012-04-17T08:24:07.940 に答える
1

すべきではない

sqlite3_prepare_v2(database,select_stmt,-1,&selectStatement,NULL);

そのはず

sqlite3_prepare_v2(database,[selectSQL UTF8String],-1,&selectStatement,NULL);
于 2012-04-17T08:21:38.300 に答える
1

コードを変更しました:

if (sqlite3_open([appDelegate.sqlFile UTF8String], &database) == SQLITE_OK) {
    NSLog(@"%@",appDelegate.sqlFile);
    NSString *trimString=[appDelegate.mainBreedSelected stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    NSString *select_sql=[NSString stringWithFormat:@"select breed from AnimalsTable where mainBreed='%@'",trimString];
    const char *sql = [select_sql UTF8String];
    sqlite3_stmt *selectstmt;
    if(sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL) == SQLITE_OK) {

        while(sqlite3_step(selectstmt) == SQLITE_ROW) {

            NSString *animalBreed = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 0)];
            NSLog(@"Breed:%@",animalBreed);
        }
    }
}
else
    sqlite3_close(database); 

そして、それは機能しています!ああ、助かった!!!

于 2012-04-17T09:44:49.117 に答える