首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >现有应用程序的核心数据更新在iOS7.1上失败

现有应用程序的核心数据更新在iOS7.1上失败
EN

Stack Overflow用户
提问于 2014-06-11 06:00:12
回答 1查看 778关注 0票数 0

我在AppStore上有一个应用程序,它是在12月13日使用Xcode 4.3提交的,它有一个核心数据模型(版本2)。我现在将发布下一个版本,它更新了核心数据模型。当我在调试模式下运行代码时,迁移工作正常。但是当我通过TestFlight发布一个版本时,迁移失败了,我得到了下面的错误。出于安全考虑,每次应用程序退出时,我都会删除数据库(我保存了一个加密副本),在下一次启动时,我会解密这个DB。

用于初始化PersistentStoreCoordinator的代码。

代码语言:javascript
运行
AI代码解释
复制
NSError *error = nil;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
NSDictionary *options = @{
                          NSMigratePersistentStoresAutomaticallyOption : @YES,
                          NSInferMappingModelAutomaticallyOption : @YES
                          };


// Check if we need a migration
NSDictionary *sourceMetadata = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:NSSQLiteStoreType URL:storeURL error:&error];
NSManagedObjectModel *destinationModel = [_persistentStoreCoordinator managedObjectModel];
BOOL isModelCompatible = (sourceMetadata == nil) || [destinationModel isConfiguration:nil compatibleWithStoreMetadata:sourceMetadata];
if (! isModelCompatible) {
    // We need a migration, so we set the journal_mode to DELETE
    options = @{NSMigratePersistentStoresAutomaticallyOption:@YES,
                NSInferMappingModelAutomaticallyOption:@YES,
                NSSQLitePragmasOption: @{@"journal_mode": @"DELETE"}
                };
}

NSPersistentStore *persistentStore = [_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error];
if (! persistentStore) {


    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documents = [paths objectAtIndex:0];
    NSString *databasePath = [documents stringByAppendingPathComponent:@"Store"];
    NSString *sqlite = [databasePath stringByAppendingPathComponent:@"myDatabase.sqlite"];

    [[NSFileManager defaultManager] removeItemAtPath:sqlite error:nil];

    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    //abort();
}

// Reinstate the WAL journal_mode
if (! isModelCompatible) {
    [_persistentStoreCoordinator removePersistentStore:persistentStore error:NULL];
    options = @{NSMigratePersistentStoresAutomaticallyOption:@YES,
                NSInferMappingModelAutomaticallyOption:@YES,
                NSSQLitePragmasOption: @{@"journal_mode": @"WAL"}
                };
    [_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error];
}

return _persistentStoreCoordinator;

当我尝试初始化persistentStoreCoordinator时,我会得到下面的错误。

未解决的错误错误Domain=NSCocoaErrorDomain Code=259“操作无法完成。(可可错误259。)UserInfo=0x15df4dc0 {路径处的NSUnderlyingException=File似乎不是SQLite数据库:NSUnderlyingException=File{

代码语言:javascript
运行
AI代码解释
复制
NSUnderlyingException = "File at path does not appear to be a SQLite database: /var/mobile/Applications/9B623099-5591-4C55-BA83-77A057B94690/Documents/Store/myDatabase.sqlite";}

奇怪的是,在iOS7.0.6上,升级场景在Dev和发行版配置上都工作得很好,但是在iOS7.1上似乎只适用于Dev配置。我已经厌倦了删除WAL和SHM文件以及,但没有任何效果。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-19 04:44:47

这里的错误信息很能说明问题。上面写着:

NSUnderlyingException = "File at path does not appear to be a SQLite database: /var/mobile/Applications/9B623099-5591-4C55-BA83-77A057B94690/Documents/Store/myDatabase.sqlite";}

我在想,这可能是由于更新的核心数据sqlite和WAL文件之间的不匹配,但结果发现,这个错误更多的是由于加解密过程中的密钥不匹配。这是我的第一次猜测,我已经让我的同事检查了这个,但是他以某种方式证实了这一点,而我们不同意这个理论。

我们的加密方法是将运行时生成的加密密钥保存到密钥链中。现在的前提是,在应用程序升级之前和升级之后,密钥链中的值仍然存在。然而,由于使用了错误的捆绑标识符,升级后的应用程序没有从密钥链中获得值,而是创建了自己的运行时值。

存储在密钥链中的值只有在完整的包标识符相同的情况下才能在应用程序和应用程序更新之间共享。

BundleIdentifierPrefix1.com.yourcompany.appname的包标识符app1应用1.1有包标识符为BundleIdentifierPrefix2.com.yourcompany.appname

由于反向域相同,应用程序是作为更新安装的,但是由于前缀不同,密钥链值没有共享。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24164906

