小编wes*_*der的帖子

核心数据推断迁移 - 自动"轻量级"与手动

我已经以一些简单的方式更新了现有iPhone应用程序的模型(删除属性,添加属性,删除索引),并且可以使用自动轻量级迁移来迁移持久性存储.

由于数据集的典型大小,处理时间并不是无关紧要的,并且需要为用户提供反馈.

NSMigrationManager提供了一个简单但有用的migrationProgress值,可在执行迁移时发送KVO通知.这构成了提供反馈的基础,但是尝试使用推断的模型([NSMappingModel inferredMappingModelForSourceModel:destinationModel:error:])导致完全相同的数据集的时序截然不同.

原始iPhone(2G)上的配置文件结果,磁盘上的缓存大小:1.785 MB.

自动推断轻量级迁移

PROFILE: CacheManager -migrateStore
PROFILE:   0.6130 (+0.6130) models loaded
PROFILE:   1.1759 (+0.5629) delegate -CacheManagerWillMigrate:
PROFILE:   1.2516 (+0.0757) persistent store coordinator loaded
PROFILE:   5.1436 (+3.8920) automatic lightweight migration completed
PROFILE:   5.5435 (+0.3999) delegate -CacheManagerDidFinishMigration:withError:
Run Code Online (Sandbox Code Playgroud)

手动推断迁移

PROFILE: CacheManager -migrateStore
PROFILE:   0.6660 (+0.6660) models loaded
PROFILE:   1.1471 (+0.4811) inferred mapping model generated
PROFILE:   1.4046 (+0.2574) delegate -CacheManagerWillMigrate:
PROFILE:   1.5058 (+0.1013) persistent store coordinator loaded
PROFILE:   22.6952 (+21.1894) manual migration completed
PROFILE:   23.1478 …
Run Code Online (Sandbox Code Playgroud)

migration iphone core-data objective-c mapping-model

10
推荐指数
1
解决办法
2392
查看次数

核心数据迁移问题:"持久存储迁移失败,缺少源管理对象模型."

的背景

  • 包含两个托管对象模型的Cocoa非文档核心数据项目.
  • 模型1保持不变.模型2已更改,因此我想迁移商店.
  • 我在Xcode中通过Design> Data Model> Add Model Version创建了一个新版本.
  • 版本之间的区别是单个关系,从一个关系变为一个关系.
  • 我对模型进行了更改,然后保存了.
  • 我制作了一个新的映射模型,它将旧模型作为源,将新模型作为目标.
  • 我已经确保所有映射模型和数据模型正在编译,并且所有映射模型和数据模型都被复制到我的应用程序包的Res​​ource文件夹中.
  • 我通过在添加持久存储时使用NSMigratePersistentStoresAutomaticallyOption 密钥传入字典来启用迁移 [NSNumber numberWithBool:YES].
  • 我没有合并捆绑中的所有模型,而是指定了我想要使用的两个模型(模型1和模型2的新版本)并使用它们合并它们 modelByMergingModels:

问题

无论我做什么迁移,我都会收到错误消息:

"持久存储迁移失败,缺少源管理对象模型."

我试过的

  • 每次构建后都会清理干净.
  • 我已经尝试了各种组合,只有我在资源中迁移的模型,正在编译或两者兼而有之.
  • 由于错误消息暗示它无法找到我的迁移的源模型,因此我尝试在Resources文件夹中编译每个版本的模型.
  • 通过切换回我的数据模型的原始版本,我已经确定我没有做出一个非常基本的错误.该应用运行正常.
  • 我删除了映射模型和模型的新版本,清理后再重新创建.
  • 我尝试在新模型中进行不同的更改 - 删除实体.

我的智慧结束了.

我不禁想到我在某个地方犯了一个很大的错误,我没有看到.有任何想法吗?

migration cocoa core-data objective-c mapping-model

8
推荐指数
2
解决办法
1万
查看次数

核心数据强制自定义映射模型/策略而不是轻量级迁移

我现在有大约4个不同版本的数据模型,除了最后一个版本之外的每个版本都只是使用自动轻量级迁移的一个小改动.对于这个最新的模型,我需要在迁移期间做一些额外的工作,所以我创建了一个自定义映射模型和一个迁移策略子类,其中包含createDestinations和createRelationships中的一些操作.问题是,我没有调用我的映射模型/自定义策略,而且似乎Core Data正在尝试执行轻量级迁移.我是否需要做些什么来保持轻量级迁移,但是当有可用的映射模型时使用我的映射模型?

migration iphone cocoa core-data mapping-model

8
推荐指数
1
解决办法
862
查看次数

