V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
a412739861
V2EX  ›  iDev

CoreData 数据读取的问题。

  •  
  •   a412739861 · 2015-07-10 23:01:34 +08:00 · 4040 次点击
    这是一个创建于 3416 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在了解了一点点关于core data的内容后,想搭配UITableView的显示表格详情,就不用每次都下载了。 先是从网上找了知乎日报的一个JSON,使用core data,创建了NSmanagedObject的子类storylist,里面放了title和url。然后建了一个DataManager的class处理数据。

    使用AFN下载JSON,通过NSManagedObjectModel,NSManagedObjectContext,NSPersistentStoreCoorDinator 三个属性组合存储数据,存储成功了,这里应该没问题吧?

    然后使用NSFetchRequest 返回的是一个NSArry。在DataManager下面,返回的数组,可以使用for in历遍,使用for Storylist *story in NSArray 通过story.title,把title一个个打印出来。

    到了tableview里面使用这个数组进行处理时,只能有整个数组,或者打印出数组里面包含的一堆内容一起,但是无法把里面的title打印出来了。如果使用for Storylist *story in NSArray ,打印story.title,都是null。打印NSArry的话,内容如下:

    <StoryList: 0x7fdc9b456e40> (entity: StoryList; id: 0xd000000000040000 <x-coredata://45DF0C4C-B048-4F53-8DF5-B845F546BD08/StoryList/p1> ; data: <fault>)
    主要是没什么特别的思路,在《iOS编程》的书里,也是使用了一个单独的class处理,但是不同的就是他似乎在里面跳转了好几次,我就简化了一点点内容,跳转少了,提取数据以后,就直接返回这个数组了。

    感谢看完。。。可能写的有点乱了,这个折腾了好久,主要是想为了试试core data的使用,结果卡了好久,整个人都不好了,如果能够有指正,十分感谢。
    第 1 条附言  ·  2015-07-11 00:38:07 +08:00
    我最后把提取数据的请求放回了tableviewcontroller的viewDidLoad,也是在同一个位置,然后self.array = results(读取的数组),然后在cell for使用StoryList *story in self.array就能够成功把story.title成功赋值了。。。
    之前的情况是,能够用forin遍历每项,也可以打印,但是没法使用story.title给cell的名称赋值。。看源码,有的是把这个步骤放在了VController里,死马当活马医,试了试,还可以。虽然不确切清楚为什么,但是估计是之前设置专门处理这一组数据的class没完善吧。
    11 条回复    2015-07-12 09:02:41 +08:00
    lzyroot
        1
    lzyroot  
       2015-07-11 11:30:56 +08:00
    抛弃它把,用FMDB
    yiplee
        2
    yiplee  
       2015-07-11 13:15:08 +08:00 via iPad
    推荐用 Magical Record 来处理 Core Data,方便很多。
    a412739861
        3
    a412739861  
    OP
       2015-07-11 13:43:23 +08:00
    因为刚有学,所以看的是官方库,现在有点点学会存储和读取,感觉就是官方代码复制下来就好了。打的代码有点多,在多的插入还好,其他操作似乎比较少一些。
    @lzyroot 谢谢,我去github上搜搜。
    @yiplee 谢谢,我搜了下,LS的是替代Core Data,这个是处理Core Data的样子。我也去读读教程看,能看懂哪个就用哪个。总觉得直接用第三方库,有点只懂皮毛的样子,但是为了先出点成果,这么搞最方便了或许。
    yiplee
        4
    yiplee  
       2015-07-11 14:03:27 +08:00
    jianzong
        5
    jianzong  
       2015-07-11 15:39:13 +08:00 via iPhone   ❤️ 1
    有一段时间没用core data了,似乎你上面打印出来的storylist还包含了entity的信息,可以在你后来成功使用的地方,再打印一个看看是不是一样。应该是哪里没设置对,没有转化为NSObject的对象吧。
    a412739861
        6
    a412739861  
    OP
       2015-07-11 18:21:07 +08:00
    @yiplee 嗯嗯,惭愧呢,这个专题在objc中文的上面看了些。处于有些明白,又有些迷糊的状态。
    感觉是通过momd文件和model,context,persistence的几个属性设置好,把对应类的实际内容写在了文件上。
    不知道这种想法对不对。

    Core data设计三个属性的设置好了,就可以很便捷的存储和提取内容了。
    甚至我直接把那些设置的内容从一个初始化带有Core Data的appdelegate里面直接复制出来,就可以直接使用。似乎还导入appdelegate,用他里面的context也可以方便的存取。
    所以感觉Core Data的代码虽然很麻烦,但是其实很固定,忽略这一长串的代码的话,存储和读取的操作,还算简单。

    @jianzong 对头,有这种感觉,提取出来的是一个数组,而单个对象应该我的storylist class的实例。但是controller并不知道这是我属于storylist的类,虽然用for storylist in result倒是不报错,但是打印title属性就null。

    当存取整合在一个class的情况时,提取数据的方法放在datamanager class里。在这个方法的结尾,返回数组之前,我尝试用for Storylist *story in result(取出的数组),是可以正确的打印每一个的story.title。
    在controller里面,title打印不出来,但是单个对象可以打出上面的那一串内容。
    所以可以认为在controller里面得到那串数组后,controller并不知道其中的单个对象是什么类,而在datamanager得到result时,他是知道这是一个一串NSObjec/storylist的内容,所以只打印title属性可以完成。

    教程似乎都没有着重提醒过,如何转化……请问,一般情况进行转化是进行了什么步骤,不直接返回提取的数据结果?
    在提取的result数组里面,在进行一次for storylist in result的遍历,然后把项目添加到另一个数组,可行么?(我在另外一个demo里面看到了这一部分,但是又不完全一样。这串处理在单独的datamananger class中进行,即使处理了,后续的controller里不应该一样不知道么?)

    提到说是要进行一番处理,转头翻《iOS编程》,书上把数据存取等的操作,整合在了一个class里的。
    他在得到了result数组后,把他直接赋值给了自己的一个属性叫privateItems,也是数组。当外部需要读取就返回这串数组的copy。他的逻辑层,绕了很多。的确,在他的这个privateItems,可以进行对item的数据处理。
    不过书上的也很奇怪,他获得这串数组,其中每个对象item,赋值给cell.textlabel.text = [item description]这个方法写在的item的m文件里面,应该属于私有的方法,不应该在外部调用。不知道是不是因为这是重写了父类NSObject的description方法,所以可以这么调用。

    写的太多了,也不指望能看完>_<,就一句话,一般的话,如何转化NSObject……
    yiplee
        7
    yiplee  
       2015-07-11 19:19:03 +08:00   ❤️ 1
    @a412739861 Core Data 难道不是自动转成 NSManagedObject 的吗? Json 的话可以 Json -> NSDictionary / NSArray -> NSManagedObject ,其中后面一步可以用 Magical Record , 见文档 : https://github.com/magicalpanda/MagicalRecord/blob/master/Docs/Importing-Data.md
    a412739861
        8
    a412739861  
    OP
       2015-07-11 20:19:33 +08:00
    @yiplee 说的是提取出来的数据results,不是一串数组么,我用Core data自动生成的storylist类进去遍历,for storylist *story in results,不能打印story.title的属性。所以那位说可能是数组里面的单个对象没转化成storylist的意思。
    而不是存进去的时候,存进去的时候,json是一个个转化好了。
    现在看看,似乎都用第三方库更简单方便。之前就是想,刚开始学就统统用第三方库,把所有内容全给隐藏,似乎学有点不太合适。(其实还是直接就用上AFNetworking了……)。
    yiplee
        9
    yiplee  
       2015-07-11 20:29:19 +08:00
    NSFetchRequest 的 returnsObjectsAsFaults 默认是 YES ,fetch 前设置成 NO 试试。
    a412739861
        10
    a412739861  
    OP
       2015-07-11 21:18:37 +08:00
    @yiplee 看样子得学版本控制了……复原后,把这个值设置成NO,打印出来的也是一样。
    观察了下教程代码,我感觉是NSFetchRequest后得到的results好像都经过了一些处理,比如《iOS编程》里面,itemstore进行提取的,results他放进了itemstore的一个数组属性里面(虽然我感觉没区别……)。

    虽然不明白为什么,但是我这样在tableviewcontroller的类调用的时候,得到的数组,直接打印firstObject,是有内容的。
    而且和我后面把数据提取放在tableviewcontroller里面,直接打印数组的第一个对象内容是一样的。区别在于把fetchrequest放在后者时,用for in可以打出其中的title属性。

    感觉我也只能乖乖的把results处理处理(虽然不太清楚如何处理,继续找参考),或者吧fetchrequest放进要用到的数据里面才好……

    anyway,感谢回复,感觉我啰里啰嗦,可能连问题也没解释清楚……
    victorylau808
        11
    victorylau808  
       2015-07-12 09:02:41 +08:00
    @lzyroot FMDB比coreData好用? 我怎么感觉这么SQL语言好烦。。。虽然可以带Jsonmodel (本人也是初学者) 我也纠结这两种东西用哪种比较好。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2622 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 11:05 · PVG 19:05 · LAX 03:05 · JFK 06:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.