实时coredata自动保存

时间:2013-06-20 14:11:24

标签: objective-c core-data autosave

我有一个小状态栏应用。当我关闭窗口时,它会保存,当我退出应用程序时它会保存,但每次我在tableview中编辑一行时都不会保存,或者我向arraycontroller添加了一些东西。 是否有一种方法可以至少在每次“输入”命中时或在我确认编辑时调用saveAction? 保存按钮不是我正在搜索的内容。 提前谢谢。

3 个答案:

答案 0 :(得分:1)

这是我的方法:

1)创建NSManagedObject的子类以添加自动保存功能。如果您在其他位置定义了全局函数,则可以用do { try managedObjectContext?.save() } catch { print(error) }之类的行替换行saveContext()。请注意,默认情况下会禁用autosave

class AutoSaveManagedObject: NSManagedObject {
    class var autosave: Bool { return false }
    var autosave: Bool?

    private var previousValue: AnyObject?

    override func willChangeValueForKey(key: String) {
        super.willChangeValueForKey(key)
        if ( autosave == true ) || ( autosave == nil && self.dynamicType.autosave ) {
            previousValue = valueForKey(key)
        }
    }

    override func didChangeValueForKey(key: String) {
        super.didChangeValueForKey(key)
        if ( autosave == true ) || ( autosave == nil && self.dynamicType.autosave ) {
            if "\(previousValue)" != "\(valueForKey(key))" {
                do { try managedObjectContext?.save() } catch { print(error) }
            }
            previousValue = nil
        }
    }
}

2)使所有核心数据对象成为AutoSaveManagedObject的子类而不是NSManagedObject的子类。如果你想启用自动保存,你应该写这样的东西:

class MyMO: AutoSaveManagedObject {

    override class var autosave: Bool { return true }

    // Your @NSManaged vars here

}

3)现在MyMO的所有实例都启用了自动保存。如果要为某个实例禁用它,可以随时写:

let myMO = ... as? MyMO
myMO?.autosave = false

请注意,实例var autosave的优先级始终高于class var autosave,因此您可以设置myMO?.autosave = nil以使用默认的autosave设置上课。

答案 1 :(得分:0)

我只是将视图控制器设置为textfield和textview的委托。在iOS环境中,您可以将协议UITextFieldDelegate和UITextViewDelegate添加到视图控制器头文件中,并分别为UITextField和UITextView实现方法- (void)textFieldDidEndEditing:(UITextField *)textField- (void)textViewDidEndEditing:(UITextView *)textView

作为UITextField(iOS)的替代方法,有一个名为- (BOOL)textFieldShouldReturn:(UITextField *)textField的委托方法,只要在UITextField上按下“enter”键,就会调用该方法。

在Mac OSX环境中,您可以将适当的协议添加到视图控制器头文件中(对于NSTextView添加NSTextDelegate,为NSTextField添加NSControlTextEditingDelegate),然后为NSTextView实现适当的方法:-(void)textDidChange:(NSNotification *)notification和{ {1}}表示NSTextField。

您可以在这些方法中进行任何类型的验证,然后在返回之前拨打- (BOOL)control:(NSControl *)control textShouldEndEditing:(NSText *)fieldEditor

答案 2 :(得分:-1)

在该方法中编辑行时,请编写此代码

[[NSNotificationCenter defaultCenter] addObserver:self selector:(autosaveCoreData:) name:nil object:your_tableview_object];

- (无效)autosaveCoreData:(比赛*)事件{

event = (Event *)[NSEntityDescription insertNewObjectForEntityForName:@"Event"      inManagedObjectContext:_managedObjectContext];

[event setValue:Attribute_Value forKey:@"your atttribute"];
NSError *error;
if (![_managedObjectContext save:&error]) {

}
  }
}

我希望这可以解决你的问题