我正在使用核心数据构建应用程序.由appDelegate加载的我的RootViewController主要来自模板.但是我已将实体名称更改为"Clocks"并添加了一堆行.
我的RootViewController提供了一个带有UINavigationController的MVC.当我将数据保存到我的数据库时,UINavigationController类使用[[UIApplication sharedApplication]delegate]来保存数据以访问我的appDelegate,它实际上预先执行了保存操作.编辑数据的方式相同,但不是在我的app委托中调用insert函数,而是调用update函数.
现在,这一切都很好..实际上完全正确.但是......几次打开编辑并保存在视图中我的应用程序崩溃了.它在模拟器和我的iPhone 4上都是这样做的.这是我的意思的一个例子(电影):http://dl.dropbox.com/u/3077127/has_been_invalidated.mov
这是我的RootViewController.m的代码:
#import "RootViewController.h"
#import "RootViewControllerClockCell.h"
#import "RootViewControllerClockCellFooter.h"
#import "configuration.h"
#import "AddClockViewController.h"
#import "clockAppDelegate.h"
#import "AddClockNavigationController.h"
@interface RootViewController ()
- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath;
@end
@implementation RootViewController
@synthesize fetchedResultsController=fetchedResultsController_, managedObjectContext=managedObjectContext_;
#pragma mark -
#pragma mark View lifecycle
- (void)viewDidLoad {
[super viewDidLoad];
[self setTitle:NSLocalizedString(@"Alarms", @"AddClockNavigationController")];
// Set up the edit and add buttons.
self.navigationItem.leftBarButtonItem = self.editButtonItem;
UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(showAddAlarmView)];
self.navigationItem.rightBarButtonItem = addButton;
[addButton release];
[self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone]; …Run Code Online (Sandbox Code Playgroud) 我有一个Person属于Department一对多关系的实体.
我希望能够删除Department时,有没有更多的Person与它(或者通过缺失的相连的S Person实体,或更改了Person的department属性).现在,我正在尝试使用以下处理程序NSManagedObjectContextObjectsDidChangeNotification(目前只是尝试查看删除,并正确删除):
- (void)managedObjectDidChange:(NSNotification *)notification {
NSSet *updatedObjects = [[notification userInfo] objectForKey:NSDeletedObjectsKey];
for (NSManagedObject *obj in updatedObjects) {
if ([obj.entity.name isEqualToString:@"Person"]) {
NSLog(@"Person Changed");
NSManagedObject *department = [(Person *)obj department];
NSLog(@"%i", [[department valueForKey:@"person"] count]);
if ([[department] valueForKey:@"person"] count] == 0) {
NSLog(@"Department has no more people associated with it");
// deletion code
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我删除某个人时,与该部门相关联的人数不会改变.我没有对Department实体进行提取.那是我应该做的吗?
cocoa cocoa-touch core-data nsmanagedobject nsmanagedobjectcontext
如何检查NSManagedObjectContext未保存?
我有一个按钮,它将Core Data SQLite中的一个选定条目标记为"收藏夹",这意味着我只是BOOL将该索引从off更改为on.
目前,当我这样做,我叫save上了managedObjectContext,这也许需要500毫秒,更也许有点,根据仪器.
我有一些代码同时执行,触发了一个漂亮的小粒子爆炸("万岁,最喜欢的!"),但我遇到的问题是爆炸延迟到save完成之后.
我不知道为什么,因为触发爆炸的代码是在save调用之前.我是一个相对较新的程序员,所以也许我错过了一些东西,但是在这样的情况下不会逐行执行代码执行,因为爆炸会触发,然后保存将在它发生时发生?这里的委托调用也可能需要一些时间,但同样的问题适用,为什么它会在这些代码行之后重要?
编辑:我是否正确地说,在下一行代码出现粒子之前,主线程被阻塞,这意味着UI无法自行更新?
这是我的代码:
// Particle animation
LikeExplosion *likeExplosionView = [[LikeExplosion alloc] initWithFrame: CGRectMake(0, 0, 320, 400)];
[likeExplosionView setUserInteractionEnabled: NO];
[self.view addSubview: likeExplosionView];
[self.view bringSubviewToFront: likeExplosionView];
[likeExplosionView decayOverTime: 1.1];
// Delegate call to reload tableview elsewhere
[self.delegate detailViewControllerDidLikeLine];
// Update current object
[_selectedLine setIsLiked: [NSNumber numberWithBool: YES]];
[_selectedLine setIsDisliked: [NSNumber numberWithBool: NO]];
// Update context
NSError *error;
if (![[[CDManager sharedManager] managedObjectContext] save:&error]) NSLog(@"Saving changes failed: …Run Code Online (Sandbox Code Playgroud) 我使用托管对象上下文的回滚方法来丢弃所做的更改但我遇到了一个问题:如果我有不同的视图控制器,并且每个视图控制器都可以对不同的数据库数据进行更改,并且如果第一个控制器执行回滚方法,我不希望它回滚第二个控制器所做的更改.无论如何只是回滚一个特定的实体,但不是全部?或者我应该使用多个托管对象上下文?
我正在尝试创建一个应用程序,用户可以在其中编辑managedObject视图中的a 属性,并选择Done保留更改或Cancel撤消更改.
为了实现这种行为,我打算做以下事情 -
managedObject,创建一个backupManagedObject原始的克隆managedObject.backupManagedObject是在单独的子ManagedObjectContext中创建的.managedObject.Done按下,原始文件managedObject被保留,备份被删除Cancel按下,将backupManagedObject其克隆为原始文件managedObject并删除备份我的问题是,一旦我完成了backupManagedObject,我怎么能删除childManagedObjectContext哪个将没有更多的托管对象,我不打算再使用它们(对于每个新的视图控制器,我打算只创建一个新的子托管对象上下文并在视图控制器完成后将其销毁).
core-data objective-c nsmanagedobject nsmanagedobjectcontext ios
我正在尝试从保存在用户默认值中的NSURL中检索和创建托管对象,但我无法弄清楚如何使用managedObjectIDForURIRepresentation函数.我的代码看起来像这样:
func setCoreData(){
let defaults = NSUserDefaults.standardUserDefaults()
let usedKeyName = "timerList"
let usedList = defaults.objectForKey(usedKeyName) as? [NSURL] ?? []
let url:NSURL = usedList[0] as NSURL
let managedobject:NSManagedObjectID = //What do I write here?
}
Run Code Online (Sandbox Code Playgroud)
任何建议,将不胜感激.
NSManagedObjectContext保存子项并将更改推送到父项时如何解决冲突NSManagedObjectContext?
例如,假设您正在使用来自服务器的数据在子上下文NSManagedObject Person中将属性设置age为 18进行更新NSPrivateQueueConcurrencyType。在同一时间,同一NSManagedObject Person age属性由在父用户更新到20的值NSManagedObjectContext与NSMainQueueConcurrencyType。
在两次更新之后,都会在传播到父级的子上下文上调用保存NSManagedObjectContext。
此时的年龄值是多少?孩子会NSManagedObjectContext覆盖父母NSManagedObjectContext吗?在NSMergePolicies这里申请吗?
concurrency core-data nsmanagedobjectcontext ios nspersistentstore
我在测试、开发或使用过程中遇到了一些我从未经历过的崩溃。
我可以在 Fabric Dashboard 上看到它们,它涉及 NSManagedObjectContext。
这是对 StackTrace 的第一次调用:
CDFavori* fav = [CDFavori favoriWithIndicatif:homeFavoriteIndicatif context:[MyAppDelegate mainContext]];
Run Code Online (Sandbox Code Playgroud)
CDFavori 是一个表示 CoreData 对象的类,它被扩展以实现一些方法(为了获取):
+(CDFavori *)favoriWithIndicatif:(NSString*)indicatif context:(NSManagedObjectContext*)context
{
if (nil == indicatif || nil == context)
return nil;
NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"CDFavori"];
[request setPredicate:[NSPredicate predicateWithFormat:@"indicatif LIKE %@", indicatif]];
NSError *error = nil;
NSArray *favoris = [context executeFetchRequest:request error:&error];
CDFavori *fav = nil;
if (nil != error) {
DDLogError(@"Error = %@ (%@)", indicatif, error);
} else if (0 < [favoris count])
{
fav …Run Code Online (Sandbox Code Playgroud) core-data objective-c nsmanagedobject nsmanagedobjectcontext ios
我正在使用核心数据,但我对NSManagedObjectContext. 我使用以下代码来保存我的图书数据。书籍数据保存在我的应用程序扩展一侧,如下所示。扩展侧代码块的调用方式与主线程不同,如图所示。

我想知道这是否会因为滥用我的上下文而导致问题?
func saveBook() {
let book: Book = Book(context: viewContext)
let uuid = UUID()
book.sessionId = uuid
book.appId = session.appId
book.startedAt = session.startedAt
book.createdBy = AppData.installId
coreData.saveSync()
}
func saveSync() {
let privateContext = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
privateContext.parent = viewContext
privateContext.perform {
do {
try privateContext.save()
viewContext.performAndWait {
do {
try viewContext.save()
} catch {
let nsError = error as NSError
print("Unresolved error \(nsError), \(nsError.userInfo)")
}
}
} catch {
let nsError = error as NSError
print("Unresolved …Run Code Online (Sandbox Code Playgroud) core-data ×10
ios ×7
objective-c ×4
swift ×2
cocoa ×1
cocoa-touch ×1
concurrency ×1
ios4 ×1
structure ×1