㈠ ios數據的持久化存儲方式有哪些
對於數據的持久化存儲,ios中一般提供了4種不同的機制。
1.屬性列表
2.對象歸檔
3.資料庫存儲(SQLite3)
4.蘋果公司提供的持久性工具Core
Data。
其實儲存的形式無非就這么幾種,而我們還必須要關心的是,這些文件會被放置在那個文件下,然後如何讀取。
也就是說:IOS上數據存儲,我們要了解的兩點,數據存儲格式(也就是存儲機制),數據存儲位置。
1》文件如何存儲(如上面4點)
2》文件存儲在哪裡。
對於數據的操作,其實我們關心的是操作的速率。
就好比在Adnroid中偏好存儲,資料庫存儲,io存儲一樣。
㈡ ios中的持久化操作方式有哪些
iOS中的數據持久化方式,基本上有以下四種:屬性列表、對象歸檔、SQLite3和Core Data
1.屬性列表
涉及到的主要類:NSUserDefaults,一般 [NSUserDefaults standardUserDefaults]就夠用了
@interface User : NSObject <NSCoding>
@property (nonatomic, assign) NSInteger userID;
@property (nonatomic, ) NSString *name;
@end
使用方法
1).分開存取
// 存
[[NSUserDefaults standardUserDefaults] setInteger:userID forKey:@」userID」];
[[NSUserDefaults standardUserDefaults] setObject:name forKey:@」name」];
// 取
NSInteger uId = [[[NSUserDefaults standardUserDefaults] integerValueForKey:@」userID」];
NSString* name = [[NSUserDefaults standardUserDefaults] stringForKey:@」name」];
2).按對象存取
// 存
[[NSUserDefaults standardUserDefaults] setObject:self forKey:@」user」];
// 取
User* u = [[NSUserDefaults standardUserDefaults] objectForKey」@」user」];
2.對象歸檔
要使用對象歸檔,對象必須實現NSCoding協議.大部分Object C對象都符合NSCoding協議,也可以在自定義對象中實現NSCoding協議,要實現NSCoding協議,實現兩個方法:
- (void) encodeWithCoder:(NSCoder *)encoder 與 -(void)initWithCoder:(NSCoder *)encoder
同時,建議對象也同時實現NSCopying協議,該協議允許復制對象,要實現NSCopying協議須實現 -(id)WithZone:(NSZone *)zone 方法 。
@interface User : NSObject <NSCoding>
@property (nonatomic, assign) NSInteger userID;
@property (nonatomic, ) NSString *name;
@end
@implementation User
// 以下兩個方法一定要實現,不然在調用的時候會crash
- (void)encodeWithCoder:(NSCoder *)aCoder;
{
// 這里放置需要持久化的屬性
[aCoder encodeObject:[NSNumber numberWithInteger:self.userID] forKey:@」userID」];
[aCoder encodeObject:self.name forKey:@"name"];
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
if (self = [self init])
{
// 這里務必和encodeWithCoder方法裡面的內容一致,不然會讀不到數據
self.userID = [[aDecoder decodeObjectForKey:@"userID"] integerValue];
self.name = [aDecoder decodeObjectForKey:@"name"];
}
return self;
}
// 使用方法
+ (BOOL)save {
NSError *error = nil;
// 確定存儲路徑,一般是Document目錄下的文件
NSString* fileName = [self getFileName];
NSString* filePath = [self getFilePath];
if (![[NSFileManager defaultManager] createDirectoryAtPath:filePath withIntermediateDirectories:YES attributes:nil error:&error]) {
NSLog(@」創建用戶文件目錄失敗」);
return NO;
}
return [NSKeyedArchiver archiveRootObject:self toFile:[fileName:userId]];
}
@end
3.SQLite3
SQLite是一個開源的嵌入式關系資料庫,它在2000年由D. Richard Hipp發布,它的減少應用程序管理數據的開銷,SQLite可移植性好,很容易使用,很小,高效而且可靠。
SQLite嵌入到使用它的應用程序中,它們共用相同的進程空間,而不是單獨的一個進程。從外部看,它並不像一個RDBMS,但在進程內部,它卻是完整的,自包含的資料庫引擎。 嵌入式資料庫的一大好處就是在你的程序內部不需要網路配置,也不需要管理。因為客戶端和伺服器在同一進程空間運行。SQLite 的資料庫許可權只依賴於文件系統,沒有用戶帳戶的概念。SQLite 有資料庫級鎖定,沒有網路伺服器。它需要的內存,其它開銷很小,適合用於嵌入式設備。你需要做的僅僅是把它正確的編譯到你的程序。
關於SQLite的開發資料較多,這里不再細說。只是建議不直接操作SQLite庫,而是採用一些開源的第三方庫來進行操作。
對SQLite都做了不錯的封裝。
4.Core Data
Core Data本質上是使用SQLite保存數據,但是它不需要編寫任何SQL語句。
要使用Core Data,需要在Xcode中的數據模型編輯器中設計好各個實體以及定義好他們的屬性和關系。之後,通過操作這些對象,結合Core Data完成數據的持久化:
NSManagedObjectContext *context = [appDelegate managedObjectContext];
NSError *error;
NSString *fieldName = [NSString stringWithFormat:@"test%d", i];
UITextField *theField = [self valueForKey:fieldName];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
//創 建描述語句,需求Line對象。類似於在資料庫中限定為Line表。
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Line" inManagedObjectContext:context];
[request setEntity:entityDescription];
//創建限制性語句,類似於SQL語句中的 where lineNum = i
NSPredicate *pred = [NSPredicate predicateWithFormat:@"(lineNum = %d)", i];
[request setPredicate:pred];
NSManagedObject *theLine = nil;
NSArray *objects = [context executeFetchRequest:request error:&error];
if (objects == nil){
NSLog(@」There was an error!」);
// Do whatever error handling is appropriate
}
if ([objects count] > 0){ //如果符合條件的object存在,則取出
theLine = [objects objectAtIndex:0];
}
else { //如果不存在,則插入一個新的.
theLine = [NSEntityDescription :@"Line"
inManagedObjectContext:context];
[theLine setValue:[NSNumber numberWithInt:i] forKey:@」lineNum」]; //設置這個object的屬性,coredata會自動將其寫入sqlite
[theLine setValue:theField.text forKey:@"lineText"];
[request release];
}
}
下面是其取數據的過程:
Core_Data_PersistenceAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context = [appDelegate managedObjectContext];
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Line"
inManagedObjectContext:context];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entityDescription];
NSError *error;
NSArray *objects = [context executeFetchRequest:request error:&error];
if (objects == nil)
{
NSLog(@」There was an error!」);
// Do whatever error handling is appropriate
}
//每一個對象在CoreData中都表示為一個NSManagedObject對象(類似於資料庫表中的每一行),他的屬性通過鍵/值 方式獲取
for (NSManagedObject *oneObject in objects)
{
NSNumber *lineNum = [oneObject valueForKey:@"lineNum"];
NSString *lineText = [oneObject valueForKey:@"lineText"];
}
[request release];
轉載
㈢ 請問什麼是數據持久化
cmp和Hibernate只是對象模型到關系模型之間轉換的不同實現。只不過對象模型和關系模型應用廣泛,所以就會誤認為數據持久化就是對象模型到關系型資料庫的轉換罷了。
Hibernate框架會提供這種機制。對象上數據的修改,Hibernate框架會把這種修改同步到資料庫中。
使用數據持久化有以下好處:
1、程序代碼重用性強,即使更換資料庫,只需要更改配置文件,不必重寫程序代碼。
2、業務邏輯代碼可讀性強,在代碼中不會有大量的SQL語言,提高程序的可讀性。
3、持久化技術可以自動優化,以減少對資料庫的訪問量,提高程序運行效率。
數據持久化對象的基本操作有:保存、更新、刪除、查詢等。
Hibernate框架中數據持久化機制:
在業務程序與資料庫之間,Hibernate框架使用Session會話,來完成數據的提交、更新、刪除、查詢等等。
1、向資料庫提交數據
2、從資料庫中查詢數據
在查詢數據之前,需要清理緩存(手動清理,或者通過配置文件框架自動清理)清理緩存的目的是為了使Session會話中的數據與資料庫中的數據保持一致。然後程序只需要查詢Session會話中的數據即可。
總之,數據持久化是解決程序與資料庫之間交互訪問的問題,使程序不直接訪問資料庫,而是直接訪問Session會話,然後由Session會話與資料庫「打交道」。
㈣ ios 中數據持久化的方式有哪些
iOS中的數據持久化方式,基本上有以下四種:屬性列表、對象歸檔、SQLite3和Core Data 1.屬性列表 涉及到的主要類:NSUserDefaults,
㈤ 數據持久化方式
還有JPA,EJB,String DAO,String ORM,我就知道這么多了,希望能對你有用
㈥ Linux裡面什麼是數據持久化
數據持久化顧名思義就是把程序中的數據以某種形式保存到某存貯介質中,以達到持久化的目的。當程序運行時,一些數據是臨時保存在內存中,一旦退出系統,這些數據就丟失了。那麼,使用某種手段將數據保存在硬碟上或者資料庫中,這樣即使退出系統後又重新啟動系統,那麼這些數據仍然可以重新找回來。
例如管理員向一個用戶管理系統中添加了一個用戶的資料,那麼這個系統需要將新添加的資料保存到資料庫中,否則系統退出或者電腦重啟後該用戶資料就會丟失。將數據從內存保存到資料庫中,這便是數據的持久化。當然,資料庫只是持久化方式中的一種,也可以保存在其他的永久存貯介質中。
圖為數據持久化的過程示意圖。
持久化(Persistence),即把數據(如內存中的對象)保存到可永久保存的存儲設備中(如磁碟)。持久化的主要應用是將內存中的對象存儲在資料庫中,或者存儲在磁碟文件中、XML數據文件中等等。
持久化是將程序數據在持久狀態和瞬時狀態間轉換的機制。
DBC就是一種持久化機制。文件IO也是一種持久化機制。
日常持久化的方法
在一定周期內保持不變就是持久化,持久化是針對時間來說的。資料庫中的數據就是持久化了的數據,只要你不去刪除或修改。比如在瀏覽器中一次Session會話中Session對象變數也是不變的,是Session容器中持久化。對象持久化的方式有很多種,根據周期不同有,page,Session,Application。對象序列化機制對於需要將對象的狀態保存到文件中,而後能夠通過讀入對象狀態來重新構造對象,恢復程序狀態. 對象序列化的過程是對象持久化的方法之一,把對象保存到文件中。
簡單的理解持久化可以在二個層面:應用層和系統層、
應用層
如果關閉(shutdown)你的應用然後重新啟動則先前的數據依然存在。
系統層
如果關閉(shutdown)你的系統(電腦)然後重新啟動則先前的數據依然存在。
持久化是一種對象服務實現至少3個介面
,就是把內存中的對象保存到外存中,讓以後能夠取回。需要實現至少3個介面:
void Save(object o) 把一個對象保存到外存中
Object Load(object oid) 通過對象標識從外存中取回對象
boolExists(object oid) 檢查外存中是否存在某個對象.
類似概念序列化
我們先跳開一下,看看另一個類似的有用概念:序列化Serialize也是一種對象服務,就是把內存中的對象序列化成流、或者把流反序列化成對象。需要實現2個介面:
void Serialize(Stream stream,object o) 把對象序列化到流中
object Deserialize(Stream stream) 把流反序列化成對象
序列化和持久化很相似,有些人甚至混為一談,其實還是有區別的,序列化是為了解決對象的傳輸問題,傳輸可以在線程之間、進程之間、內存外存之間、主機之間進行。我之所以在這里提到序列化,是因為我們可以利用序列化來輔助持久化,可以說凡是可以持久化的對象都可以序列化,因為序列化相對容易一些(也不是很容易),所以主流的軟體基礎設施,比如.net和java,已經把序列化的框架完成了。
持久化方案可以分為關系資料庫方案、文件方案、對象資料庫方案、xml資料庫方案
現今主流的持久化方案是關系資料庫方案,
關系資料庫方案不僅解決了並發的問題,更重要的是,關系資料庫還提供了持久化服務之外的價值:統計分析功能。剛才我說到,凡是可以序列化的對象都可以持久化,極端的說,我們可以只建立一個表Object(OID,Bytes),但基本上沒有人這么做,因為一旦這樣,我們就失去了關系資料庫額外的統計分析功能。關系資料庫和面向對象之間有一條鴻溝,因為二者模式不匹配,所以就存在一個OR映射問題。
Redis支持兩種數據持久化方式:rdb方式和aof方式。前者會根據配置的規則定時將內存中的數據持久化到硬碟上,後者則是在每次執行寫命令之後將命令記錄下來。兩種持久化方式可以單獨使用,但是通常會將兩者結合使用。
1、RDB方式
RDB方式的持久化是通過快照的方式完成的。當符合某種規則時,會將內存中的數據全量生成一份副本存儲到硬碟上,這個過程稱作」快照」,redis默認開啟該持久化功能,具體配置如下:
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename mp.rdb
#文件名稱
dir ./
#rdb文件存放路徑
配置後系統會自動進行快照,save 60 10000表示60秒內有10000次寫入,那麼就會調用bgsave
除了系統自動進行快照外,我們也可以手動執行SAVE或BGSAVE命令主動進行快照操作:
執行SAVE或BGSAVE命令
執行FLUSHALL命令
2、AOF方式
在使用Redis存儲非臨時數據時,一般都需要打開AOF持久化來降低進程終止導致的數據丟失,AOF可以將Redis執行的每一條寫命令追加到硬碟文件中,這一過程會降低Redis的性能。
默認情況下,Redis沒有開啟AOF(append only file)持久化功能,可以通過在配置文件中作如下配置啟用:
appendonly no #是否開啟aof,開啟時將no改為yes
appendfilename "appendonly.aof" 持久化文件名稱
auto-aof-rewrite-percentage 100
#當前AOF文件大小是上次日誌重寫得到AOF文件大小的二倍時,自動啟動新的日誌重寫過程。
auto-aof-rewrite-min-size 64mb
#當前AOF文件啟動新的日誌重寫過程的最小值,避免剛剛啟動Reids時由於文件尺寸較小導致頻繁的重寫。
appendfsync :everysec (推薦配置)
#持久化策略
always (同步持久化,每次發生數據變更會被立即記錄到磁碟,性能差但數據完整性比較好)
everysec (非同步操作,每秒記錄,如果一秒鍾內宕機,有數據丟失)
no (將緩存回寫的策略交給系統,linux 默認是30秒將緩沖區的數據回寫硬碟的)
一般來說可以考慮同時使用兩種持久化方案.
㈦ ios開發中數據持久化有哪幾種,分別什麼時間使用
1、plist文件(屬性列表),通常用於儲存用戶設置,也可以用於存儲捆綁的信息;
2、preference(偏好設置),常用於保存少量數據;
3、NSKeyedArchiver(歸檔),將內存中的對象實例保存成binary到磁碟並且可以逆向這個過程用來保存用戶操作狀態等;
4、SQLite 3,使用資料庫進行存儲;
5、CoreData,它提供了對象-關系映射(ORM)的功能,即能夠將OC對象轉化成數據,保存在SQLite資料庫文件中,也能夠將保存在資料庫中的數據還原成OC對象。
㈧ redis 兩種持久化分別叫什麼
Redis是一種高級key-value資料庫。它跟memcached類似,不過數據可以持久化,而且支持的數據類型很豐富。有字元串,鏈表,集
合和有序集合。支持在伺服器端計算集合的並,交和補集(difference)等,還支持多種排序功能。所以Redis也可以被看成是一個數據結構伺服器。
Redis的所有數據都是保存在內存中,然後不定期的通過非同步方式保存到磁碟上(這稱為「半持久化模式」);也可以把每一次數據變化都寫入到一個append
only
file(aof)裡面(這稱為「全持久化模式」)。
第一種方法filesnapshotting:默認redis是會以快照的形式將數據持久化到磁碟的(一個二進制文件,mp.rdb,這個文件名字可以指定),在配置文件中的格式是:save
N
M表示在N秒之內,redis至少發生M次修改則redis抓快照到磁碟。當然我們也可以手動執行save或者bgsave(非同步)做快照。
工作原理簡單介紹一下:當redis需要做持久化時,redis會fork一個子進程;子進程將數據寫到磁碟上一個臨時RDB文件中;當子進程完成寫臨時文件後,將原來的RDB替換掉,這樣的好處就是可以-on-write
還有一種持久化方法是Append-only:filesnapshotting方法在redis異常死掉時,最近的數據會丟失(丟失數據的多少視你save策略的配置),所以這是它最大的缺點,當業務量很大時,丟失的數據是很多的。Append-only方法可以做到全部數據不丟失,但redis的性能就要差些。AOF就可以做到全程持久化,只需要在配置文件中開啟(默認是no),appendonly
yes開啟AOF之後,redis每執行一個修改數據的命令,都會把它添加到aof文件中,當redis重啟時,將會讀取AOF文件進行「重放」以恢復到redis關閉前的最後時刻。
LOG
Rewriting隨著
㈨ 如何在數據失效前把數據持久化到資料庫裡面
長期存儲數據,即把數據(如內存中的)保存到可永久保存的存儲設備中(如硬碟、U盤),也就是人們常說的持久化。
常用持久化的方案有資料庫、XML文件和文件存儲。
資料庫是按照數據結構來存儲和管理數據的倉庫,後文不再做詳細介紹。
XML是可擴展標記語言,最早是為了簡化Internet的文檔數據傳輸,它提供統一的語法格式來描述數據的結構,通常XML文件用於一些少量且無特殊類型要求的文本存儲。示例代碼使用W3C標準的介面生成XML:
import java.io.FileOutputStream;import java.io.PrintWriter; import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.transform.OutputKeys;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerFactory;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document;import org.w3c.dom.Element; public class $ { public static void main(String[] args) throws Exception { Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); //創建根節點為students的<a href="https://www..com/s?wd=XML%E6%96%87%E4%BB%B6&tn=44039180_cpr&fenlei=-bIi4WUvYETgN-TLwGUv3EPHmkPWn1rHmk" target="_blank" class="-highlight">XML文件</a> Element students = document.createElement("students"); document.appendChild(students); //在根節點下創建一個子節點學生 Element student = document.createElement("student"); students.appendChild(student); //創建節點學生姓名,值為張三 Element name = document.createElement("name"); name.appendChild(document.createTextNode("張三")); student.appendChild(name); //創建節點學生年齡,值為18 Element age = document.createElement("age"); age.appendChild(document.createTextNode("18")); student.appendChild(age); //創建節點學生編號,值為150101 Element number = document.createElement("number"); number.appendChild(document.createTextNode("150101")); student.appendChild(number); //在根節點下創建第二個子節點學生 student = document.createElement("student"); students.appendChild(student); //創建節點學生姓名,值為李四 name = document.createElement("name"); name.appendChild(document.createTextNode("李四")); student.appendChild(name); //創建節點學生年齡,值為20 age = document.createElement("age"); age.appendChild(document.createTextNode("20")); student.appendChild(age); //創建節點學生編號,值為150102 number = document.createElement("number"); number.appendChild(document.createTextNode("150102")); student.appendChild(number); //將XML文件保存到硬碟 Transformer transformer = TransformerFactory.newInstance().newTransformer(); transformer.setOutputProperty(OutputKeys.ENCODING, "utf-8"); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); PrintWriter writer = new PrintWriter(new FileOutputStream("/home/test.xml")); transformer.transform(new DOMSource(document), new StreamResult(writer)); }}
無論是資料庫還是XML文件,它們都使用了能讓數據快速方便進出的標准規范。其它文件如propeties、json,都可以使用類似XML的方式來打包數據,然後通過Java豐富的io流介面保存到磁碟中。
㈩ android中數據持久化方式有哪些
android中數據持久化方式有以下五種:
1、Shared Preferences
Store private primitive data in key-value pairs。
2、Internal Storage
Store private data on the device memory,把數據持久化存儲到手機內部存儲空間,它主要用於私有數據存儲。
3、External Storage
Store public data on the shared external storage,把數據持久化存儲到手機外部SD卡中,它主要用於非隱秘數據存儲。
4、SQLite Databases
Store structured data in a private database。
5、Network Connection
Store data on the web with your own network server,
Android provides a way for you to expose even your private data to other applications — with a content provider. A content provider is an optional component that exposes read/write access to your application data, subject to whatever restrictions you want to impose. For more information about using content providers, see the Content Providers documentation。