gpt4 book ai didi

ios - 尝试访问 sqlite 文件时 NSPersistentStoreCoordinator 引发错误 NSSQLiteErrorDomain=26

转载 作者:行者123 更新时间:2023-11-29 01:30:40 28 4
gpt4 key购买 nike

最近我添加了一些对我的不同领域模型的并发访问(代表持久化数据的一个子集)。我的崩溃报告显示我现在偶然发现了 iOS7、iOS8 和 iOS9 上的一些错误,这些错误似乎都是基于

NSSQLiteErrorDomain=26, NSUnderlyingException=File at path does not appear to be a SQLite database at the position I marked in the source code

不幸的是,我无法重现它,而且我真的无法想象某些设备上不存在 sqlite 文件,因为我将它与我的应用程序包一起提供。

  1. 我的代码中是否存在阻止我访问 sqlite 文件的缺陷?
  2. 除丢失文件外,是否还有其他可能导致此错误的可能性?

这是我的模型单例初始化源代码和 NSManagedObjectContext

+ (id) sharedModel {
static id sharedModel = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^ {
sharedModel = [[self alloc] initWithStoreURL: kDefaultStoreURL];
});
return sharedModel;
}

- (id) initWithStoreURL:(NSURL *)storeURL {
self = [super init];
if (self) {
// create managed object model
NSURL * modelURL = [[NSBundle mainBundle] URLForResource: @"MyApp" withExtension: @"momd"];
NSManagedObjectModel *objectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL: modelURL];
// create persistent store coordinator
NSError * error = nil;
NSPersistentStoreCoordinator * storeCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:objectModel];
if (![storeCoordinator addPersistentStoreWithType: NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
CLS_LOG(@"Unresolved error %@, %@", error, [error userInfo]);
// this is where the error occurs
abort();
}
// init managedObjectContext
context = [[NSManagedObjectContext alloc] initWithConcurrencyType: NSMainQueueConcurrencyType];
[context setPersistentStoreCoordinator:storeCoordinator];
_mainContext = context;

_someDomainModel1 = [[SomeDomainModel1 alloc] initWithContext:_mainContext];
_someDomainModel2 = [[SomeDomainModel2 alloc] initWithContext:_mainContext];
}
return self;
}

最佳答案

initWithStoreURL 可能有问题,但如果您一直使用相同的代码,也许我做出了错误的假设。

您说您的 SQLite 存储文件是随 bundle 一起提供的,如果是这种情况,您需要以只读方式并在回滚模式下打开它。

NSDictionary *storeOptions = @{
NSReadOnlyPersistentStoreOption:@YES,
NSSQLitePragmasOption:@{@"journal_mode":@"DELETE"}};

然后,在添加商店时使用选项。

if (![storeCoordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:storeURL
options:storeOptions
error:&error]) {
}

此外,既然您看到了这一点,您应该记录更多信息(例如 URL 和错误对象的详细信息)。

但是,您正在调用 abort(),因此您也应该能够从崩溃报告中获取堆栈跟踪和状态信息。

另一件事...看看您是如何生成数据库的。您还应确保以回滚模式 (journal_mode=DELETE) 生成它。

关于ios - 尝试访问 sqlite 文件时 NSPersistentStoreCoordinator 引发错误 NSSQLiteErrorDomain=26,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33496728/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com