2012-05-24 44 views
0

在我的「viewWillAppear中」回調後,我試圖來用SQLite數據庫的數據一個UITableViewController的用戶看到。的UITableViewController並不總是與實際的SQLite數據庫保持一致,直到重新啓動應用程序

但是,我注意到的是,如果我切換到另一個選項卡,將一行新數據提交到SQLite並切換回UITableViewController,它不會使用剛添加到數據庫的新行更新。我必須完全退出應用程序並導航回到UITableViewController才能看到在表視圖上反映的新行。

如何解決這個問題(即如何強制始終顯示的SQLite上的UITableViewController的最新信息來回切換一堆次後?)

將不勝感激所有/任何意見。

下面是代碼:

- (void)viewWillAppear:(BOOL)animated 
{ 
[super viewWillAppear:animated]; 
NSLog(@"viewwillappear"); 
//[[self tableView] reloadData]; 
int rc=-1; 
if (databasePath == nil) { 
    NSLog(@"database path is NIL. Trying to set it"); 
    databaseName = @"mymemories.sqlite"; 
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDir = [documentPaths objectAtIndex:0]; 
    databasePath = [documentsDir stringByAppendingPathComponent:databaseName]; 
    return; 
} 
rc = sqlite3_open([databasePath UTF8String], &database); 
if(rc == SQLITE_OK) { 
    memoriesArray = [[NSMutableArray alloc]init ]; 
    sqlite3_stmt *statement = nil; 


    NSString *fullQuery = @"SELECT * FROM memories"; 

    const char *sql = [fullQuery UTF8String]; 

    if(sqlite3_prepare_v2(database, sql, -1, &statement, NULL)!=SQLITE_OK) 
     NSAssert1(0, @"Error preparing statement '%s'", sqlite3_errmsg(database)); 
    else 
    { 
     while(sqlite3_step(statement) == SQLITE_ROW) 
     { 
      NSString *place= [NSString stringWithUTF8String:(const char*)sqlite3_column_text(statement, 4)]; 
      //[User setName:[NSString stringWithUTF8String:(const char*)sqlite3_column_text(statement, 1)]]; 
      //[User setAge:[NSString stringWithUTF8String:(const char*)sqlite3_column_text(statement, 2)]]; 

      [memoriesArray addObject:place]; 
      //[currentUser release]; 
     } 
    } 
    sqlite3_finalize(statement); 
    sqlite3_close(database); 
} 

}

而且萬一這是相關的,這裏要說的是承諾SQLite數據庫代碼:

NSData * blob = [NSData dataWithContentsOfURL:recordedTmpFile]; 
int rc=-1; 
rc = sqlite3_open([databasePath UTF8String], &database); 

if(rc == SQLITE_OK) { 
    sqlite3_exec(database, "BEGIN", 0, 0, 0); 


    NSLog(@"Connected To: %@",databasePath); 
    sqlite3_stmt *updStmt =nil; 
    const char *sql = "INSERT INTO memories (data,place) VALUES (?,?);"; 

    rc = sqlite3_prepare_v2(database, sql, -1, &updStmt, NULL); 

    if(rc!= SQLITE_OK) 
    { 
     NSLog(@"Error while creating update statement:%@", sqlite3_errmsg(database)); 
    } 
    sqlite3_bind_text(updStmt, 2, [[tags text] UTF8String], -1, SQLITE_TRANSIENT); 
    rc = sqlite3_bind_blob(updStmt, 1, [blob bytes], [blob length] , SQLITE_BLOB); 

    if((rc = sqlite3_step(updStmt)) != SQLITE_DONE) 
    { 
     NSLog(@"Error while updating: %@", sqlite3_errmsg(database)); 
     sqlite3_reset(updStmt); 
    } 

    sqlite3_exec(database, "COMMIT", 0, 0, 0); 
    //rc = sqlite3_reset(updStmt); 

    sqlite3_close(database); 

} 
+0

向我們顯示代碼請 –

+0

添加代碼。需要幫助請叫我。 – user1068636

回答

1

由於達倫的答案的解釋的延伸。

首先他的答案是正確的。 其次,你需要使用一個NSMutableArray保證一致性,這是你要去哪裏錯了沒有更新它,你應該

你應該考慮,以確保一致性的步驟如下:

加載數據爲表

  • 在viewDidLoad中,打電話給你的SQL語句,並將其加載到陣列中的viewWillAppear中
  • 確保您的數組中包含的數據,如果沒有顯示通知,沒有結果被送回

將數據保存到數據庫

  • 更新變化到陣列(或數據源)
  • 更新與更新的數據源的數據庫,以確保一致性
  • 更新與該表其中一個UITableView重裝methods

使用NSMArray確保更新和應用程序負載之間的一致性是相當普遍的做法已被過去由具有數十年經驗的同事共同推薦給我。

注意: 您將需要同步數據源以確保1個線程在任何時候訪問它,否則您將會崩潰。

+0

謝謝你們。我將繼續並重新編寫代碼以使NSMutableArray與數據庫保持一致。我認爲你們都是對的,但只是選擇了CStreel,因爲他對我更加清楚。我不明白爲什麼數據庫提交到磁盤時拋出緩衝區緩存,並在應用程序終止時同步。當您提交給磁盤時,它會變得令人困惑,並且稍後期望提交的行出現在以下查詢中,但它不顯示。這幾乎就像數據庫提交是圍繞你的應用程序的1個巨大交易。該事務只在您退出應用程序時提交=違反直覺 – user1068636

1

假設你念SQL數據到一個數組,然後使用此數組來構建的UITableView,當您添加記錄你的SQL數據庫,您可能需要也將其添加到用於構建表,或陣列重新讀取d從數據庫到數組。

+0

嗨達倫 - 我認爲如果我每次提交時都添加到NSMutableArray中,可能會變得非常混亂,儘管我認爲這會解決問題,但可能會在以後創建更多問題。我真正需要的是在看到我的變化反映出來之前,弄清楚什麼原因是我必須退出應用程序。 – user1068636

相關問題