2011-08-10 96 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;  
} 

這些方法稱爲創建數據庫Both,然後插入到表我打電話:

  [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 

至於我可以看到我不丟失任何東西,而數據庫似乎處於可寫位置。

+0

具有u打開烏爾分貝sqlite的經理ñ檢查插入後保存的記錄? – booleanBoy

+0

不,數據庫在手機上。 – Echilon

+0

使用NSString stringWithFormat同時將查詢傳遞給executeQuery方法.....並且還將其轉換爲UTF8String ...只是試試 – booleanBoy

回答

5

我弄錯了你的錯誤... 插入你需要調用執行更新不執行查詢。另外,在插入r時調用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

該死的,甚至沒有注意到'executeUpdate'方法。雖然我沒有使用交易,但謝謝。 – Echilon

+1

您應該使用交易。速度要快得多!一個關於sqlite性能的舊文檔,也許你可以找到一些有用的信息:http://www.sqlite.org/speed.html –