2011-09-14 78 views
0

我正在研究將從本地SQLite Db中提取數據的應用程序。該應用正在運行文件,但在我測試時,我添加了更多記錄等,但由於某種原因,模擬器和設備只能看到最後一個副本。從外部源更新時,Sqlite數據庫記錄不會更新嗎?

我已經做了一個CLEAN構建,從項目中刪除了.DB,然後將其添加回來,但無濟於事。如果數據庫有5條記錄,我會更新/添加兩條記錄,這些新記錄不會顯示。

關於我可以看到它們的唯一方法是從項目中刪除.DB,將數據庫重命名爲其他名稱,然後重新添加。

我知道這聽起來像某種類型的緩存問題,但無法弄清楚如何清除它。正如我所提到的,對於模擬器和設備都是一樣的。

任何幫助,非常感謝。提前致謝。

地球...

回答

0

如果您的資源中有數據庫文件,則需要在啓動時將其從資源複製到庫或文檔,然後連接到文檔或庫中的文件。

提示:註銷您連接的路徑,在終端(它將在派生數據下)打開該路徑,然後使用sqlite3 cmd行(搜索)進行連接和查詢。這有助於保持您正確操作正確分貝的理智,並且可以隨時檢查數據。

作爲一個側面說明,看到這個帖子(我有處理這一切,如果你有興趣庫): Don't wan't to replacing the old database when app is updated

下面是一個示例應用程序,我稱之爲ensureOpened(它處理複製的例子從資源和日誌我使用的是什麼):

- (BOOL)ensureDatabaseOpen: (NSError **)error 
{ 
    // already created db connection 
    if (_contactDb != nil) 
    { 
     return YES; 
    } 

    NSLog(@">> ContactManager::ensureDatabaseOpen");  
    if (![self ensureDatabasePrepared:error]) 
    { 
     return NO; 
    } 

    const char *dbpath = [_dbPath UTF8String]; 
    if (sqlite3_open(dbpath, &_contactDb) != SQLITE_OK && 
     error != nil) 
    { 
     *error = [[[NSError alloc] initWithDomain:@"ContactsManager" code:1000 userInfo:nil] autorelease]; 
     return NO; 
    } 

    NSLog(@"opened"); 

    return YES; 
} 

- (BOOL)ensureDatabasePrepared: (NSError **)error 
{ 
    // already prepared 
    if ((_dbPath != nil) && 
     ([[NSFileManager defaultManager] fileExistsAtPath:_dbPath])) 
    { 
     return YES; 
    } 

    // db in main bundle - cant edit. copy to library if !exist 
    NSString *dbTemplatePath = [[NSBundle mainBundle] pathForResource:@"contacts" ofType:@"db"]; 
    NSLog(@"%@", dbTemplatePath); 

    NSString *libraryPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject]; 
    _dbPath = [libraryPath stringByAppendingPathComponent:@"contacts.db"]; 

    NSLog(@"dbPath: %@", _dbPath); 

    // copy db from template to library 
    if (![[NSFileManager defaultManager] fileExistsAtPath:_dbPath]) 
    { 
     NSLog(@"db not exists"); 
     NSError *error = nil; 
     if (![[NSFileManager defaultManager] copyItemAtPath:dbTemplatePath toPath:_dbPath error:&error]) 
     { 
      return NO; 
     } 

     NSLog(@"copied"); 
    }  

    return YES;  
} 

希望幫助

+0

我肯定會感興趣的圖書館,你有做這一切。這是我第一次嘗試訪問SQLite數據庫,所以我已經脫離了教程。 Thx – George

+0

你可以先嚐試的一件事是在github上的fmdb - 這是一個流行的sqlite包裝。你也可以給我發電子郵件給我。 – bryanmac

+0

我實際上通過進入模擬器目錄並刪除SQL DB文件來解決這個問題。然後它開始拉下新版本。 – George

0

聽起來像一個棘手的調試。我可以問你如何連接到數據庫?您是使用CoreData還是原始SQL語句?

我有很多痛苦的理解數據庫如何與CoreData工作,所以我可以幫助。

0

數據庫文件是應用程序包的一部分嗎?你不能修改你的應用程序包。將數據庫複製到可以對其進行修改的位置(如Documents目錄),或者在第一次運行時在運行時創建它。