【问题标题】:Overwriting SQLite Database on iOS在 iOS 上覆盖 SQLite 数据库
【发布时间】:2017-06-03 19:58:54
【问题描述】:

我有一个database.sqlite 文件,我用NSlog 知道文件的位置,希望我得到了位置

问题是,我想用一个按钮覆盖该数据库,所以当用户单击该按钮时,它会覆盖数据库,但不是覆盖,而是将数据库保存到以下路径

/Users/MYUsername/Library/Developer/CoreSimulator/Devices/4453818A-0617-479B-B98C-3FC544A24D00/data/Containers/Bundle/Application/F15404E8-AB5B-40D6-A4D5-ED42F8F7A682/Documents/Database.sqlite

这不是我想要的,我想把数据库保存到这里

/Users/MYUsername/Library/Developer/CoreSimulator/Devices/4453818A-0617-479B-B98C-3FC544A24D00/data/Containers/Data/Application/BD3E2250-DF45-480F-AB06-F8E97D3B0B37/Documents

我尝试了以下代码:

- (IBAction)updateDatabase:(id)sender {

    NSData *dbFile = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:@"file URL"]];

    NSString *resourceDocPath = [[NSString alloc] initWithString:[[[[NSBundle mainBundle]  executablePath] stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"Documents"]];

    NSString *filePath = [resourceDocPath stringByAppendingPathComponent:@"Database.sqlite"];

    [dbFile writeToFile:filePath atomically:YES];
    NSFileManager *manager = [NSFileManager defaultManager];
    if (![manager fileExistsAtPath:filePath]) {
        NSLog(@"File Not exsists : %@",filePath);
    } else {
        NSLog(@"File exsits : %@",filePath);
    }
}

【问题讨论】:

  • 每个应用程序都由一个 UUID(通用唯一标识符)标识,因为 UUID 不同,这意味着有两个应用程序
  • @MohammadAlavi,有一个应用程序,字典不同

标签: ios objective-c sqlite


【解决方案1】:

每次运行应用程序时,都会创建一个新的 UUID,并将文件复制到这个新目录以验证这一点,在您的 application:didFinishLaunchingWithOptions: 中添加以下代码

NSLog(@"executablePath: %@", [[NSBundle mainBundle] executablePath]);

NSURL *urlDocument = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] firstObject];
NSString *pathDatabase = [[urlDocument path] stringByAppendingPathComponent:@"Database.sqlite"];

BOOL databaseExists = [[NSFileManager defaultManager] fileExistsAtPath:pathDatabase];
NSLog(@"databaseExists: %@", databaseExists ? @"YES" : @"NO");

顺便说一下,在将数据库内容 (dbFile) 写入此位置的文件之前,您应该检查该文件是否存在于 filePath

【讨论】:

    【解决方案2】:

    我想你会想用:

    [[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask] firstObject] path]
    

    而不是

    [[[[NSBundle mainBundle] executablePath] stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"Documents"]
    

    查看 Apple 的文档:

    https://developer.apple.com/reference/foundation/nsfilemanager/1407726-urlsfordirectory?language=objc

    (已编辑)

    像这样:

    - (IBAction)updateDatabase:(id)sender {
    
        NSData *dbFile = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:@"file URL"]];
    
        NSString *resourceDocPath = [[NSString alloc] initWithString:[[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask] firstObject] path]];
    
        NSString *filePath = [resourceDocPath stringByAppendingPathComponent:@"Database.sqlite"];
    
        [dbFile writeToFile:filePath atomically:YES];
        NSFileManager *manager = [NSFileManager defaultManager];
        if (![manager fileExistsAtPath:filePath]) {
            NSLog(@"File Not exsists : %@",filePath);
        } else {
            NSLog(@"File exsits : %@",filePath);
        }
    }
    

    【讨论】:

    • 对不起,我是编程新手,你的意思是这样吗? NSString*string = [NSString stringWithFormat:@"%@",[manager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask]];
    猜你喜欢
    • 1970-01-01
    • 2013-11-02
    • 2013-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-27
    • 1970-01-01
    • 2019-04-28
    相关资源
    最近更新 更多