如何在iphone应用程序中管理sqlite database lite版本到付费版本?

时间:2013-07-09 05:11:45

标签: ios objective-c

我使用sqlite db创建了iPhone应用程序。在这个sqlite db我有故事文档,目录图像url和其他参数。当用户使用应用程序的“精简版”时,一切正常。但是当我将应用程序从“精简”版本升级到“付费”版本时,我希望能够将我的Documents目录中的数据库和最新文件复制到“付费”应用程序。将不胜感激。

2 个答案:

答案 0 :(得分:0)

如果Documents目录中的数据库然后在更新你的应用程序iOS时保留旧数据库。

答案 1 :(得分:0)

由于应用沙盒,你无法做到你想要的,但有很多方法:

  1. 而不是单独的专业版,只有一个版本的应用程序,它提供启用某些功能的In App Purchase。见Convert the "lite app" to "pro app" within the application。因此,这消除了将文件/设置从一个应用程序导入到另一个应用程序的需要。

  2. 您可以为应用的免费版和专业版实施单独的custom URL scheme,以允许他们通过网址交换有限数量的数据。因此,专业应用程序可能会在第一次运行时检查Lite应用程序是否已安装,如果是,请从中请求数据:

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
    
        NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    
        BOOL runAlready = [userDefaults boolForKey:kRunAlready];
    
        if (!runAlready)
        {
            [userDefaults setBool:YES forKey:kRunAlready];
            [userDefaults synchronize];
    
            [self importDataFromLite];
        }
    }
    
    - (void)importDataFromLite
    {
        NSURL *liteURL = [NSURL URLWithString:@"testapp-lite://getdata"];
    
        // if we can open test app, then test app installed, so launch it, providing "getdata" request
    
        if ([[UIApplication sharedApplication] canOpenURL:liteURL])
        {
            // Getting data from lite app
    
            [[UIApplication sharedApplication] openURL:liteURL];
        }
    }
    

    Lite版本显然必须设置其Info.plist以注册此自定义URL方案,并且其app委托需要响应此数据请求,然后调用专业应用程序的自定义URL方案发送数据回来了:

    - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
    {
        [[[UIAlertView alloc] initWithTitle:nil message:[url absoluteString] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show];
    
        if ([[url absoluteString] isEqualToString:@"testapp-lite://getdata"])
        {
            // I'm going to create URL from local NSDictionary, but you would presumably retrieve data from your model/database
    
            NSDictionary *dictionary = @{@"name" : @"Rob", @"age" : @"29"};
    
            NSMutableArray *array = [NSMutableArray array];
            [dictionary enumerateKeysAndObjectsUsingBlock:^(id key, NSString *obj, BOOL *stop) {
                [array addObject:[NSString stringWithFormat:@"%@=%@", key, [obj stringByAddingPercentEscapesForURLParameterUsingEncoding:NSUTF8StringEncoding]]];
            }];
    
            // now create the URL
    
            NSURL *proURL = [NSURL URLWithString:[NSString stringWithFormat:@"testapp-pro://data?%@", [array componentsJoinedByString:@"&"]]];
    
            // if we can open pro app, then then do so, providing "getdata" request
    
            if ([[UIApplication sharedApplication] canOpenURL:proURL])
            {
                NSLog(@"Opening pro app");
                [[UIApplication sharedApplication] openURL:proURL];
            }
        }
    
        return YES;
    }
    

    反过来,专业版可以有自定义URL方案来从应用程序的精简版本接收数据。因此,专业应用程序来自lite应用程序的数据处理程序可能如下所示:

    - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
    {
        NSArray *absoluteStringComponents = [[url absoluteString] componentsSeparatedByString:@"?"];
        NSArray *parameters = [absoluteStringComponents[1] componentsSeparatedByString:@"&"];
        for (NSString *parameter in parameters)
        {
            NSArray *parameterComponents = [parameter componentsSeparatedByString:@"="];
    
            // I'm just logging the results, but you'd presumably integrate the results into your model
    
            NSLog(@"%@ is equal to %@", parameterComponents[0], [parameterComponents[1] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]);
        }
    
        return YES;
    }
    

    这适用于适量的基本数据,但我不认为它非常适合交换图像文件。如果有兴趣,我可以告诉你这个例子。

  3. 在上面的变体中,您可以使用UIDocumentInteractionController导入更大量的数据,但我认为这会要求您在lite应用中显示一个popover,供用户指定在专业应用程序中打开数据文件(看起来不太优雅)。

  4. 理论上,您可以将数据存储在云端,可能是iCloud,DropBox或您自己的服务器。