ios怎样在xmpp自带的数据库里面插入数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ios怎样在xmpp自带的数据库里面插入数据相关的知识,希望对你有一定的参考价值。

参考技术A 点击登录之后,验证成功就会跳到好友页面。这个时候需要显示你已经有的好友。
那么在tableViewCell中显示好友姓名,需要数据源,数据源从服务器获看你是否有好友,检索到你的好友后把他显示在列表上。
xmpp中管理好友的类是 XMPPRoster,并且使用coredata来储存好友,达到数据持久化的效果。
那么我们可以将获取储存好友的仓库和xmppRoster对象的初始化封装在XMPPManager中。
在.h文件中声明:

//好友管理
@property(nonatomic,strong)XMPPRoster xmppRoster;

遵循代理:

@interface XMPPManager : NSObject<XMPPStreamDelegate,XMPPRosterDelegate>

在 .m文件中重写init方法中:

//2.好友管理//获得一个存储好友的CoreData仓库,用来数据持久化 XMPPRosterCoreDataStorage rosterCoreDataStorage = [XMPPRosterCoreDataStorage sharedInstance];//初始化xmppRoster self.xmppRoster = [[XMPPRoster alloc]initWithRosterStorage:rosterCoreDataStorage dispatchQueue:dispatch_get_main_queue()];//激活 [self.xmppRoster activate:self.xmppStream];//设置代理 [self.xmppRoster addDelegate:self delegateQueue:dispatch_get_main_queue()];

接收好友请求。
将接收到好友请求的方法也封装在XMPPManager中:

// 收到好友请求执行的方法-(void)xmppRoster:(XMPPRoster )sender didReceivePresenceSubscriptionRequest:(XMPPPresence )presence self.fromJid = presence.from; UIAlertView alert = [[UIAlertView alloc]initWithTitle:@"提示:有人添加你" message:presence.from.user delegate:self cancelButtonTitle:@"拒绝" otherButtonTitles:@"OK", nil]; [alert show];

-(void)alertView:(UIAlertView )alertView clickedButtonAtIndex:(NSInteger)buttonIndex switch (buttonIndex) case 0: [self.xmppRoster rejectPresenceSubscriptionRequestFrom:self.fromJid]; break; case 1: [self.xmppRoster acceptPresenceSubscriptionRequestFrom:self.fromJid andAddToRoster:YES]; break; default: break;

添加好友,添加的好友必须是服务器上存在的用户,需要看对方是否同意。对方同意之后,刷新好友列表,显示出来,同时在服务器上也要添加,这里服务器上用的是coredata来存储个人的好友信息。

好友页面实现文件,遵循代理,数据源数组

在viewDidLoad中完成初始化数组,设置代理和添加好友按钮

这里简化了添加好友,写死了只能添加“张三”,如果需要添加更多,可以写成借口

接下来是tableview数据源代理方法

tableview

这时候数组明显是没有jid对象的。获取jid对象是在XMPPPRoster代理方法中实现的:

pragma mark xmppRoster 的代理方法

pragma mark 开始检索好友列表的方法-(void)xmppRosterDidBeginPopulating:(XMPPRoster *)sender NSLog(@"开始检索好友列表");

pragma mark 正在检索好友列表的方法-(void)xmppRoster:(XMPPRoster )sender didRecieveRosterItem:(DDXMLElement )item NSLog(@"每一个好友都会走一次这个方法");//获得item的属性里的jid字符串,再通过它获得jid对象 NSString jidStr = [[item attributeForName:@"jid"] stringValue]; XMPPJID jid = [XMPPJID jidWithString:jidStr];//是否已经添加 if ([self.rosterJids containsObject:jid]) return; //将好友添加到数组中去 [self.rosterJids addObject:jid];//添加完数据要更新UI(表视图更新) NSIndexPath *indexPath = [NSIndexPath indexPathForRow:self.rosterJids.count-1 inSection:0]; [self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];

pragma mark 好友列表检索完毕的方法-(void)xmppRosterDidEndPopulating:(XMPPRoster )sender NSLog(@"好友列表检索完毕");

4. 删除好友。列表删除,数组删除,服务器删除。

pragma mark 删除好友执行的方法-(void)tableView:(UITableView )tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath )indexPath if (editingStyle==UITableViewCellEditingStyleDelete) //找到要删除的人 XMPPJID jid = self.rosterJids[indexPath.row];//从数组中删除 [self.rosterJids removeObjectAtIndex:indexPath.row];//从Ui单元格删除 [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic ];//从服务器删除 [[XMPPManager defaultManager].xmppRoster removeUser:jid];

