繁体   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