如何通过 objectID 关键字查询 CoreData 中的数据?

问答wwq0327 • 于 2015-10-30 01:25:06 +0800 • 最后由 wwq03272015-10-30 04:14:47 +0800 4599 阅读

我想通过objectID作为关键字来查询CoreData中的数据,并将查到的数据作一些修改,代码是这样的:

``` let request = NSFetchRequest() let fetchedID = juzi.objectID.URIRepresentation()

request.entity = NSEntityDescription.entityForName("Juzi", inManagedObjectContext: appDelegate.managedObjectContext) let predicate = NSPredicate(format: "objectID == %i", fetchedID) request.predicate = predicate do { let jz = try appDelegate.managedObjectContext.executeFetchRequest(request) print(jz) } catch { print("没有查询到数据。") } ``` 保存数据时,出现这样的错误:

2015-10-29 17:20:20.543 Meiju[7078:287918] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'keypath objectID not found in entity <NSSQLEntity Juzi id=1>'

我在Stackoverflow上找到这样的贴子,但没太明白是怎么回事。

http://stackoverflow.com/questions/29075910/how-can-i-get-core-data-entity-by-its-objectid

不知道自己在哪里出了问题,还请大家指导下。

感觉这个objectID用法有些奇怪,当然是相对我以前使用Djagno来说的。尽管这个objectID是自动生成的,却又不能直接当成一个字段来用。我在Github上看到的一些代码,也有在数据库字段中直接单设objectID的,而没有使用系统提供的。

ID需要自增涨,如果手动指定的话,明显不太科学,如果是自定义ID的话,如何实现这种自增涨呢?

回复: 5
  • iBcker 2015-10-30 03:32:35 +0800

    objectID不是一个字段,只是NSManagedObject的一个属性而已,你这么查当然就报错了吧。通过id取可以这用NSManagedObjectContext 的 objectWithID:

    另外,

    CoreData其实是sqlite,你加个这个调试没准能帮助你理解·

    file

    --
    关于自增ID,可以看这里 http://stackoverflow.com/questions/24406501/set-auto-increment-in-core-data-ios

  • iBcker 2015-10-30 03:33:41 +0800

    其实我coredata不熟,现查的 :-)

  • wwq0327 2015-10-30 04:01:34 +0800

    @iBcker 谢谢。

    我又花了些时间找,但仍没找到这个该如何用的。刚刚才找到一个笨办法:

    我之所以想用ID去查,我认为同一表中,ID是唯一的,这样不至于出现重复的数据, 即然这样,我就在查询的时候多用几个字段了。原来用一个字段,可以会出现重复的情况,那我就直接把时间字段与用户名也放进去,这样就不可能用重复的了,同一用户,同一时间,输入两个相同的内容,这种可能性正常情况下是不会出现的。

    这样就解决了问题,不过觉得不太优雅,后现熟悉了,想还是想看能不能用一个唯一的ID去查。

  • iBcker 2015-10-30 04:09:20 +0800

    objectWithID不行么?

  • wwq0327 2015-10-30 04:14:47 +0800

    @iBcker 郁闷了,原来我想得太复杂了!

    修改数据的代码这样就成了:

    ```

            let jzObject = appDelegate.managedObjectContext.objectWithID(juzi.objectID) as! Juzi
            jzObject.content = textView.text
            jzObject.from = fromTextLabel.text
    
            try! appDelegate.managedObjectContext.save()
    

    ```

    我中午的时候,知道使用objectWithID这个方法可以拿到数据,但我以为这只是一个按ID查数据而已,不能进行修改。

    结果,我刚刚试了一下,拿到的数据可以修改,然后再保存一下就OK了。这个方法简单多了。

    谢谢你的回复。

  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,见 Emoji cheat sheet
  • @name 会链接到用户页面,并会通知他
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
Ctrl+Enter