5.进入聊天页面

我怎样才能得到Friends vcard avtar photo xmpp ios

【中文标题】我怎样才能得到Friends vcard avtar photo xmpp ios【英文标题】:How can i get Friends vcard avtar photo xmpp ios 【发布时间】:2014-12-19 05:53:40 【问题描述】:

?请任何人帮助我...提前谢谢

XMPPvCardTemp *myvCardTemp = [self xmppvCardTempModule];//检查是否存在

if (!myvCardTemp)//if not then create a new vcard

    NSXMLElement *vCardXML = [NSXMLElement elementWithName:@"vCard" xmlns:@"vcard-temp"];
    XMPPvCardTemp *newvCardTemp = [self.xmppvCardTempModule vCardTempFromElement:vCardXML];
    [newvCardTemp setNickname:userName];
    [self updateMyvCardTemp:newvCardTemp];


NSString *str = [[NSUserDefaults standardUserDefaults] stringForKey:user_ID];

[self.xmppvCardTempModule fetchvCardTempForJID:str];

【问题讨论】:

试试这个***.com/questions/13227017/… 可能会有帮助。 嗨 Velmurugan,实际上我能够成功地更新我的头像。但现在需要获取朋友头像并在朋友表格视图中显示。请帮助我,因为我对 xmpp 完全陌生。非常感谢您的快速回复:0 【参考方案1】:

初始化并激活 xmppvCardAvatarModule 模块。

- (void) fetchVCardFor:(NSString *)toUser
    
        XMPPJID *myJID = [XMPPJID jidWithUser:[toUser stringByReplacingOccurrencesOfString:@"+" withString:@""] domain:self.domain resource:self.resource];
        [self.xmppvCardTempModule fetchvCardTempForJID:myJID useCache:YES];
    

您将在 IQ 中得到如下结果:

   - (BOOL)xmppStream:(XMPPStream *)sender didReceiveIQ:(XMPPIQ *)iq
   
      XMPPvCardTemp *vCardTemp = [XMPPvCardTemp vCardTempCopyFromIQ:iq];
      if (vCardTemp != nil)
      
          [self _updatevCardTemp:vCardTemp forJID:[iq from]];
          return YES;
      
      return NO;

【讨论】:

【参考方案2】:

您可以通过 XMPPUserCoreDataStorageObject 信息获取您朋友的 VCard 头像图片(如果您的朋友已经设置了图片)。

-(UIImage*)GetFriendImage:(XMPPUserCoreDataStorageObject *)user 

    //Check user has image on XMPPUserCoreDataStorageObject or  not.
    if (user.photo != nil) 
        return  user.photo;
     else 

         //Retrive image from xmppvCardAvatarModule
        NSData *photoData = [[[self appDelegate] 
        xmppvCardAvatarModule] photoDataForJID:user.jid];

        //Check xmppvCardAvatarModule has image or not, if xmppvCardAvatarModule return nil means your friend not set there image, so return your any default image.  
        if (photoData != nil) 
           return [UIImage imageWithData:photoData];
         else 
           return [UIImage imageNamed:@"defaultImage"];
        
    

这里[self appDelegate]定义为

- (AppDelegate *)appDelegate 
   return (AppDelegate *)[[UIApplication sharedApplication] delegate];

我将所有 xmpp 对象定义为 AppDelegate.h 文件的属性

@property (nonatomic, readonly) XMPPvCardAvatarModule *xmppvCardAvatarModule;

对于 VCard,导入 #import "XMPPvCardAvatarModule.h" 文件,否则检查此文件是否已导入 #import "XMPPFramework.h" 文件,而不是忽略重新导入。

您可以使用他的 JID 来检索 XMPPUserCoreDataStorageObject “用户对象”,就像这样

XMPPUserCoreDataStorageObject *user = [[[self appDelegate] xmppRosterStorage]
                                           userForJID:userJID
                                           xmppStream:[[self appDelegate] xmppStream]
                                 managedObjectContext:[[self appDelegate] managedObjectContext_roster]];

然后将此用户对象传递给GetFriendImage 以检索朋友图像。

【讨论】:

以上是关于ios怎样在xmpp自带的数据库里面插入数据的主要内容,如果未能解决你的问题,请参考以下文章

在oracle怎样同时插入1000000条数据,效率要快

怎样在mybatis里向mysql中插入毫秒数的时间

怎样在已经制好的excel图表中插入新的数据制图

Editor.md图片粘贴插入插件的开发

为啥用mybatis不能向数据库里面插入数据?

mssql 里面存储过程插入了条数据之后的返回