如果您的資源中有數據庫文件,則需要在啓動時將其從資源複製到庫或文檔,然後連接到文檔或庫中的文件。
提示:註銷您連接的路徑,在終端(它將在派生數據下)打開該路徑,然後使用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;
}
希望幫助
我肯定會感興趣的圖書館,你有做這一切。這是我第一次嘗試訪問SQLite數據庫,所以我已經脫離了教程。 Thx – George
你可以先嚐試的一件事是在github上的fmdb - 這是一個流行的sqlite包裝。你也可以給我發電子郵件給我。 – bryanmac
我實際上通過進入模擬器目錄並刪除SQL DB文件來解決這個問題。然後它開始拉下新版本。 – George