zoukankan      html  css  js  c++  java
  • iOS 把数据库文件打包到mainbundle中,查找不到路径的解决的方法;以及在删除bundle中文件的可行性

    在开发中有时我们须要把数据库文件打包到我们的项目中。一般我们都是在外部用工具生成数据库文件,然后拉入项目中。可是我们在程序中查找改文件时。返回的路径总是nil

    解决的方法:

    原因我们拉入其它资源文件(比方:图片、代码文件等)Xcode都会自己主动加入到target 的 "Build Phases" 下 "Copy Bundle Resources文件夹下,可是我们拉过来的数据库文件这里是找不到的,可能是Xcode无法识别这类文件(当我们拉去过来时)。所以我们要做的就是把刚才加入的db文件加入该文件夹下。如图


    这样就OK了。执行代码就能够找到了该数据库文件的路径了。

    接下来上代码:

    - (void)_testDataBaseHandle
    {
        static NSString *const DATABASE_FILE_NAME = @"exiu.db";
        NSString *dbFilePath ;
        //获取应用程序的路径
        NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(
                                                                   NSDocumentDirectory,
                                                                   NSUserDomainMask,
                                                                   YES);
        NSString *documentFolderPath = [searchPaths objectAtIndex:0];
        NSLog(@"docoumentFolderPath=%@",documentFolderPath);
        
        //往应用程序路径中加入数据库文件名,把它们拼接起来。 这里用到了宏定义(目的是不易出错)
        dbFilePath = [documentFolderPath stringByAppendingPathComponent:DATABASE_FILE_NAME];
        NSLog(@"dbFilePath = %@",dbFilePath);
        
        //
        
        
        /*
         为什么要往应用程序里加入数据库文件这个过程:
         由于以下要进行推断,会依据这个路径去查找应用程序的路径中究竟有没有这个文件,
         假设有。则不用在此拷贝了。
         假设没有,则又一次拷贝一次。
         数据库文件必须加入进取,否则无法进行数据库的操作,并且必须加入一次,
         
         那么为什么必需要加入一次呢?
         由于我们在程序中实现对数据库的改动,然而却又把数据库加入了一次,
         那么新加入的数据库就会把旧的数据库覆盖掉,那么程序中对数据库的改动也不能实现,
         所以数据库仅仅能加入一次且是在程序执行初加入
         */
        
        //依据上面拼接好的路径 dbFilePath ,利用NSFileManager 类的对象的fileExistsAtPath方法来检測是否存在,返回一个BOOL值
        //1. 创建NSFileManager对象  NSFileManager包括了文件属性的方法
        NSFileManager *fm = [NSFileManager defaultManager];
        
        //2. 通过 NSFileManager 对象 fm 来推断文件是否存在,存在 返回YES  不存在返回NO
        BOOL isExist = [fm fileExistsAtPath:dbFilePath];
        //- (BOOL)fileExistsAtPath:(NSString *)path;
        
        //假设不存在 isExist = NO,拷贝project里的数据库到Documents下
        if (!isExist)
        {
            //拷贝数据库
            
            //获取project里。数据库的路径,由于我们已在project中加入了数据库文件,所以我们要从project里获取路径
            NSString *backupDbPath = [[NSBundle mainBundle]
                                      pathForResource:@"exiu"
                                      ofType:@"db"];
            //这一步实现数据库的加入。
            // 通过NSFileManager 对象的复制属性。把project中数据库的路径拼接到应用程序的路径上
            BOOL cp = [fm copyItemAtPath:backupDbPath toPath:dbFilePath error:nil];
            NSLog(@"cp = %d",cp);
            //- (BOOL)copyItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error
            NSLog(@"backupDbPath =%@",backupDbPath);
            if (cp) {
                NSError *error;
                //这里验证程序执行时,copy成功后,删除mainbundle里的文件
                BOOL bl = [fm removeItemAtPath:backupDbPath error:&error];
    
            }
            
           }
        NSLog(@"isExist =%d",isExist);
    }

    以下说说copy文件成功后。删除main bundle下的源文件的可行性

    假设是在模拟器下,你执行发现是能够的!这样并不意味着在真机上是可行的。经过真机測试。发现会报错。!

    由于程序在真机真机上执行时,bundle 是仅仅读的。所以千万不要执行时改动程序bundle下的不论什么文件!!

    上面说到,程序执行时。程序bundle是仅仅读的,这也是我们为什么要把数据文件copy到Document文件加下的原因!

    我们这个数据文件肯定是要进行增删改查操作的。

    參考:http://stackoverflow.com/questions/21507028/ios-sqlite-db-path-from-nsbundle-mainbundle-returns-null

    http://stackoverflow.com/questions/9002208/sqlite-db-path-in-bundle-acces

    http://www.mindfiresolutions.com/Never-try-to-delete-any-resource-from-NSBundle-in-iPhoneiPadiPod-on-runtime-1523.php

  • 相关阅读:
    Java Web
    Tomcat学习笔记
    Java Web学习笔记(2)
    Java Web学习笔记(1)
    2017-2018-1 Java演绎法 小组会议及交互汇总
    【Alpha版本】冲刺阶段
    【Alpha版本】冲刺阶段
    【Alpha版本】冲刺阶段
    【Alpha版本】冲刺阶段
    【Alpha版本】冲刺阶段
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/6795997.html
Copyright © 2011-2022 走看看