ios app版本更新持久化数据怎么处理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ios app版本更新持久化数据怎么处理相关的知识,希望对你有一定的参考价值。

参考技术A 一般程序app升级时,数据库有可能发生改变,如增加表字段,增加表等。 此时有两种操作:

1 就是毫无留情的把本地旧数据库直接删掉,重新建立新的数据库;
2 就是数据库迁移,更新数据库。
第一种情况是简单粗暴型,但不会保留任何历史数据,一般不推荐使用。

这里主要介绍第二种情况,分四步操作:

第一步,上代码,主要红色字体的地方
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator

if (_persistentStoreCoordinator != nil)
return _persistentStoreCoordinator;

NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *folderPath = [NSString stringWithFormat:@"%@/Calendar",[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES) lastObject]];
if(![fileManager fileExistsAtPath:folderPath])//如果不存在,则说明是第一次运行这个程序,那么建立这个文件夹
[fileManager createDirectoryAtPath:folderPath withIntermediateDirectories:YESattributes:nil error:nil];

NSURL *storeURL = [NSURL fileURLWithPath:[folderPathstringByAppendingPathComponent:@"Calendar.sqlite"]];
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES],
NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES],
NSInferMappingModelAutomaticallyOption, nil];
NSError *error = nil;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc]initWithManagedObjectModel:[self managedObjectModel]];
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreTypeconfiguration:nil URL:storeURL options:options error:&error])
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();

return _persistentStoreCoordinator;

第二步:增加一个新版本的数据模型
选择Calendar.xcdatamodel文件 点击Editor -> Add Model Version 弹出一个对话框,填写Version Name (如 Calendar 2) 和Based on model (如 Calendar)。

第三步:继续选择Calendar.xcdatamodel文件 ,按option + command + 0 键,打开xcode最右侧栏, 在model version 的Current 中选择Calendar 2.

第四步:修改你的Calendar 2.xcdatamodel文件(如新增字段,添加表等操作),然后记得更新你改动表的entity代码。(注:这个步骤顺序一定要注意,千万不能在原Calendar.xcdatamodeld 上直接修改表结构,再添加新版本,这样的话会一直报错)

PS:NSURL *storeURL = [NSURL fileURLWithPath:[folderPath stringByAppendingPathComponent:@"Calendar.sqlite"]]; 这里还是Calendar.sqlite,而不是Calendar 2.sqlite,因为在第三步中已经选择了Calendar 2。
ok,开始build吧....

iOS开发之一句代码检测APP版本的更新-Swift版本



//新建一个NSObject类,将以下代码拷贝到此类中。


class HKVersionManager: NSObject {

    

    init(appleId: String) {

        super.init()

        // 获取appstore上的最新版本号

        let appUrl = URL.init(string: "http://itunes.apple.com/lookup?id=" + appleId)

        let appMsg = try? String.init(contentsOf: appUrl!, encoding: .utf8)

        let appMsgDict:NSDictionary = getDictFromString(jString: appMsg!)

        let appResultsArray:NSArray = (appMsgDict["results"] as? NSArray)!

        if appResultsArray.count==0 {

            return

        }

        let appResultsDict:NSDictionary = appResultsArray.lastObject as! NSDictionary

        let appStoreVersion:String = appResultsDict["version"] as! String

        let appStoreVersion_Float:Float = Float(appStoreVersion)!

        

        // 获取当前手机安装使用的版本号

        let localVersion:String = Bundle.main.infoDictionary!["CFBundleShortVersionString"] as! String

        let localVersion_Float:Float = Float(localVersion)!

        

        // 用户是否设置不再提示

        let userDefaults = UserDefaults.standard

        let res = userDefaults.bool(forKey: "NO_ALERt_AGAIN")

        // appstore上的版本号大于本地版本号 - 说明有更新

        if appStoreVersion_Float != localVersion_Float && !res {

            let alertC = UIAlertController.init(title: "版本更新了",

                                                message: "是否前往更新",

                                                preferredStyle: .alert)

            let yesAction = UIAlertAction.init(title: "去更新",

                                               style: .default,

                                               handler: { (handler) in

                                                self.updateApp(appId:appleId)

            })

            let noAction = UIAlertAction.init(title: "下次再说",

                                              style: .cancel,

                                              handler: nil)

            let cancelAction = UIAlertAction.init(title: "不再提示",

                                                  style: .default,

                                                  handler: { (handler) in

                                                    self.noAlertAgain()

            })

            alertC.addAction(yesAction)

            alertC.addAction(noAction)

            alertC.addAction(cancelAction)

            UIApplication.shared.keyWindow?.rootViewController?.present(alertC, animated: true, completion: nil)

        }

    }

    

    /// 去更新

    @available(iOS 10.0, *)

    func updateApp(appId:String) {

        let updateUrl:URL = URL.init(string: "http://itunes.apple.com/app/id" + appId)!

        if #available(iOS 10.0, *) {

            UIApplication.shared.open(updateUrl, options: [:], completionHandler: nil)

        } else {

            // Fallback on earlier versions

        }

    }

    

    /// 不再提示

    func noAlertAgain() {

        let userDefaults = UserDefaults.standard

        userDefaults.set(true, forKey: "NO_ALERt_AGAIN")

        userDefaults.synchronize()

    }

    

    /// JSONString转字典

    func getDictFromString(jString:String) -> NSDictionary {

        let jsonData:Data = jString.data(using: .utf8)!

        let dict = try? JSONSerialization.jsonObject(with: jsonData, options: .mutableContainers)

        if dict != nil {

            return dict as! NSDictionary

        }

        

        return NSDictionary()

    }

    

    

}

  在需要检测的类中调用一句代码即可

        //版本检测
        _ = HKCheckVersionManager.init(appId: "你的apple id")

  

以上是关于ios app版本更新持久化数据怎么处理的主要内容,如果未能解决你的问题,请参考以下文章

bee软件更新1.9.0版本怎么安装

iOS 数据持久化 CoreData的版本迁移

ios迭代版本,在appstore显示更新功能怎么做

怎么修改ios系统下app的版本号?

iOS版本更新的App提交审核发布流程

如何获取IOS上所有安装的app的版本信息