我已经以一些简单的方式更新了现有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) 的背景
NSMigratePersistentStoresAutomaticallyOption
密钥传入字典来启用迁移
[NSNumber
numberWithBool:YES].modelByMergingModels: 问题
无论我做什么迁移,我都会收到错误消息:
"持久存储迁移失败,缺少源管理对象模型."
我试过的
我的智慧结束了.
我不禁想到我在某个地方犯了一个很大的错误,我没有看到.有任何想法吗?
我现在有大约4个不同版本的数据模型,除了最后一个版本之外的每个版本都只是使用自动轻量级迁移的一个小改动.对于这个最新的模型,我需要在迁移期间做一些额外的工作,所以我创建了一个自定义映射模型和一个迁移策略子类,其中包含createDestinations和createRelationships中的一些操作.问题是,我没有调用我的映射模型/自定义策略,而且似乎Core Data正在尝试执行轻量级迁移.我是否需要做些什么来保持轻量级迁移,但是当有可用的映射模型时使用我的映射模型?
我正在使用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有一些口头禅吗?
这个问题关系到这一个-但我没有要求上遵循的路径建议.我在问为什么这条路有这么大的陷阱以及如何绕过它.
我的一些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) 我有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)
有谁知道如何升级这个?谢谢.
我在他的核心数据书中读过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) 我对Core Data和KVC比较陌生,但是我想要一些关于注册Core Data对象更改的指针.情况如下:
我有一个NSManagedObject叫Patient,另一个叫Medication.A Patient可能有很多Medications,而且Medication有一个startOn和endOn日期.
我想以某种方式监听endOn所有Medication对象属性的更改.发生更改时,我想在iOS设备上安排本地通知.我之前使用过本地通知,但不知道在这种情况下将代码放在何处.
我是否在App Delegate中创建调度代码并以某种方式注册App Delegate以侦听Medication对象中的更改?这需要附加到NSManagedObjectContext?
这是怎么做到的?指针将非常感谢!
谢谢!
我有一个类别实体,有很多费用.我想获得给定月份中某类别的所有费用总和:
- (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) 我正在为 Android 编写一个游戏,希望能够使用加速度计进行输入。
我看到有两种获取传感器的方法,一种方法是使用 的第一个元素,SensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER)另一种方法是SensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)。
该getDefaultSensor文档说它可以返回一个“复合”传感器,所以如果我想要一个“原始”传感器,我应该使用getSensorList.
你知道复合传感器和原始传感器之间有什么区别吗?这甚至适用于加速度计吗?有人有使用包含多个或复合加速度计的设备的经验吗?(或者其他传感器?)
core-data ×8
iphone ×6
cocoa ×3
migration ×3
objective-c ×3
android ×1
bluetooth ×1
cocoa-touch ×1
crash ×1
sensors ×1