gpt4 book ai didi

ios - 新项目中的CoreData

转载 作者:行者123 更新时间:2023-11-29 12:44:44 25 4
gpt4 key购买 nike

希望你能帮上忙。

我有一个 iOS 应用程序,它是 3 年前使用 CoreData 构建的。出现了进行一些重大更新的机会,人们认为在继续使用现有 bundle 标识符的同时简单地启动一个新的 Xcode 项目更容易,这样应用程序仍然是 iTunes 用户的实际更新。

我的问题是;在 Xcode 中创建新项目并从第一个版本手动创建模型/实体/属性的副本会阻止数据在新项目中可用吗?

我在第一个版本的应用程序中有一些快速代码,它只返回数据中的记录数(见下文),但是当在新项目中使用相同的代码时,它什么也没有返回,就好像应用程序中没有数据。第一个版本也使用了 iCloud。

我想如果我安装了第一个版本的应用程序,创建了一些记录,然后安装了新版本,数据仍然可用。

我是否误解了迁移如何与 CoreData 一起工作,我是否更好地获取旧项目,为 ARC 重构并手动移动新代码以便仍然使用原始实体?

如有任何建议,我们将不胜感激。

NSFileManager *fileManager = [NSFileManager defaultManager];

NSString *entityName = @"MyObjects";

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:entityName];

request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"row_id"
ascending:YES
selector:@selector(localizedCaseInsensitiveCompare:)]];

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"MyObjects" withExtension:@"mom"];

NSManagedObjectModel *managedObject = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];

NSString *iCloudEnabledAppID = @"com.xxxx.myobjects";
NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managedObject];
NSString *dataFileName = @"MyObjects.sql";

NSString *iCloudDataDirectoryName = @"Data.nosync";
NSURL *iCloud = [fileManager URLForUbiquityContainerIdentifier:nil];

NSString *iCloudData = [[[iCloud path]
stringByAppendingPathComponent:iCloudDataDirectoryName]
stringByAppendingPathComponent:dataFileName];

NSMutableDictionary *options = [NSMutableDictionary dictionary];
[options setObject:iCloudEnabledAppID forKey:NSPersistentStoreUbiquitousContentNameKey];

[coordinator lock];

[coordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:[NSURL fileURLWithPath:iCloudData]
options:options
error:nil];

[coordinator unlock];

NSManagedObjectContext *moc = nil;
if (coordinator != nil) {
moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[moc setPersistentStoreCoordinator: coordinator];
}

NSFetchedResultsController *fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
managedObjectContext:moc
sectionNameKeyPath:nil
cacheName:nil];
[fetchedResultsController performFetch:nil];

NSLog(@">>>>>> %@", [fetchedResultsController fetchedObjects]); // returns 2 records

最佳答案

首先,我不确定你为什么用 MagicalRecord 标记它。您的示例代码都是原始核心数据。

其次,如果我是你,我会从旧应用程序中获取现有模型文件,并将其作为新应用程序中数据模型的第一个版本。您可以使用属性和实体等重新创建数据模型,并最终以相同的版本散列结束,但如果您已经有了起点,则无需经历这些麻烦.只需从现有的数据模型开始,然后继续前进。 Xcode 和 Core Data 不会将数据模型文件绑定(bind)到 Xcode 项目,并且您不会以这种方式获得任何锁定。托管对象模型文件只是文本文件,就像您应用中的所有其他代码一样。

第三,iCloud 设置在 iOS7 中需要的代码少得多。这非常简单,因为 Core Data 团队决定处理所有设置和回退存储的繁忙工作。我建议查看 WWDC2013 中的“核心数据中的新功能”演讲。

最后,您是否确定您确实复制了现有商店的模型?如果你有一个与商店不兼容的模型,你的核心数据堆栈将没有附加的持久性商店。也就是说,从顶层(您的 NSManagedObjectContext)来看,它似乎已被初始化,但附加的 NSPersistentStoreCoordinator 将没有任何存储。如果没有存储,则不会保存任何数据,也不会加载任何数据。托管对象模型版本必须与存储文件中的版本信息相匹配。您可以通过调用以下内容自行检查:

-[NSPersistentStoreCoordinator metadataForPersistentStore:]

+[NSPersistentStoreCoordinator metadataForPersistentStoreOfType:URL:error:]

结合

-[NSManagedObjectModel isConfiguration:compatibleWithStoreMetadata:]

您还提到了迁移。除非您有不止一种数据模型,否则您实际上并不是在迁移数据。但是当您确实有要迁移的版本时,您还需要设置轻量级迁移(自动迁移)的迁移选项,以便在将商店附加到协调器时执行。我建议阅读 Apple Documentation on Versioning and Migration .

关于ios - 新项目中的CoreData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23932178/

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