我按照这篇伟大的文章进入了关于核心数据的单元测试.设置看起来很简单,只涉及一些视图行代码.
- (void)setUp;
{
[MagicalRecord setDefaultModelWithClass:[self class]];
[MagicalRecord setupCoreDataStackWithInMemoryStore];
}
- (void)tearDown;
{
[MagicalRecord cleanUp];
}
- (void)testSomeCalculationOnMyEntity;
{
NSNumber *count = [MyEntity MR_numberOfEntities];
// STAssert([testEntity customCalculation] == expectedValue, @"expected a good calculation");
}
@end
Run Code Online (Sandbox Code Playgroud)
问题是,每次我通过调用(如上所述)检查内核设置的核心数据中的实体数量[MyEntity MR_numberOfEntities],我得到的对象数量,存储在基于文件的设置中,这是一个几千个对象.这是怎么发生的?我的意思是第二行setUp表示内存中的一行,不是吗?这种情况应该返回0作为存储的对象数量.
谢谢你的任何建议!
编辑:
@casademora让我走上正轨.以下工作设置现在对我来说很好.
- (void)setUp;
{
[MagicalRecord cleanUp]; // This solved the mystery.
// I don't now why I had to remove this line, though.
// [MagicalRecord setDefaultModelWithClass:[self class]];
[MagicalRecord setupCoreDataStackWithInMemoryStore];
}
- (void)tearDown; …Run Code Online (Sandbox Code Playgroud) 我正在尝试测试在我的视图模型上执行的RACCommand的结果.
我这样设置我的提交命令:
- (void) createSubmitCommand
{
@weakify(self);
self.submitCommand = [RACCommand commandWithCanExecuteSignal: [self validSignal]];
self.submitSignal = [self.submitCommand
addSignalBlock:^RACSignal *(id value) {
@strongify(self);
return [self save];
}];
}
- (RACSignal *) save
{
RACSubject *saveSubject = [RACSubject subject];
[self.model.managedObjectContext MR_saveOnlySelfWithCompletion:^(BOOL success, NSError *error) {
if (!success)
{
[saveSubject sendError: error];
}
else
{
[saveSubject sendNext: nil];
[saveSubject sendCompleted];
}
}];
return saveSubject;
}
Run Code Online (Sandbox Code Playgroud)
当我初始化我的视图模型并且validSignal在测试上下文中有效时,将调用createSubmitCommand.
我正在使用MagicalRecord进行核心数据持久性测试和Kiwi测试.当我调用我的模型保存的[[viewModel submitCommand] execute:nil]时,我需要测试一下.
我的测试看起来像这样:
__block NSArray *models = nil;
[[vm submitSignal] subscribeNext:^(id x) {
models = [Model MR_findAll]; …Run Code Online (Sandbox Code Playgroud) 不确定这是魔术记录保存方式的问题,还是我只是在某个地方犯了一个菜鸟错误.
我正在使用NSFetchedResultController(FRC)和UITableView来显示实体列表,当用户点击"添加"新的视图控制器时,推送编辑器,创建一个新的实体[MyEntity MR_createEntity].用户可以在此添加通过关系添加到主实体的其他实体.当用户点击此视图控制器中的"保存"时,将使用保存上下文[[NSManagedObjectContext MR_contextForCurrentThread] MR_save]
NSFetchedResultsController似乎更新,但是当我点击编辑实体时,没有任何子实体存在.调试似乎表明即使实体已被保存,FRC仍然具有带有临时ID的实体.
我[self.tableView reloadData]在FRC controllerDidChangeContent委托方法中做得很天真.
重新启动应用程序将加载正确的实体,并在编辑器视图控制器中正确显示子实体.
看起来FRC响应"主线程"保存事件,但保存实际上发生在后台线程上,因此FRC看不到它.我检查了所有"我的"操作(设置FRC,创建和获取实体)都发生在主线程上下文中.
我尝试在MR_rootSavingContext上侦听更改通知并将它们与主线程上下文合并,这种方式有效但我最终在FRC中有重复行(一个是正确的"永久"实体,一个是临时实体).
core-data objective-c nsfetchedresultscontroller magicalrecord
这很有趣.在我的应用程序中,我在数据库中创建了数千个条目(在另一个线程中,我正在使用MagicalRecord).一切似乎都很好(从背景/前景/上下文的角度来看).
当在主线程中,我尝试获取"刚插入"的数据时,我发现了以下行为:
- (NSArray *) familiesInCompany:(Company *) company {
NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"company == %@", company];
NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"company.name == %@", company.name];
NSArray *first = [Family MR_findAllSortedBy:@"name" ascending:YES withPredicate:predicate1];
NSArray *second = [Family MR_findAllSortedBy:@"name" ascending:YES withPredicate:predicate2];
NSArray *third = [Family MR_findByAttribute:@"company" withValue:company andOrderBy:@"name" ascending:YES];
return second;
}
Run Code Online (Sandbox Code Playgroud)
现在我得到的是:
Family对象,如预期的那样通过调试SQL语句,我得到以下内容:
"第一"声明:
CoreData:注释:总获取执行时间:0行为0.0000s.
"第二个"声明":
CoreData:sql:SELECT 0,t0.Z_PK,t0.Z_OPT,t0.ZNAME,t0.ZCOMPANY FROM ZFAMILY t0 JOIN ZCOMPANY t1 ON t0.ZCOMPANY = t1.Z_PK WHERE t1.ZNAME =?ORDER BY t0.ZNAME
CoreData:annotation:sql连接获取时间:0.0005s
CoreData:注释:总获取执行时间:2行0.0007秒.
"第三"声明: …
我正在将我的应用程序的核心数据移动到Magical Record.为了更新UITableView,我以前有这个代码:
- (NSFetchedResultsController *)fetchedResultsController {
if (_fetchedResultsController != nil) {
return _fetchedResultsController;
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Entry" inManagedObjectContext:[CoreDataStore mainStore].context];
[fetchRequest setEntity:entity];
[fetchRequest setFetchBatchSize:20];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"creationDate" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
// Use the sectionIdentifier property to group into sections.
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[CoreDataStore mainStore].context sectionNameKeyPath:@"sectionIdentifier" cacheName:@"Root"];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;
self.fetchedResultsController.delegate = self;
return _fetchedResultsController;
}
Run Code Online (Sandbox Code Playgroud)
我应该保留这些代码,还是应该使用魔法记录以不同方式工作?
我正在使用魔法记录:https: //github.com/magicalpanda/MagicalRecord
我试图使用魔法记录和核心数据保存从我的网站到sqllite数据库的记录,但我一直收到错误:
MR_saveWithErrorCallback:](0xaaa6bd0) NO CHANGES IN CONTEXT <NSManagedObjectContext (0xaaa6bd0): *** BACKGROUND SAVING (ROOT) ***> on *** BACKGROUND THREAD *** - NOT SAVING
Run Code Online (Sandbox Code Playgroud)
这是代码:
for(int i = 0; i < count; i += 1)
{
// results = array of all services from site
NSDictionary * result = [results objectAtIndex: i];
NSNumber * sid = @([[result objectForKey: @"id"] intValue]);
NSNumber * parent = @([[result objectForKey: @"parent"] intValue]);
Service * service = [Service createEntity];
NSString * image = [NSString …Run Code Online (Sandbox Code Playgroud) 我正在编写一个应用程序,我正在使用MagicalRecord作为与Core Data交互的框架.应用程序从服务器获取一系列海报,然后显示它们.也可以在应用程序上创建海报,然后在用户需要时上传到服务器.
因此,用户创建的海报使用Core Data存储在本地数据库中,而从服务器获取的海报应仅显示在应用程序中,但不能保存在本地.我如何使用相同的Poster类(现在是NSManagedObject的子类)来处理这两种情况?
这是我的班级:
@interface Poster : NSObject
@property (nonatomic, retain) NSNumber * posterID;
@property (nonatomic, retain) NSString * artists;
@end
Run Code Online (Sandbox Code Playgroud)
当我从服务器获取海报数组时,我分配一个新的海报,然后分配属性:
Poster *poster = [[Poster alloc] init];
if ([dict objectForKey:@"id"]) poster.posterID = [dict objectForKey:@"id"];
if ([dict objectForKey:@"artists"]) poster.artists = [dict objectForKey:@"artists"];
Run Code Online (Sandbox Code Playgroud)
但是当到达链接的poster.posterID = [dict等等时,应用程序崩溃时出现此错误
由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' - [Poster setPosterID:]:无法识别的选择器发送到实例0xaa8b160'
如果我用Poster *poster = [Poster createEntity];而不是创建新对象Poster *poster = [[Poster alloc] init];,应用程序不会崩溃,但是当我保存上下文时,我发现从服务器获取的所有海报都是本地保存的.
我怎么解决这个问题?
我开始使用app测试Core Data和iCloud(使用Magical Records).在配置Provisioning Profiles和权利很多麻烦后,应用程序最终运行.一段时间后,应用程序崩溃并抛出此消息::
2012-12-31 03:42:07.079 iCloudTest[252:1103] -[PFUbiquitySafeSaveFile waitForFileToUpload:](268): CoreData: Ubiquity: <PFUbiquityPeerReceipt: 0x1cd5a420>(0)
permanentLocation: <PFUbiquityLocation: 0x1cd57b30>: /private/var/mobile/Library/Mobile Documents/MA5BADG5AW~com~gazapps~iCloudTest/mobile.4088E03C-763E-5A81-BB1B-64CABAFA73E3/com.gazapps.iCloudTest/v8GumdiUYmkE0aO9iGtPTPHX07qqWk7kRytsQwHKjwU=/receipt.0.cdt
safeLocation: <PFUbiquityLocation: 0x1cd57a80>: /private/var/mobile/Library/Mobile Documents/MA5BADG5AW~com~gazapps~iCloudTest/mobile.4088E03C-763E-5A81-BB1B-64CABAFA73E3/com.gazapps.iCloudTest/v8GumdiUYmkE0aO9iGtPTPHX07qqWk7kRytsQwHKjwU=/mobile.4088E03C-763E-5A81-BB1B-64CABAFA73E3.0.cdt
currentLocation: <PFUbiquityLocation: 0x1cd57a80>: /private/var/mobile/Library/Mobile Documents/MA5BADG5AW~com~gazapps~iCloudTest/mobile.4088E03C-763E-5A81-BB1B-64CABAFA73E3/com.gazapps.iCloudTest/v8GumdiUYmkE0aO9iGtPTPHX07qqWk7kRytsQwHKjwU=/mobile.4088E03C-763E-5A81-BB1B-64CABAFA73E3.0.cdt
kv: (null)
Safe save failed for file, error: Error Domain=NSCocoaErrorDomain Code=512 "The file upload timed out." UserInfo=0x1cd5b7d0 {NSLocalizedDescription=The file upload timed out.}
2012-12-31 03:42:07.083 iCloudTest[252:1103] +[MagicalRecord(ErrorHandling) defaultErrorHandler:](0xe5ac0) Error: The file upload timed out.
2012-12-31 03:42:07.085 iCloudTest[252:1103] +[MagicalRecord(ErrorHandling) defaultErrorHandler:](0xe5ac0) Error Message: The file upload timed out.
2012-12-31 …Run Code Online (Sandbox Code Playgroud) 我正在使用魔法记录并喜欢"导入"功能.
是否有类似的"导出"函数将使用相同的字段名称映射生成JSON兼容对象?
即
如果我有一个字段为"id"的JSON,我可以将它映射到字段"objectID",以便导入将自动创建"objectID".
我可以使用"objectID"导出对象并生成带有"id"键的字典.
我正在使用Core Data,因为我的模型变得更复杂,我需要确保我引入的新更改不会在其他部分意外地破坏我的模型.
我可以创建单元测试并在每次更改模型上的内容时运行它们.如果出现问题,我的模型可能有问题,或者至少我知道我必须在主代码/测试中修改一些查询.
我正在使用MagicalRecord来访问一些方便的方法.我也使用cocoapods出于同样的原因,方便.问题是cocoapods创建了一个静态库并将其链接到我的目标,但在Xcode中,新的测试目标不会自动配置为链接到相关目标链接的相同库/框架.
如何针对静态库创建XCTest链接?
这不仅有助于MagicalRecord/Core Data,但是当您使用外部库时,最好进行测试以确保库上的更新不会破坏您的应用程序.
magicalrecord ×10
core-data ×8
ios ×6
objective-c ×5
ios5 ×2
asynchronous ×1
cocoapods ×1
icloud ×1
ios4 ×1
ios6 ×1
iphone ×1
mvvm ×1
nspredicate ×1
sqlite ×1
uitableview ×1
xcode ×1