EASession,EAAccessoryDe​​legate和"ERROR - 开放会话失败"

我正在使用External Accessory框架.我 app进入后台然后返回前台时遇到重新建立EASession的问题.如果我终止我的应用程序并重新启动,则会重新建立蓝牙连接,正如人们所期望的那样.我怀疑有一部分我正在丢失的拆解 - 或者没有暴露(??).

[EAAccessoryManager sharedAccessoryManager] connectedAccessories]]正在返回我连接的附件,我可以查询它以获取name,modelNumber等.但是,以下行将_session设置为nil.

_session = [[EASession alloc] initWithAccessory:_accessory forProtocol:_protocolString];
Run Code Online (Sandbox Code Playgroud)

有没有办法诊断EASession初始化失败的原因?

清除旧的EASession有一些口头禅吗?

这个问题关系到一个-但我没有要求上遵循的路径建议.我在问为什么这条路有这么大的陷阱以及如何绕过它.

iphone bluetooth iphone-accessory

7
推荐指数
1
解决办法
8400
查看次数

迁移后,使用_Unwind_SjLj_Resume发生奇怪的核心数据崩溃

我的一些beta测试人员遇到了一个奇怪的崩溃,我遇到了麻烦.符号化的崩溃报告表明在init调用时,控制器作为单例进行简单分配时发生了崩溃,但是根据堆栈跟踪,我所看到的代码init实际上并不是崩溃所在的位置.这是相关代码:

1534| + (UA[REDACTED]PlayerController*)sharedInstance
1535| {
1536|     @synchronized(self)
1537|     {
1538|         if (sharedInstance == nil)
1539|     sharedInstance = [[UA[REDACTED]PlayerController alloc] init];
1540|     }
1541|     return sharedInstance;
1542| }
Run Code Online (Sandbox Code Playgroud)

这从未崩溃过,而且代码最近没有随时更改过.这是升高的堆栈跟踪:

Thread 5:
0   libSystem.B.dylib              0x33bd52d4 __kill + 8
1   libSystem.B.dylib              0x33bd52c4 kill + 4
2   libSystem.B.dylib              0x33bd52b6 raise + 10
3   libSystem.B.dylib              0x33be9d26 __abort + 62
4   libSystem.B.dylib              0x33be9d7e abort + 62
5   libSystem.B.dylib              0x33bd7980 __assert_rtn + 152
6   libgcc_s.1.dylib               0x32acab4e _Unwind_SjLj_Resume + 26
7   [REDACTED]                     0x00060b64 +[UA[REDACTED]PlayerController sharedInstance] …
Run Code Online (Sandbox Code Playgroud)

iphone crash core-data core-data-migration mapping-model

6
推荐指数
1
解决办法
1574
查看次数

迁移核心数据中的多个版本

我有Core Data应用程序,我一直在迁移(升级)核心数据模型.每次创建新版本时,我都会为每个版本创建一个映射模型.现在我有16个版本,我有这样的映射模型:1to2.xcmappingmodel 2to3.xcmappingmodel 3to4.xcmappingmodel ...等.最多16

这样可以正常工作,但是当一个用户拥有版本10的数据文件并更新具有版本16的应用程序时会出现问题.有些我认为Core Data会自动从10升级到16,但是出现错误显示"Missing"映射模型".为了确保映射模型在正确的地方,我将它逐个升级到每个版本(10到11,11到12等等),它确实有用......这是我的代码.

我用这段代码指定模型版本:

NSBundle *modelWrapper = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"TaskApp_DataModel" ofType:@"momd"]];
NSString *modelPath = [modelWrapper pathForResource:@"TaskApp_DataModel 16" ofType:@"mom"];
NSLog(@"%@",modelPath);
managedObjectModel = [[NSManagedObjectModel alloc]initWithContentsOfURL:[NSURL fileURLWithPath:modelPath]];
Run Code Online (Sandbox Code Playgroud)

我在这里定义了Migrate Automatic选项:

  NSURL *url = [NSURL fileURLWithPath: [applicationSupportDirectory stringByAppendingPathComponent: @"storedata-sql"]];


NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption];



if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType 
                                            configuration:nil 
                                            URL:url 
                                            options:dict 
                                            error:&error]){
Run Code Online (Sandbox Code Playgroud)

有谁知道如何升级这个?谢谢.

cocoa core-data core-data-migration mapping-model

5
推荐指数
1
解决办法
1054
查看次数

核心数据和多线程

我在他的核心数据书中读过Marcus Zarra关于多线程的章节,并且仔细研究了他的示例代码.但他的代码和其他人,我已经找到其他地方似乎那些后台进程重点并不需要知道对方的.这些示例适用于导入树结构 - 但它们不涉及导入更通用(复杂)的结构,如有向非循环图.

在我的例子中,我试图解析一个C++类层次结构,并希望尽可能多地使用NSOperations.我想为每个遇到的类创建一个NSManagedObject实例,并且我想在保存一个时合并不同的NSManagedObjectContexts.

顺便说一句:我能够使用单个NSOperation来处理文件并一次解析一个文件.在这个实现中,在主线程的MOC上调用-mergeChangesFromContextDidSaveNotification的-mergeChanges:方法效果很好.

但理想情况下,我会对源文件进行一次NSOperation迭代,并生成NSOperations来解析每个文件.我尝试了几种方法 - 但似乎无法做到正确.最有希望的是让每个NSOperation观察NSManagedObjectContextDidSaveNotification.使用-mergeChanges:看起来像这样:

- (void) mergeChanges:(NSNotification *)notification
 {
 // If locally originated, then trigger main thread to merge.
 if ([notification object] == [self managedObjectContext])
  {
  AppDelegate *appDelegate = (AppDelegate*)[[NSApplication sharedApplication] delegate];
  NSManagedObjectContext *mainContext = [appDelegate managedObjectContext];

  // Merge changes into the main context on the main thread
  [mainContext performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:)
         withObject:notification
         waitUntilDone:YES];
  return;
  }
   // If not locally originated, then flag need to merge with in this NSOperation's thread.  
 [self setNeedsToMerge:YES];
 [self setMergeNotification:notification]; …
Run Code Online (Sandbox Code Playgroud)

multithreading core-data nsmanagedobjectcontext

5
推荐指数
1
解决办法
4719
查看次数

核心数据 - 监视更改并注册本地通知

我对Core Data和KVC比较陌生,但是我想要一些关于注册Core Data对象更改的指针.情况如下:

我有一个NSManagedObjectPatient,另一个叫Medication.A Patient可能有很多Medications,而且Medication有一个startOnendOn日期.

我想以某种方式监听endOn所有Medication对象属性的更改.发生更改时,我想在iOS设备上安排本地通知.我之前使用过本地通知,但不知道在这种情况下将代码放在何处.

我是否在App Delegate中创建调度代码并以某种方式注册App Delegate以侦听Medication对象中的更改?这需要附加到NSManagedObjectContext

这是怎么做到的?指针将非常感谢!

谢谢!

iphone cocoa-touch core-data key-value-observing

5
推荐指数
1
解决办法
7346
查看次数

核心数据总和关系

我有一个类别实体,有很多费用.我想获得给定月份中某类别的所有费用总和:

- (NSNumber *)totalForMonth:(NSDate *)date { ...

NSPredicate *sumPredicate = [NSPredicate predicateWithFormat:@"(ANY %@ <= expenses.created_at) AND (ANY expenses.created_at <= %@)",
                             [date beginningOfMonth], [date endOfMonth]];

NSFetchRequest *req = [[[NSFetchRequest alloc] init] autorelease];
[req setPredicate:sumPredicate];
[req setEntity:entity];

NSError *error;
NSArray *fetchedObjects = [managedObjectContext executeFetchRequest:req error:&error];

return [fetchedObjects valueForKeyPath:@"expenses.@sum.amount"];
Run Code Online (Sandbox Code Playgroud)

}

- (NSNumber *)totalForMonth:(NSDate *)date { ...

NSPredicate *sumPredicate = [NSPredicate predicateWithFormat:@"(ANY %@ <= expenses.created_at) AND (ANY expenses.created_at <= %@)",
                             [date beginningOfMonth], [date endOfMonth]];

NSFetchRequest *req = [[[NSFetchRequest alloc] init] autorelease];
[req setPredicate:sumPredicate];
[req …
Run Code Online (Sandbox Code Playgroud)

iphone core-data objective-c

5
推荐指数
1
解决办法
2091
查看次数

Android SensorManager 中的 getSensorList() 与 getDefaultSensor()

我正在为 Android 编写一个游戏,希望能够使用加速度计进行输入。

我看到有两种获取传感器的方法,一种方法是使用 的第一个元素,SensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER)另一种方法是SensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)

getDefaultSensor文档说它可以返回一个“复合”传感器,所以如果我想要一个“原始”传感器,我应该使用getSensorList.

你知道复合传感器和原始传感器之间有什么区别吗?这甚至适用于加速度计吗?有人有使用包含多个或复合加速度计的设备的经验吗?(或者其他传感器?)

android sensormanager sensors

5
推荐指数
1
解决办法
8506
查看次数