簡體   English   中英

在iOS中將先前創建的Sqlite數據庫寫入文檔的最佳方法是什么

[英]What is the best way to write a previously created Sqlite database to documents in iOS

我有一個先前創建的Sqlite數據庫文件,該文件與iOS應用程序捆綁在一起。 我的問題是將數據寫入手機的最佳方法是什么,以便我可以從那里的應用程序更改表格?

我的研究表明,我可能需要遍歷整個.sql文件,並在手機上手動插入/創建必要的表和值。

有沒有辦法只將數據庫寫入內部存儲,然后再對其進行操作?

您可以將其添加到項目中的支持​​文件中,然后將其復制為模板數據庫(如果不存在),然后將其打開。 一旦打開它,您就可以使用它來做您想做的事情。

這是我執行此操作的示例項目中的一些示例代碼。 在我的示例中,它是一個聯系人數據庫。 請注意,如果ensurePrepared不存在,它將如何從捆綁軟件中復制它。 我復制到庫路徑,但可以復制到文檔路徑。

- (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;    
}

將數據庫存儲在捆綁軟件中(在項目中)。 在“應用程序委托”中,將數據庫復制到“文檔”目錄(僅當文檔目錄中不存在數據庫文件時才執行此操作,否則您將始終覆蓋文件)。 在代碼中,始終在文檔目錄中引用副本。
另請閱讀此SO問題以獲取有關如何執行復制的一些代碼。

將.sql文件包括在項目的資源文件夾中,並在應用程序首次啟動時將其復制到用戶的文檔文件夾中(如果找不到該文件)。 您可以為此使用NSFileManager。

看看您將SQLite數據庫文件放在iPhone應用程序中的什么位置?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM