0

このコードを修正するのに何日も費やしましたが、あきらめました!! 私がやっていることは、ユーザーから入力を取得し、「保存」ボタンを押すとデータベースに挿入することです。このコードを実行し、「保存」ボタンを押した後。1-ビューから(別のタブに)終了できません。2-挿入が適用されませんでした!!

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDir = [paths objectAtIndex:0];
    NSString *dbPath = [documentsDir stringByAppendingPathComponent:@"CAMAClientDB2.sqlite"];
    sqlite3 *database;


    //Copy the database from the package to the usrrs filesystem
    if (sqlite3_open([dbPath UTF8String], &database)== SQLITE_OK) {//start if 
        NSLog(@"dataBaseOpen");
        const char *sqlStatement = "insert into Location (Latitude,Longitude,LocationName,Tag) VALUES (?,?,?,?)";
        // 
        sqlite3_stmt *compileStatement;

        if (sqlite3_prepare_v2(database, sqlStatement, -1, &compileStatement, NULL) == SQLITE_OK) { // start if 2
            if(SQLITE_DONE!=sqlite3_step(compileStatement))
            {
            sqlite3_bind_double(compileStatement, 1, [latitudeTextField.text doubleValue]);

            sqlite3_bind_double(compileStatement, 2, [longitudeTextField.text doubleValue]);

            sqlite3_bind_text( compileStatement, 3, [lName.text UTF8String], -1, SQLITE_TRANSIENT);

            sqlite3_bind_text(compileStatement, 4, [myText.text UTF8String] ,-1, SQLITE_TRANSIENT);
             NSLog( @" successfully done" );
            if(sqlite3_step(compileStatement) != SQLITE_DONE ) {
                NSLog( @" not done" );
            }  
            }

        }
    }

そして、ファイルマネージャーで対処するためのappDelegateコードを入れました:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDir = [paths objectAtIndex:0];

NSString *dbPath = [documentsDir stringByAppendingPathComponent:@"CAMAClientDB2.sqlite"];


NSFileManager *fileManager = [NSFileManager defaultManager];

BOOL success = [fileManager fileExistsAtPath:dbPath];

if (success) {

    NSLog(@"we have the database");

} else {

    NSLog(@"we have no database");

    NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"CAMAClientDB2.sqlite"];


    BOOL moved = [fileManager copyItemAtPath:defaultDBPath toPath:dbPath error:nil];

    if (moved) {
        NSLog(@"database copied");
    }



}

私は何か見落としてますか !!何が問題ですか !!

4

1 に答える 1

0

#2の問題について:1.余分なsqlite_step呼び出しがあります。シーケンスは次のようになります。

    sqlite3_prepare_v2()
            sqlite_bind_....
            sqlite_bind_....
            for as many bind's as you need, and then
            sqlite_step()
  1. sqlite_step がまだ失敗する場合は、リターン コードを確認し、ドキュメントでガイダンスを探してください。

  2. MacOS アプリケーションがサンドボックス化されている場合、これは機能しません。現在、sqlite データベースを単独で更新する方法はありません。sqlite ファイルがあるディレクトリのユーザー書き込み許可を取得するか、パッケージに入れる必要があります (これは事実上同じことです)。

于 2012-11-09T21:05:34.850 に答える