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.進入聊天頁面