好的,直截了当......
这是我第一次使用Magical Panda的神奇记录我跟随来自http://yannickloriot.com/2012/03/magicalrecord-how-to-make-programming-with-core-data-pleasant/的 tutroial
这是我的代码
Person.h
@property (nonatomic, retain) NSString * firstname;
@property (nonatomic, retain) NSString * lastname;
@property (nonatomic, retain) NSNumber * age;
Run Code Online (Sandbox Code Playgroud)
AppDelegate.M
@implementation AppDelegate
- (void)dealloc
{
[_window release];
[_viewController release];
[super dealloc];
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[MagicalRecord setupCoreDataStackWithStoreNamed:@"MyDatabase.sqlite"];
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
// Override point for customization after application launch.
self.viewController = [[JASidePanelController alloc] init];
self.viewController.shouldDelegateAutorotateToVisiblePanel = NO;
// self.viewController = [[[ViewControllerCenter alloc] initWithNibName:@"ViewController" bundle:nil] autorelease];
self.viewController.centerPanel = …Run Code Online (Sandbox Code Playgroud) 只是我有一个应用程序和今天的扩展。我还有两个实体:Goal和Service。
@objc(Goal)
class Goal: NSManagedObject {
@NSManaged var identifier: String
@NSManaged var startDate: Date
@NSManaged var endDate: Date
private var services: [Service] {
let predicate = NSPredicate(format: "date >= %@ && date <= %@", startDate as NSDate, endDate as NSDate)
return Service.mr_findAll(with: predicate) as! [Service]
}
var duration: Int64 {
return services.reduce(0) { $0 + $1.duration }
}
}
Run Code Online (Sandbox Code Playgroud)
当我在今天的扩展程序中创建service相关并goal在应用程序中更新它时,更新的结果在今天的扩展程序中不可见,而在应用程序中正确显示。为什么?
这是我在扩展或扩展中创建和更新记录的方式:
MagicalRecord.save({ context in
Service.createOrUpdate(withDuration: duration, date: Date(), identifier: identifier, …Run Code Online (Sandbox Code Playgroud) 获取记录时如何获取最新记录?
例如:
现在当我拿它
SomeDatabase *Country = [SomeDatabase MR_findFirst];
NSLog(@"Country Name---->%@",Country.Name);
Run Code Online (Sandbox Code Playgroud)
我得到"新加坡",
我想把最后一条记录插入到coredata,它应该是"USA".
我正在尝试将魔法记录合并到我的项目中,我很喜欢它,但有一件事我无法弄清楚如何处理是获取请求的计数.我知道你可以执行一个获取请求,但据我所知,Magical Record无法对一个执行计数.我觉得它必须是一个请求的原因是因为我只想要不同对象的数量.
有谁知道有效地做到这一点的方法?即,这种方式不需要我实际对对象执行获取并获取结果数组的计数.这个fetch必须尽可能快地运行,因为它有可能经常被调用.
我正在使用魔法记录来帮助核心数据保存和多线程.
我用GCD开始一个新线程.在那个新线程中,我检查一个实体是否存在; 如果不是,我想创建一个新的并保存.
saveUsingCurrentThreadContextWithBlock^(NSManagedObjectContext *localContext){}如果在非主线程上调用它,将返回主线程保存吗?
或者我应该将上下文传递给新线程?
编辑:
在主线程上,我创建一个MBProgress指标并创建一个新线程:
MBProgressHUD *HUD = [MBProgressHUD showHUDAddedTo:self.mapView animated:YES];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
Person *person = [Person MR_findFirstByAttribute:NAME withValue:self.user.username];
if (person == NULL) {
NSLog(@"SEPERATE THREAD | person %@ does not exist, creating", self.user.username);
person = [Person MR_createEntity];
person.name = self.user.username;
person.uid = self.user.UID;
[[NSManagedObjectContext MR_contextForCurrentThread] MR_saveOnlySelfWithCompletion:^(BOOL success, NSError *error) {
[MBProgressHUD hideHUDForView:self.mapView animated:YES];
Person *person = [Person MR_findFirstByAttribute:NAME withValue:self.user.username];
if (person) {
NSLog(@"COMPLETION BLOCK | person exists: %@", person.name);
}
}];
}
else { …Run Code Online (Sandbox Code Playgroud) 如何刷新该死的Core Data对象?
请原谅,我只想删除对象20分钟.删除就好了,但Core Data会在一段时间后引发异常.
我到目前为止尝试过:
删除所有对象(MR_truncateAll),然后保存.
删除所有对象,处理挂起的更改,保存.
关闭撤消管理器,删除,转回撤消管理器.
删除Core Data sqlite文件,销毁上下文,然后重新创建.
使用[MagicalRecord cleanUp],删除核心数据sqlite文件.
尽管如此,当我想创建对象时,经过2-3次尝试后,我将获得Faulting,然后因故障而崩溃.
CoreData could not fulfill a fault for '0xd000000000840002 <x-coredata://...
(
0 CoreFoundation 0x0000000102016795 __exceptionPreprocess + 165
1 libobjc.A.dylib 0x0000000101d79991 objc_exception_throw + 43
2 CoreData 0x0000000100265a93 _PFFaultHandlerLookupRow + 1075
3 CoreData 0x00000001002f33a3 -[NSManagedObject(_NSInternalMethods) _updateFromRefreshSnapshot:includingTransients:] + 243
4 CoreData 0x0000000100297563 -[NSManagedObjectContext(_NestedContextSupport) _copyChildObject:toParentObject:fromChildContext:] + 771
5 CoreData 0x000000010029701b -[NSManagedObjectContext(_NestedContextSupport) _parentProcessSaveRequest:inContext:error:] + 1019
6 CoreData 0x00000001002fd243 __82-[NSManagedObjectContext(_NestedContextSupport) executeRequest:withContext:error:]_block_invoke + 563
7 libdispatch.dylib 0x0000000102ce005a …Run Code Online (Sandbox Code Playgroud) 当我只是调用MR_createEntity时,我得到一个exc_bad_access错误.由于我是magicalRecord的新手,我无法找到bug的来源.
代码 :
TMTAppDelegate.m
//TMTAppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[MagicalRecord setupAutoMigratingCoreDataStack];
NSArray *trajetsRawArray = @[@{@"km" : @125, @"mn":@110, @"adressStart" : @"Metz", @"adressEnd" : @"Gérardmer", },
@{@"km" : @4, @"mn":@14, @"adressStart" : @"Plappeville", @"adressEnd" : @"Metz"},
@{@"km" : @312, @"mn":@200, @"adressStart" : @"Metz", @"adressEnd" : @"Paris"},
@{@"km" : @413, @"mn":@236, @"adressStart" : @"Marseille", @"adressEnd" : @"Toulouse"},
@{@"km" : @2, @"mn":@4, @"adressStart" : @"Ban-St-Martin", @"adressEnd" : @"Metz"},
@{@"km" : @65, @"mn":@63, @"adressStart" : @"Metz", @"adressEnd" : @"Gérardmer"}
];
//[[UINavigationBar appearance] …Run Code Online (Sandbox Code Playgroud) 我使用lib MagicalRecord(https://github.com/magicalpanda/MagicalRecord)进行CoreData.framework.
我不明白如何使用临时对象.
如何为临时对象创建NSManagedContext以及在关闭控制器后是否删除每个NSManagedObject?
在objC中,saveWithBlock的方法是
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
// This block runs in background thread
} completion:^(BOOL success, NSError *error) {
// This block runs in main thread
}];
Run Code Online (Sandbox Code Playgroud)
在我的一生中,我无法正确使用正确的Swift块/关闭语法。不知道为什么这没引起我的注意。有人可以伸出援助之手,制作出上述内容的快速版本吗?