复制
相关文章
JavaScript获取路径
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/117720.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/05
1.4K0
JavaScript获取路径
JavaScript获取当前url路径
1、假设当前页完整地址是:https://www.qmblog.cn:8080/Home/Index?id=2&age=18 //获取当前窗口的Url var url = window.locatio
青梅煮码
2023/01/16
1.8K0
LeetCode - 所有可能的路径
我又重新开始更新LeetCode了,以后工作日更新LeetCode,周末更新东野圭吾的小说
晓痴
2019/07/24
7700
LeetCode - 所有可能的路径
LeetCode:所有可能的路径_797
给你一个有 n 个节点的 有向无环图(DAG),请你找出所有从节点 0 到节点 n-1 的路径并输出(不要求按特定顺序)
Yuyy
2022/06/28
3590
LeetCode:所有可能的路径_797
LeetCode-797-所有可能的路径
题目来自于力扣https://leetcode-cn.com/problems/all-paths-from-source-to-target
benym
2022/07/14
4440
Java文件路径/服务器路径的获取
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/157583.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/14
4.5K0
LeetCode 797. 所有可能的路径(DFS)
给一个有 n 个结点的有向无环图,找到所有从 0 到 n-1 的路径并输出(不要求按顺序)
Michael阿明
2020/07/13
7620
LeetCode 797. 所有可能的路径(DFS)
java获取classpath以外的路径
最近在使用以前写过的代码生成器(从表名可生成所有的代码)的时候,发现生成的文件都在classpath目录下,所有的文件都得自己拷到工程目录下,于是,想优化一下,取得classpath目录以外的路径,很简单,使用getCanonicalPath,如下
甲蛙全栈
2020/11/24
1.5K0
js 获取多级路径
数据结构  let treeData = [{ id: 1, label: '一级 1', children: [{ id: 4, label: '二级 1-1', children: [{ id: 9, label: '三级 1-1-1' }, { id: 10, label: '三级 1-1-2' }]
tianyawhl
2022/09/28
33.9K0
Golang
记录一下,方便下次使用: const dataFile = "../conf/db.yml" skip是要提升的堆栈帧数,0-当前函数,1-上一层函数,.... _, filename, _, _ := runtime.Caller(1) datapath := path.Join(path.Dir(filename), dataFile) golog.Info("================="+datapath+"------------------------------------------"
时光_赌徒
2020/05/26
5.1K0
python获取当前目录路径和上级路径
在使用python的时候总会遇到路径切换的使用情况,如想从文件夹test下的test.py调用data文件夹下的data.txt文件:
py3study
2020/01/08
9.3K0
java无法获取服务器上路径,JAVA获取服务器路径的步骤
ServletContext sc = (ServletContext)FacesContext.
全栈程序员站长
2022/09/15
1.9K0
根据对象路径获取对象的value
// 获取value的方法 obj为要获取的对象,path是路径 用.链接 var getPropByPath = function (obj, path) { let tempObj = obj path = path.replace(/\[(\w+)\]/g, '.$1') path = path.replace(/^\./, '') let keyArr = path.split('.') let i = 0 for (let
Java架构师必看
2021/08/23
3K0
java获取服务器路径_JAVA获取服务器路径的方法「建议收藏」
request.getSession().getServletContext().getRealPath(request.getRequestURI())
全栈程序员站长
2022/09/14
2.9K0
获取路径文件的后缀名字
使用QFileInfo获取路径文件的名字与后缀 测试文件 "/tmp/file.tar.gz" 1 获取文件名 返回不带名字的 file QString QFileInfo::baseName() const 返回名字和后缀 file.tar.gz QString QFileInfo::fileName() const 2 获取文件后缀 返回 "gz" QString QFileInfo::suffix() const 返回 "tar.gz" QString QFileInfo::completeSuffi
Qt君
2019/07/16
3.7K0
Python 获取当前路径的方法
模块搜索路径的字符串列表。由环境变量PYTHONPATH初始化得到。 sys.path[0]是调用Python解释器的当前脚本所在的目录。
AnRFDev
2021/02/01
2.2K0
你可能错过的现代 JavaScript 特性 [每日前端夜话0xE0]
尽管我在过去 7 年中几乎每天都在写 JavaScript 代码,但不得不承认,我实际上并不是很注意 ES 语言的发布声明。async/await 和 Proxies 之类的主要特性是一回事,但是每年都有稳定的小规模、渐进式的改进在不断涌现,因为总有一些东西需要学习。
疯狂的技术宅
2019/11/14
4870
JavaScript获取cookie的方法
之前都是使用 php 对 cookie 进行操作,今天有个需求,需要用 js 获取网站的 cookie 。下面开始:
德顺
2020/09/22
4.5K0
JavaScript获取cookie的方法
之前都是使用 php 对 cookie 进行操作,今天有个需求,需要用 js 获取网站的 cookie 。下面开始:
德顺
2023/08/25
5970
input file获取文件路径
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/160948.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/16
6.9K0

相似问题

QBasic -如何找到此值?

33

用Qbasic值加、减

46

QBasic -如何在QBasic中创建任何类型的文件?

11

qbasic到python如何操作

115

QBasic语言规范

40
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档