标签: magicalrecord

如何告诉MagicalRecord不使用基于文件的Core Data而是使用内存设置?

我按照这篇伟大的文章进入了关于核心数据的单元测试.设置看起来很简单,只涉及一些视图行代码.

- (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)

core-data objective-c ios5 magicalrecord

9
推荐指数
1
解决办法
1844
查看次数

在View Model上测试RACCommand

我正在尝试测试在我的视图模型上执行的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)

asynchronous mvvm magicalrecord reactive-cocoa

9
推荐指数
1
解决办法
987
查看次数

魔法记录,保存和NSFetchedResultsController

不确定这是魔术记录保存方式的问题,还是我只是在某个地方犯了一个菜鸟错误.

我正在使用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

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

NSPredicate未执行

这很有趣.在我的应用程序中,我在数据库中创建了数千个条目(在另一个线程中,我正在使用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秒.

"第三"声明: …

sqlite core-data nspredicate ios magicalrecord

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

使用magicalrecord替代fetchedResultsController代码?

我正在将我的应用程序的核心数据移动到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)

我应该保留这些代码,还是应该使用魔法记录以不同方式工作?

iphone core-data uitableview ios magicalrecord

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

魔法记录没有保存

我正在使用魔法记录: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)

core-data ios4 ios ios5 magicalrecord

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

如何使用Core Data模型而不保存它们?

我正在编写一个应用程序,我正在使用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];,应用程序不会崩溃,但是当我保存上下文时,我发现从服务器获取的所有海报都是本地保存的.

我怎么解决这个问题?

core-data objective-c ios magicalrecord

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

iCloud超时.(使用iCloud +核心数据+魔法记录

我开始使用app测试Core DataiCloud(使用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)

core-data icloud magicalrecord ios6

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

用魔法记录"导出"核心数据

我正在使用魔法记录并喜欢"导入"功能.

是否有类似的"导出"函数将使用相同的字段名称映射生成JSON兼容对象?

如果我有一个字段为"id"的JSON,我可以将它映射到字段"objectID",以便导入将自动创建"objectID".

我可以使用"objectID"导出对象并生成带有"id"键的字典.

core-data objective-c ios magicalrecord

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

如何在XCTest上使用静态库(例如cocoapods库)?

我正在使用Core Data,因为我的模型变得更复杂,我需要确保我引入的新更改不会在其他部分意外地破坏我的模型.

我可以创建单元测试并在每次更改模型上的内容时运行它们.如果出现问题,我的模型可能有问题,或者至少我知道我必须在主代码/测试中修改一些查询.

我正在使用MagicalRecord来访问一些方便的方法.我也使用cocoapods出于同样的原因,方便.问题是cocoapods创建了一个静态库并将其链接到我的目标,但在Xcode中,新的测试目标不会自动配置为链接到相关目标链接的相同库/框架.

如何针对静态库创建XCTest链接?

这不仅有助于MagicalRecord/Core Data,但是当您使用外部库时,最好进行测试以确保库上的更新不会破坏您的应用程序.

xcode objective-c ios cocoapods magicalrecord

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