我应该如何在iPhone项目中指定sqlite db的路径?

我应该如何在iPhone项目中指定sqlite db的路径?,iphone,objective-c,xcode,sqlite,Iphone,Objective C,Xcode,Sqlite,将其作为资源添加后,数据库文件本身位于项目根目录中 我只能通过指定OSX看到的完整路径来打开它,即“/Users/Louis/Documents/Test Project/Test.db” 但当然,iPhone上没有这样的路径 我想我应该将路径定义为“applicationroot/test.db”,但我不知道如何定义,或者除了我的开发机器之外,它是否还能在其他任何地方工作 谢谢您的建议。要获取您在XCode中添加的文件的路径,您可以在mainBundle中使用pathForResource:o

将其作为资源添加后,数据库文件本身位于项目根目录中

我只能通过指定OSX看到的完整路径来打开它,即“/Users/Louis/Documents/Test Project/Test.db”

但当然,iPhone上没有这样的路径

我想我应该将路径定义为“applicationroot/test.db”,但我不知道如何定义,或者除了我的开发机器之外,它是否还能在其他任何地方工作


谢谢您的建议。

要获取您在XCode中添加的文件的路径,您可以在mainBundle中使用pathForResource:ofType:

NSString *path = [[NSBundle mainBundle] pathForResource:@"yourDb" ofType:@"sqlite"];
但是您不能更改主捆绑包中的文件。所以你必须把它复制到另一个地方。例如,你的应用程序库

你可以这样做:

NSString *libraryPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];
NSString *targetPath = [libraryPath stringByAppendingPathComponent:@"yourDB.sqlite"];

if (![[NSFileManager defaultManager] fileExistsAtPath:targetPath]) {
    // database doesn't exist in your library path... copy it from the bundle
    NSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"yourDb" ofType:@"sqlite"];
    NSError *error = nil;

    if (![[NSFileManager defaultManager] copyItemAtPath:sourcePath toPath:targetPath error:&error]) {
        NSLog(@"Error: %@", error);
    }
}

不要只使用SQLite API,请使用这个名为FMDB的惊人包装器:

注意,在已编译的应用程序包中,路径将与项目中的路径不同。代码和资源放在不同的目录中。这就是为什么你应该使用
NSBundle
方法来解析路径。谢谢你的帮助!你说了一堆。我是否正确地理解,如果不先将数据库复制到libraryPath之类的地方,我就无法写入数据库?如果是这样的话,只要安装了应用程序,它就会一直存在吗?而且,如果DB是预填充的,我猜这会使它的足迹增加一倍,你不能改变你的包中的任何东西,所以你可以把你在XCODE中添加的所有文件看作只读。数据库将保留在库目录中,直到用户删除你的应用程序。itunes也会将其包含在备份中。因此,如果用户切换到新设备并从备份中恢复,您的数据库就会在那里。仅供参考,我必须将.sqlite文件拖到Xcode项目中,以便将其放入捆绑包中,通过命令行将其放入我的项目中,但并没有切断它。希望这能帮助其他陷入这个问题的人。是否真的需要否决票来建议一种更有效、更少痛苦的使用SQLite的方法?FMDB对我来说是必须的。