iphone - 将数据复制到 iPhone 上的应用程序数据文件夹

标签 iphone objective-c sqlite

我正在(最终)将我的应用程序加载到 iPhone 设备上进行测试。到目前为止,我只在模拟器中测试了该应用程序。该应用程序以数据为中心并使用 SQLite 数据库。我已经使用我在模拟器中使用的示例数据创建了一个合适的 SQLite 数据库。如何将此 .sqlite3 文件复制到实际的 iPhone?

使用模拟器很容易,因为我可以将 .sqlite3 文件复制到 ~/Library/Application Support/iPhone Simulator/User/Applications/{UUID}/Documents 文件夹中,但我无法弄清楚如何将其放入实际 iPhone 设备上的相同位置。在手机上从头开始重新创建数据库并不是一个真正的选择,因为我已经完成了在 Mac 上创建数据库的所有困难。

最佳答案

正如 Alex 所说,您必须将数据库文件作为资源添加到您的项目中。这将指示 Xcode 将您的数据库文件捆绑到您的 .app 中。然而,该文件是只读的,由您将其复制到您的应用程序文档文件夹(在设备或模拟器上,同样的事情),在那里它基本上变得可写。

下面是我用于此类事情的代码。这段代码的好处在于,只要您更改捆绑在 .app 中的“主”副本,它就会自动刷新应用程序文档文件夹中的可写副本。使用“pathLocal”打开您的(可写)数据库...

以下函数在操作成功时返回 YES(无论是否需要副本)。您可以根据自己的喜好随意更改它:)

NSString *pathLocal, *pathBundle;

// Automatically copy DB from .app bundle to device document folder if needed
- (BOOL)automaticallyCopyDatabase {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
    NSString *documentsDir = [paths objectAtIndex:0];
    pathLocal = [documentsDir stringByAppendingPathComponent:@"mydb.sqlite"];
    pathBundle = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"mydb.sqlite"];

    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSDictionary *localAttr = [fileManager fileAttributesAtPath:pathLocal traverseLink:YES];
    BOOL needsCopy = NO;
    if (localAttr == nil) {
        needsCopy = YES;
    } else {
        NSDate *localDate;
        NSDate *appDBDate;
        if (localDate = [localAttr objectForKey:NSFileModificationDate]) {
            NSDictionary *appDBAttr = [fileManager fileAttributesAtPath:pathBundle traverseLink:YES];
            appDBDate = [appDBAttr objectForKey:NSFileModificationDate];
            needsCopy = [appDBDate compare:localDate] == NSOrderedDescending;
        } else {
            needsCopy = YES;
        }
    }
    if (needsCopy) {
        NSError *error;
        BOOL success;
        if (localAttr != nil) {
            success = [fileManager removeItemAtPath:pathLocal error:&error];
        }
        success = [fileManager copyItemAtPath:pathBundle toPath:pathLocal error:&error];
        return success;
    }
    return YES;
}

关于iphone - 将数据复制到 iPhone 上的应用程序数据文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2170740/

相关文章:

iphone - iPhone SDK 中的类声明问题?

iphone - 请求访问联系人的权限

ios - 将 NSURL 添加到 xcode 中的可变数组

ios - 清除 NSURLConnection 缓存

iphone - 当触摸其中的单词时处理 UITextView 触摸事件

iphone - 自动更新 xcode

ios - 想在iphone app中实现这种功能

sqlite - 在 sqlite3 控制台中使用 ASCII 将 blob 数据查看为 hexdump

android - 如何使用两个条件查询 SQLite 数据库?

android - 我必须使用 _ID 作为 SQlite 主键吗?它必须是 INT 吗? (安卓开发)