1

SQLite3 DB に 3 つのデータを追加しようとしています。チュートリアルの助けを借りて、私はほとんどそこにいます。以下は私のコードです。

から期待されるものを受け取っていNSLogsます。問題なくDBを見つけ、問題なくDBに送信するステートメントをコンパイルしますが、アプリに到達するsqlite3_prepare_v2(database, sqlstatement, -1, &compliedstatement, NULL)==SQLITE_OKと、データがに追加されることを期待していますDBが、そうではなく、表示されることも期待していますaUIAlertViewユーザーに ERROR または SUCCESS を伝えます。私が見ていないものを見ていただければ幸いです。

- (IBAction)addData:(id)sender {
    NSString *n = [[NSString alloc] initWithString:[name text]];
    NSString *a = [[NSString alloc] initWithString:[age text]];
    NSString *c = [[NSString alloc] initWithString:[color text]];
    NSLog(@"%@ - %@ - %@",n,a,c);
    [self insertDataName:n Age:a Color:c];
}

これによりNSLog、期待どおりのテキスト プロパティが返されます。

- (IBAction)hide:(id)sender {
    [name resignFirstResponder];
    [age resignFirstResponder];
    [color resignFirstResponder];

}



- (void)viewDidLoad
{
    [super viewDidLoad];
    DBName = @"mydatabase.sqlite";
    NSArray *documentsPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDir = [documentsPaths objectAtIndex:0];
    DBPath = [documentsDir stringByAppendingPathComponent:DBName];

}


-(void)checkAndCreateDB {
    BOOL Success;
    NSFileManager *fileManager = [NSFileManager defaultManager];
    Success = [fileManager fileExistsAtPath:DBPath];

    if(Success) {
        NSLog(@"DB Found");    
        return;
    }

    NSLog(@"DB Not Found");
    NSString *databasePathFromApp = [[[NSBundle mainBundle]resourcePath]stringByAppendingPathComponent:DBName];
    [fileManager copyItemAtPath:databasePathFromApp toPath:DBPath error:nil];

}

これNSLogは戻りますDB Found

-(void)insertData Name:(NSString*)n Age:(NSString*)a Color:(NSString*)c {
    [self checkAndCreateDB];
    sqlite3 *database;
    if (sqlite3_open([DBPath UTF8String],&database)==SQLITE_OK) {
        NSString *statement;
        sqlite3_stmt *compliedstatement;
        statement = [[NSString alloc] initWithFormat:@"insert into table1 values ('%@', '%@', '%@')",n,a,c];
        const char *sqlstatement = [statement UTF8String];
        NSLog(@"%@",statement);

        if (sqlite3_prepare_v2(database, sqlstatement, -1, &compliedstatement, NULL)==SQLITE_OK) {

        if (SQLITE_DONE!=sqlite3_step(compliedstatement)) {
            NSAssert1(0, @"Error by inserting '%s'", sqlite3_errmsg(database));
            UIAlertView *AlertOK = [[UIAlertView alloc] initWithTitle:@"Error!" message:@"Error by inserting" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];     

            [AlertOK show];

        }
        else {
            UIAlertView *AlertOK = [[UIAlertView alloc] initWithTitle:@"Success!" message:@"Data successfully inserted" delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];             
            [AlertOK show];
            }
        }
        sqlite3_finalize(compliedstatement);

    }
    sqlite3_close(database);

}

そして、NSLog上記の最後の表示insert into table1 values ('n', 'a', 'c')は、期待どおりに表示されます。

挿入時に何かがうまくいかず、それを理解できません。

参考までに、DB は SQLiteManager を使用して作成されました。以下SS:

SQLiteManager テーブル 1 SS

4

1 に答える 1

1

わかりました。シミュレーターまたは iDevice で作業していますか? iDevice では、外部 SQL データベースを作成することはできません (少なくとも私の知る限り)。サンドボックス化のため、動的に作成する必要があります。「参考までに、DBはSQLiteManagerを使用して作成されました。」それを確認してください。

それが問題でない場合は、コードを「準備...」から「実行」に変更してみてください

から...

if (sqlite3_prepare_v2(database, sqlstatement, -1, &compliedstatement, NULL)==SQLITE_OK) {

    if (SQLITE_DONE!=sqlite3_step(compliedstatement)) {
        NSAssert1(0, @"Error by inserting '%s'", sqlite3_errmsg(database));
        UIAlertView *AlertOK = [[UIAlertView alloc] initWithTitle:@"Error!" message:@"Error by inserting" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];     

        [AlertOK show];

    }
    else {
        UIAlertView *AlertOK = [[UIAlertView alloc] initWithTitle:@"Success!" message:@"Data successfully inserted" delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];             
        [AlertOK show];
        }
    }
    sqlite3_finalize(compliedstatement);

に...

    sqlite3_exec(database, [sqlstatement UTF8String], NULL, NULL, &error);

これは非常に重要なので、「エラー」にログオンしてください。

UIAlert をポップしたい場合は、これを行います

 if (error !=nil)
    //show alert for error
 else
    //show alert for success
于 2012-01-30T13:58:33.273 に答える