已解决 已解决 已解决 已解决 已解决

ShawnRS7 发布于 2016/08/15 16:19
阅读 247
收藏 0

我在练习微信项目,已经到了进行聊天信息的读取了。

我先描述下现在的环境:

1,CoreData的模型文件如图:

2,聊天数据已经能够从服务器里获取,然后保存到本地CoreData数据库了(聊天数据我是用Spark客户端发送的):

    用navicat打开可以看到,ZBODY一栏下的就是:


3,所以,既然确定了CoreData数据库中已经有数据了,我就直接贴从CoreData数据库获取聊天数据的

loadMsg方法了,此方法已经在viewDidLoad方法里调用了:

-(void)loadMsg{
    //上下文
    NSManagedObjectContext * context = [WCXMPPTool sharedWCXMPPTool].msgStorage.mainThreadManagedObjectContext;
    
    //请求对象
    NSFetchRequest * request = [NSFetchRequest fetchRequestWithEntityName:@"XMPPMessageArchiving_Message_CoreDataObject"];
     WCLog(@"上下文是 %@  ,读取请求是:%@",context,request);
    
    //过滤排序
    //1,过滤出当前用户的JID
    //2,过滤出正在聊天的好友的JID
    NSPredicate *pre = [NSPredicate predicateWithFormat:@"streamBareJidStr = %@ AND bareJidStr = %@",[WCUserInfo sharedWCUserInfo].jid, self.friendJID.bare];
    
    request.predicate = pre;
    
    WCLog(@"pre 打印结果为 %@",pre);
    
    //设置排序,按时间升序,最新的消息排在最上面:
    NSSortDescriptor  *timeSort = [NSSortDescriptor sortDescriptorWithKey:@"timestamp" ascending:YES];
    
    request.sortDescriptors = @[timeSort];
    
    WCLog(@"sort 打印结果为  %@",timeSort);
    
    //创建结果控制器对象
    _resultsControl = [[NSFetchedResultsController alloc]initWithFetchRequest:request managedObjectContext:context sectionNameKeyPath:nil cacheName:nil];
    
    WCLog(@"_resultsControl 打印结果为 %@",_resultsControl);
    
    NSError * err = nil;
    
    //执行请求
    [_resultsControl performFetch:&err];
    
    _resultsControl.delegate = self;
    
    if (err) {
        WCLog(@"结果控制器报错为%@",err);
    }
    
    //打印聊天消息
    for (int i=0; i<20; i++) {
        WCLog(@"聊天消息 打印结果为 %@",_resultsControl.fetchedObjects);
    }
}



4,上面的代码中可以看到我设置了几个打印运行结果的WCLog方法,下面是打印结果:

     【1】上下文是 <NSManagedObjectContext: 0x7fc44a4d9a10>  ,读取请求是:<NSFetchRequest: 0x7fc44a4d9080> (entity: XMPPMessageArchiving_Message_CoreDataObject; predicate: ((null)); sortDescriptors: ((null)); type: NSManagedObjectResultType; )

     【2】pre 打印结果为 streamBareJidStr == "13800010001@shawndemacbook-air.local" AND bareJidStr == "13800990099shawndemacbook-air.local"

    【3】sort 打印结果为  (timestamp, ascending, compare:)

     【4】_resultsControl 打印结果为 <NSFetchedResultsController: 0x7fc44a4f6180>

     【5】err报错并没有打印出来,说明执行请求操作并没有报错

     【6】聊天消息 打印结果为 (  )                       //聊天消息的循环打印结果均为空

5,从打印结果来看,上下文context和请求request是创建成功了,过滤pre也创建成功了,排序sort似乎也是有的,结果控制器对象_resultsControl 看来也是创建成功的。

     但是最后的聊天消息是用_resultsControl.fetchedObjects打印出来,结果为空,看来_resultsControl虽然创建成功了,可里面并没有数据。。。

6,我之前做通讯录模块的时候,也是从CoreData数据库来读取数据显示出来,通讯录目前工作是正常的,能够看到我添加的好友。但是现在读取聊天数据就出问题了,现在能确定CoreData数据库里是有聊天数据的,从CoreData读取数据一共就那么几步,我已经调了两天了,还是不行。

7,请高手们帮我看一下,感谢。

    





加载中
返回顶部
顶部