Iphone 核心数据轻量级迁移不起作用
我有一个处理核心数据的应用程序。目前我使用的是V1.5,在这些版本中,我对核心数据库做了一些更改。在一些人抱怨应用程序仍在崩溃之后,我发现我应该实现Iphone 核心数据轻量级迁移不起作用,iphone,ios,objective-c,core-data,nspersistentdocument,Iphone,Ios,Objective C,Core Data,Nspersistentdocument,我有一个处理核心数据的应用程序。目前我使用的是V1.5,在这些版本中,我对核心数据库做了一些更改。在一些人抱怨应用程序仍在崩溃之后,我发现我应该实现核心数据轻量级。现在的问题是,我不知道我在不同的版本中改变了什么 同样是为了处理核心数据,我遵循了斯坦福德大学的视频教程。 当您阅读本教程时,您会发现他不使用appdelegate中生成的标准代码XCODE。我将简略地解释他在做什么 在de视图中将出现我检查是否有托管文档。如果没有,我就创建一个 if (!self.genkDatabase)
核心数据轻量级。现在的问题是,我不知道我在不同的版本中改变了什么
同样是为了处理核心数据,我遵循了斯坦福德大学的视频教程。
当您阅读本教程时,您会发现他不使用appdelegate中生成的标准代码XCODE。我将简略地解释他在做什么
在de视图中将出现
我检查是否有托管文档。如果没有,我就创建一个
if (!self.genkDatabase) {
NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
url = [url URLByAppendingPathComponent:@"Default appGenk Database"];
// url is now "<Documents Directory>/Default Photo Database"
self.genkDatabase = [[UIManagedDocument alloc] initWithFileURL:url]; // setter will create this for us on disk
}
然后在useDocument中检查文档状态,然后获取数据并将其保存在核心数据库中
- (void)useDocument
{
if (![[NSFileManager defaultManager] fileExistsAtPath:[self.genkDatabase.fileURL path]]) {
// does not exist on disk, so create it
[self.genkDatabase saveToURL:self.genkDatabase.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
NSLog(@"no database created yet");
[self fetchNewsIntoDocument:self.genkDatabase];
[self setupFetchedResultsController];
}];
} else if (self.genkDatabase.documentState == UIDocumentStateClosed) {
// exists on disk, but we need to open it
NSLog(@"closed");
[self.genkDatabase openWithCompletionHandler:^(BOOL success) {
[self fetchNewsIntoDocument:self.genkDatabase];
[self setupFetchedResultsController];
}];
} else if (self.genkDatabase.documentState == UIDocumentStateNormal) {
// already open and ready to use
[self setupFetchedResultsController];
}
}
- (void)fetchNewsIntoDocument:(UIManagedDocument *)document
{
dispatch_queue_t fetchNews = dispatch_queue_create("news fetcher", NULL);
dispatch_async(fetchNews, ^{
NSArray *news = [GenkData getNews];
[document.managedObjectContext performBlock:^{
int newsId = 0;
for (NSDictionary *genkInfo in news) {
newsId++;
[News newsWithGenkInfo:genkInfo inManagedObjectContext:document.managedObjectContext withNewsId:newsId];
}
[document saveToURL:document.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:NULL];
}];
});
dispatch_release(fetchNews);
}
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'This NSPersistentStoreCoordinator has no persistent stores. It cannot perform a save operation.'
这就是我如何将数据提取到数据库中的方法
- (void)useDocument
{
if (![[NSFileManager defaultManager] fileExistsAtPath:[self.genkDatabase.fileURL path]]) {
// does not exist on disk, so create it
[self.genkDatabase saveToURL:self.genkDatabase.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
NSLog(@"no database created yet");
[self fetchNewsIntoDocument:self.genkDatabase];
[self setupFetchedResultsController];
}];
} else if (self.genkDatabase.documentState == UIDocumentStateClosed) {
// exists on disk, but we need to open it
NSLog(@"closed");
[self.genkDatabase openWithCompletionHandler:^(BOOL success) {
[self fetchNewsIntoDocument:self.genkDatabase];
[self setupFetchedResultsController];
}];
} else if (self.genkDatabase.documentState == UIDocumentStateNormal) {
// already open and ready to use
[self setupFetchedResultsController];
}
}
- (void)fetchNewsIntoDocument:(UIManagedDocument *)document
{
dispatch_queue_t fetchNews = dispatch_queue_create("news fetcher", NULL);
dispatch_async(fetchNews, ^{
NSArray *news = [GenkData getNews];
[document.managedObjectContext performBlock:^{
int newsId = 0;
for (NSDictionary *genkInfo in news) {
newsId++;
[News newsWithGenkInfo:genkInfo inManagedObjectContext:document.managedObjectContext withNewsId:newsId];
}
[document saveToURL:document.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:NULL];
}];
});
dispatch_release(fetchNews);
}
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'This NSPersistentStoreCoordinator has no persistent stores. It cannot perform a save operation.'
我知道这是很多代码,但我想得到一个好的答案,因为我在这个问题上搜索了好几天。在我听说轻量级核心数据迁移之前,我的appdelegate中没有任何关于核心数据的内容。在研究了轻量级迁移之后,我在appdelegate中添加了标准的核心dat代码,并将其添加到代码中
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
}
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Default appGenk Database.sqlite"];
[[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil];
NSError *error = nil;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
NSDictionary *options = @{
NSMigratePersistentStoresAutomaticallyOption : @YES,
NSInferMappingModelAutomaticallyOption : @YES
};
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return _persistentStoreCoordinator;
}
现在,在编写了大量代码之后,我们开始着手解决实际问题。当我在安装了第一个版本的iPad上运行该项目时,在它将数据插入数据库之后,我得到了以下错误
- (void)useDocument
{
if (![[NSFileManager defaultManager] fileExistsAtPath:[self.genkDatabase.fileURL path]]) {
// does not exist on disk, so create it
[self.genkDatabase saveToURL:self.genkDatabase.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
NSLog(@"no database created yet");
[self fetchNewsIntoDocument:self.genkDatabase];
[self setupFetchedResultsController];
}];
} else if (self.genkDatabase.documentState == UIDocumentStateClosed) {
// exists on disk, but we need to open it
NSLog(@"closed");
[self.genkDatabase openWithCompletionHandler:^(BOOL success) {
[self fetchNewsIntoDocument:self.genkDatabase];
[self setupFetchedResultsController];
}];
} else if (self.genkDatabase.documentState == UIDocumentStateNormal) {
// already open and ready to use
[self setupFetchedResultsController];
}
}
- (void)fetchNewsIntoDocument:(UIManagedDocument *)document
{
dispatch_queue_t fetchNews = dispatch_queue_create("news fetcher", NULL);
dispatch_async(fetchNews, ^{
NSArray *news = [GenkData getNews];
[document.managedObjectContext performBlock:^{
int newsId = 0;
for (NSDictionary *genkInfo in news) {
newsId++;
[News newsWithGenkInfo:genkInfo inManagedObjectContext:document.managedObjectContext withNewsId:newsId];
}
[document saveToURL:document.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:NULL];
}];
});
dispatch_release(fetchNews);
}
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'This NSPersistentStoreCoordinator has no persistent stores. It cannot perform a save operation.'
我希望任何人都能帮助我解决这个问题。我不是一个很长时间的IOS开发者,很难为我解决这个问题
自动轻量级迁移并不总是有效的——它取决于您对数据模型所做的更改。您确定可以将其用于更改吗?我只向实体添加了一些属性。没有大的变化哪一行导致了异常?请在代码中对该行进行注释。另外,您是使用版本化的核心数据模型,还是只是重复编辑单个版本?如果编辑单个版本,您是否在每次更改后将其提交给源代码管理?如果是这样,您应该能够返回版本历史记录以查找所做的更改。如果没有,你应该开始这样做。