将数据复制到iPhone上的Application Data文件夹

Sko*_*ota 5 sqlite iphone objective-c

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

使用模拟器很容易,因为我可以将.sqlite3文件复制到〜/ Library/Application Support/iPhone模拟器/用户/应用程序/ {UUID}/Documents文件夹中,但是我无法弄清楚如何将它们放到同一个文件夹中在实际的iPhone设备上的位置.从头开始在手机上重新创建数据库并不是一个选择,因为我已经完成了在Mac上创建数据库的所有硬码.

Zor*_*mic 11

正如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;
}
Run Code Online (Sandbox Code Playgroud)


Ale*_*lds 6

为什么不将它添加到您的应用程序包中?Resources在Xcode中右键单击项目窗口中的文件夹,然后选择Add> Existing Files...以添加sqlite数据库.

然后,您将从应用程序包中加载该文件:

NSString *databasePath = [[NSBundle mainBundle] pathForResource:@"mySQLiteDatabaseFile" ofType:@"sqlite3"];
NSData *databaseData = [NSData dataWithContentsOfFile:databasePath];
// ...
Run Code Online (Sandbox Code Playgroud)

  • 不,但您可以将此"预初始化"的基本数据库从那里复制到可写入的`Documents`文件夹中.好消息是这种方法还允许用户"重置"应用程序. (2认同)