0

次のコードを使用して、テキストをデータベースに保存したいと考えています。しかし、私はそれを機能させることができません...通常、それはsmtをデータベースに保存する方法です...

-(void)saveToDB
{
NSFileManager *fileMgr = [NSFileManager defaultManager];
NSString *dbPath = [[[NSBundle mainBundle] resourcePath ]stringByAppendingPathComponent:@"datenbankSpeed"];
BOOL success = [fileMgr fileExistsAtPath:dbPath];
if(!success)
{
    NSLog(@"Cannot locate database file '%@'.", dbPath);
}
if(!(sqlite3_open([dbPath UTF8String], &db) == SQLITE_OK))
{
    NSLog(@"An error has occured: %s", sqlite3_errmsg(db));

}


if (sqlite3_open([dbPath UTF8String], &db) == SQLITE_OK)
{

    NSString *insertSQL = [NSString stringWithFormat:@"INSERT INTO DATEN(typ, date, download, upload, ping, comment) VALUES (\"%@\", \"%@\", \"%@\",\"%@\", \"%@\",\"%@\")", @"1", @"24.09.2012", topDownloadLabel.text, topUploadLabel.text, pingLabel.text, @"Comment"];

    const char *insert_stmt = [insertSQL UTF8String];
    printf("%s\n", insert_stmt);
    NSLog(@"%@", [NSString stringWithUTF8String:insert_stmt]);

    if (sqlite3_prepare_v2(db, insert_stmt, -1, &sqlStatement, NULL) == SQLITE_OK)
    {
        if (sqlite3_step(sqlStatement) == SQLITE_DONE)
        {
            UIAlertView *didFailWithErrorMessage = [[UIAlertView alloc] initWithTitle: @"NSURLConnection " message: @"All good"  delegate: self cancelButtonTitle: @"Ok" otherButtonTitles: nil];
            [didFailWithErrorMessage show];
            [didFailWithErrorMessage release];
        }
        else
        {
            UIAlertView *didFailWithErrorMessage = [[UIAlertView alloc] initWithTitle: @"NSURLConnection " message: @"nada"  delegate: self cancelButtonTitle: @"Ok" otherButtonTitles: nil];
            [didFailWithErrorMessage show];
            [didFailWithErrorMessage release];
        }

    }
            sqlite3_finalize(sqlStatement);
    sqlite3_close(db);
}
}

しかし、何らかの理由でシミュレータでしか機能しません! しかし、私の電話では機能しません...常にELSEに入ります:

if (sqlite3_step(sqlStatement) == SQLITE_DONE)
4

4 に答える 4

1

問題を見つけることができませんが、いくつかの提案があります。

これが主な問題かどうかはわかりませんが、バンドル内でデータベースを正しく変更しているようです。これは残念です。たとえば、更新をリリースすると、バンドルは消去/置き換えられます。

アプリを起動したら、ドキュメント ディレクトリでデータベースを探す必要があります。そこにない場合は (初めて起動するわけではありません)、既定のデータベースをバンドルから docs ディレクトリにコピーします。

コード:

- (void)applicationDidFinishLaunching:(UIApplication *)application {

    [self copyDatabaseIfNeeded];

    // Configure and show the window
    [window addSubview:[navigationController view]];
    [window makeKeyAndVisible];
}

- (void) copyDatabaseIfNeeded {

    //Using NSFileManager we can perform many file system operations.
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;
    NSString *dbPath = [self getDBPath];
    BOOL success = [fileManager fileExistsAtPath:dbPath]; 

    if(!success) {

        NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@\"datenbankSpeed.sqlite\"];
        success = [fileManager copyItemAtPath:defaultDBPath toPath:dbPath error:&error];
        NSLog(@\"Database file copied from bundle to %@\", dbPath);

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

        NSLog(@\"Database file found at path %@\", dbPath);

    }
}

デバイスは大文字と小文字を区別します。iPhone端末のお手入れの際の紐のケース

例 "database.sqlite" と "DataBase.sqlite" は、デバイスの場合は別のファイルですが、シミュレーターの場合は同じファイルです。そのため、クエリまたはコード文字列のケースを確認してください。

また、insertSQL をコンソールに記録し、コンソールからコピーして Bundle sqlite ファイルを開き、execute セクションを使用してクエリを実行することもできます。何が起こっているか見てください:)

于 2012-09-24T13:33:24.273 に答える
0

メイン バンドルはデバイス上で読み取り専用です。データベース ファイルをドキュメント ディレクトリまたは書き込み可能な別の場所に移動してみてください。

于 2012-09-24T13:33:57.890 に答える
0

データベースをドキュメント ディレクトリに移動して、OK を取得しました。みんなありがとう...

于 2012-09-25T09:50:59.490 に答える
0

このようにしてみてください

  sqlite3_stmt *stmt;

            int x;
            char *update = "insert into meetingPhoneAlarm values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);";
            x = sqlite3_prepare_v2(database, update, -1, &stmt, nil);
            NSLog(@"x=%d",x);


            if (x == SQLITE_OK) 
            { 
                sqlite3_bind_text(stmt, 1, NULL,-1, NULL);  
                sqlite3_bind_text(stmt, 2, [txt_subject.text UTF8String],-1, NULL);
                sqlite3_bind_text(stmt, 3, [txt_location.text UTF8String],-1, NULL);
                sqlite3_bind_text(stmt, 4, [txt_meetwith.text UTF8String],-1, NULL);
                sqlite3_bind_text(stmt, 5, [btn_partyDate.titleLabel.text UTF8String],-1, NULL);
                sqlite3_bind_text(stmt, 6, [btn_partyTime.titleLabel.text UTF8String],-1, NULL);
                sqlite3_bind_text(stmt, 7, [txt_notes.text UTF8String],-1, NULL);
                sqlite3_bind_text(stmt, 8, [btn_snooze.titleLabel.text UTF8String],-1, NULL);
                sqlite3_bind_text(stmt, 9, [string_ascending UTF8String],-1, NULL);
                sqlite3_bind_text(stmt, 10, [string_volume UTF8String],-1, NULL);
                sqlite3_bind_text(stmt, 11, [string_alarmsound UTF8String],-1, NULL);
                sqlite3_bind_text(stmt, 12,[btn_alarmDate.titleLabel.text UTF8String],-1, NULL);
                sqlite3_bind_text(stmt, 13,[btn_AMPM.titleLabel.text UTF8String],-1, NULL);
                sqlite3_bind_text(stmt, 14,[string_vibration UTF8String],-1, NULL);
                sqlite3_bind_text(stmt, 15,[string_repeatOption UTF8String],-1, NULL);

            }       
            if (sqlite3_step(stmt) != SQLITE_DONE){}
            //  NSLog(@"Error: %@",errorMsg); 
            sqlite3_finalize(stmt);
于 2012-09-24T13:54:59.807 に答える