2011-08-10 35 views
2

私はiPhoneのiOS 4でSQLiteを使用していますが、私の更新ステートメントによる変更は保存されません。最初はおそらくアプリケーションを終了すると、何とかデータベースを削除するかもしれないと思っていたが、それらは同じセッション中に保存されていない。私のデータベースを初期化するコード(FMDBを使用して)されていますSQLiteの変更が保存されない

-(SQLiteDal*) init { 
    pool = [[NSAutoreleasePool alloc] init]; 

    self = [super init]; 
    if(self != nil){ 
     // Setup some globals 
     NSString *databaseName = [self getDbPath]; 
     NSLog([NSString stringWithFormat:@"db path: %@", databaseName]); 
     db = (FMDatabase *)[FMDatabase databaseWithPath:databaseName]; 
     if (![db open]) { 
      NSLog(@"Could not open db."); 
      [pool release]; 
      return 0; 
     } 
    } 
    //[self checkAndCreateDatabase]; 
    return self; 
} 

#pragma mark DB Maintenance 
-(NSString *)getDbPath { 
    NSString *databaseName = @"myapp.db"; 

    // Get the path to the documents directory and append the databaseName 
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDir = [documentPaths objectAtIndex:0]; 
    databaseName = [documentsDir stringByAppendingPathComponent:databaseName]; 
    return databaseName;  
} 

これらのメソッドの両方が、その後、私は呼んでテーブルに挿入するためのデータベースを作成するために呼び出さ、以下のとおりです。

  [db executeQuery:@"INSERT INTO MyTable (Name, Description, Area, Price, ID) VALUES (?,?,?,?,?)", 
      f.Name, 
      f.description, 
      f.area, 
      f.price, 
      f.id]; 

問題私は、以下のステートメントを使用してMyTableからの読み取りに来るとき、私は戻って何かを得ることはありません、次のとおりです。

FMResultSet *rs = [db executeQuery:@"SELECT * FROM MyTable WHERE ID = ?", id]; 
    while ([rs next]) { 
     //.. this is never called 

限り、私は私が見ることができるように何も欠けていないと、DBは書き込み可能な場所にあるようです。

+0

uは、SQLiteのマネージャでウルデシベルを開いたn個挿入した後保存した記録をチェックしていますか? – booleanBoy

+0

いいえ、データベースは電話にあります。 – Echilon

+0

NSString stringWithFormatを使用してクエリをexecuteQueryメソッドに渡して.....またそれをUTF8Stringに変換してください...試してみてください – booleanBoy

答えて

5

私はあなたの間違いを持っ​​ています... を挿入している間に、あなたは更新を実行しないでください。また、beginTransactionを呼び出してコミットします。

はちょうどこの好きです。..

[_dbPointer beginTransaction]; 
BOOL isInserted = [_dbPointer executeUpdate:[NSString stringWithFormat:@"INSERT INTO MyTable (Name, Description, Area, Price, ID) VALUES(?,?,?,?,?);", f.Name, 
     f.description, 
     f.area, 
     f.price, 
     f.id]]; 
[_dbPointer commit]; 

希望はこれが..あなたを助ける

+0

Damnは 'executeUpdate'メソッドに気付かなかった。私はトランザクションを使用していないが、ありがとう。 – Echilon

+1

トランザクションを使用する必要があります。それはずっと速いです! sqliteのパフォーマンスに関する古い文書ですが、役に立つ情報もあります:http://www.sqlite.org/speed.html –

関連する問題