coredata存储数组
A. 如何使用Core Data
预加载/引入数据
那么我们究竟怎样把数据存储进Core Data数据库呢?目前有两种比较好的选择。
在App启动的时候从外部文件引入数据,就是在程序开始运行的时候从外部的资源,比如sqlite数据库或者XML文件中,引入数据。
提供一个已经制作完成的SQLite数据库,首先制作一个像上次的教程说的那样的数据库模型,之后在这个模型中填充数据,填充数据的方式是使用一个utility app,这个utility app可以是一个使用Core Data API填充数据库的Mac或者iOS app,也可以是一些直接填充数据库的程序。一旦数据库被填充之后,你就可以在没有已存在的数据库的情况下设置这个数据库未使用的默认数据库。
在这个教程中,我们会通过第二种,为大家展示如何使用一个简单的utility app来预加载一个已经装在好的Core Data数据库,以便让你的app使用。
第一步
我们在iOS上使用Core Data的方法的基础和我们在Mac OS X上使用的是一致的,他们使用同样的模型和类。
这一为我们可以写一个MAC OS X上的简单的console程序,来从数据源引入数据,再把这个数据库的数据库拿来给我们的iOS程序来用,不错吧?
我们来试试,首先打开Xcode,在 Mac OSX类中的Application中使用Command Line Tool 的模板。
我们就用 “CoreDataTutorial2” 作为工程的名字吧,记得使用“Core Data” 和 “Use Automatic Reference Counting” 。
完成创建之后,选择 “CoreDataTutorial2.xcdatamodeld” 彻底删除之。
B. core data 可以存数组吗
你这数据库名字都打错啊。。。其实也没撒区别,coredata其实就是利用对象关系映射,对sqlite进行数据持久化的封装。
C. xcode中coredata的存储文件怎么找
1.Core Data 是数据持久化存储的最佳方式
2.数据最终的存储类型可以是:SQLite数据库,XML,二进制,内存里,或自定义数据类型
在Mac OS X 10.5Leopard及以后的版本中,开发者也可以通过继承NSPersistentStore类以创建自定义的存储格式
3.好处:能够合理管理内存,避免使用sql的麻烦,高效
4.构成:
(1)NSManagedObjectContext(被管理的数据上下文)
操作实际内容(操作持久层)
作用:插入数据,查询数据,删除数据
(2)NSManagedObjectModel(被管理的数据模型)
数据库所有表格或数据结构,包含各实体的定义信息
作用:添加实体的属性,建立属性之间的关系
操作方法:视图编辑器,或代码
(3)NSPersistentStoreCoordinator(持久化存储助理)
相当于数据库的连接器
作用:设置数据存储的名字,位置,存储方式,和存储时机
(4)NSManagedObject(被管理的数据记录)
相当于数据库中的表格记录
(5)NSFetchRequest(获取数据的请求)
相当于查询语句
(6)NSEntityDescription(实体结构)
相当于表格结构
(7)后缀为.xcdatamodeld的包
里面是.xcdatamodel文件,用数据模型编辑器编辑
编译后为.momd或.mom文件
D. 如何查看coredata存的数据
预加载/引入数据那么我们究竟怎样把数据存储进CoreData数据库呢?目前有两种比较好的选择。 在App启动的时候从外部文件引入数据,就是在程序开始运行的时候从外部的资源,比如SQLite数据库或者XML文件中,引入数据。 提供一个已经制作完成的SQ...
E. 为什么要使用coredata
Core Data数据持久化是对SQLite的一个升级,它是ios集成的,在说Core Data之前,我们先说说在CoreData中使用的几个类。
(1)NSManagedObjectModel(被管理的对象模型)
相当于实体,不过它包含 了实体间的关系
(2)NSManagedObjectContext(被管理的对象上下文)
操作实际内容
作用:插入数据 查询 更新 删除
(3)NSPersistentStoreCoordinator(持久化存储助理)
相当于数据库的连接器
(4)NSFetchRequest(获取数据的请求)
相当于查询语句
(5)NSPredicate(相当于查询条件)
(6)NSEntityDescription(实体结构)
(7)后缀名为.xcdatamodel的包
里面的.xcdatamodel文件,用数据模型编辑器编辑
编译后为.momd或.mom文件,这就是为什么文件中没有这个东西,而我们的程序中用到这个东西而不会报错的原因
首先我们要建立模型对象
F. iOS 开发如果涉及数据和表的持久化,Core Data 比 SQLite 更好吗
这两个东西我都用过,两者都能实现对数据库的操作,功能上需求都能满足。
先前在公司实习的时候,原先项目中用的是SQLite,感觉操作很直接。如果先前有一点数据库和SQL基础的话,写起来会感觉很亲切,都是一些数据库操作的语句。但是当操作变多之后,语句越来越多,就很烦,代码比较多,看起来也会混乱一些。
后来新项目中尝试了CoreData,因为苹果一直在推这个东西。CoreData用起来比直接sql语句方便许多,而且很适合进行代码封装、重构。其实后来在用CoreData的时候,参照RestKit的ObjectMapping和CoreData部分对其进行了少量封装,使得CoreData用起来非常方便。例如:添加一条User数据
User *user = [User object];
user.name = @"example";
[objectStore save];
后来做开发一直都在用CoreData,主要是我觉得用起来太方便了,代码能够精简许多。另外,
App升级之后数据库字段或者表有更改会导致crash,CoreData的版本管理和数据迁移变得非常有用,手动写sql语句操作还是麻烦一些。
CoreData不光能操纵SQLite,CoreData和iCloud的结合也很好,如果有这方面需求的话优先考虑CoreData。
CoreData并不是直接操纵数据库,比如:使用CoreData时不能设置数据库的主键,目前仍需要手动操作。
效率上其实跑程序时感觉不出来,毕竟手机上的数据不能跟网站的数据和访问量相提并论。
总的来说,个人比较喜欢用CoreData,因为自己比较熟悉,使用起来也非常方便。
PS:既然你一直在CoreData,就应该坚持用下去,除非是真的碰到很致命的无法解决问题。中途换掉既有的自己熟悉的东西,费时费力,实际用起来没区别,得不偿失。
转载
G. coredata存储数据,文件都在.sqlite-wal中不转到.sqlite中是为什么
SQLite的WAL机制
1.什么是WAL?
WAL的全称是Write
Ahead
Logging,它是很多数据库中用于实现原子事务的一种机制,SQLite在3.7.0版本引入了该特性。
2.WAL如何工作?
在引入WAL机制之前,SQLite使用rollback
journal机制实现原子事务。
rollback
journal机制的原理是:在修改数据库文件中的数据之前,先将修改所在分页中的数据备份在另外一个地方,然后才将修改写入到数据库文件中;如果事务失败,则将备份数据拷贝回来,撤销修改;如果事务成功,则删除备份数据,提交修改。
H. ios怎样在xmpp自带的数据库里面插入数据
点击登录之后,验证成功就会跳到好友页面。这个时候需要显示你已经有的好友。
那么在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 :(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 :self.fromJid]; break; case 1: [self.xmppRoster :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:];}
pragma mark 好友列表检索完毕的方法-(void)xmppRosterDidEndPopulating:(XMPPRoster )sender{ NSLog(@"好友列表检索完毕");}
4. 删除好友。列表删除,数组删除,服务器删除。
pragma mark 删除好友执行的方法-(void)tableView:(UITableView )tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath )indexPath{ if (editingStyle==) { //找到要删除的人 XMPPJID jid = self.rosterJids[indexPath.row];//从数组中删除 [self.rosterJids removeObjectAtIndex:indexPath.row];//从Ui单元格删除 [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation: ];//从服务器删除 [[XMPPManager defaultManager].xmppRoster removeUser:jid]; }}
5.进入聊天页面