重讀iOS 資料持久化1 持久化方案介紹

2021-09-11 14:49:14 字數 2889 閱讀 7162

內存在斷點後就會清空重置,為了保持資料在斷點後保持,比如手機重啟,就需要把資料存放在硬碟裡,做持久化的儲存。為什麼不一直使用硬碟儲存,因為記憶體會比硬碟更快速。所以在程式的宣告週期裡,資料載入在記憶體裡,進行快速的計算,然後把需要持久儲存的資料儲存到硬碟裡。

資料持久化就是怎麼把資料儲存到硬碟裡的技術,準確的說,儲存是硬體幹的事,而對軟體而言,關鍵任務是組織和識別。就是一塊資料,你怎麼識別為你需要的內容,比如4個位元組,可以是乙個int數字,也可以是4個字元。所以關鍵是找到一種格式把資料組織好,存入硬碟,然後按對應的方式再識別。

plist檔案

歸檔archive

資料庫 有了上面的理解,再看這些,不同方式的區別也就是組織資料的方式的區別

plist檔案本質是乙個xml檔案,xml檔案可以很好的定義層級關係,用字典和陣列互相巢狀定義乙個複雜的結構。

歸檔這個內部不知道是怎麼實現的,但一般配合nskeyedarchiver使用,幾次對encodewithcoder:initwithcoder:的使用情況來看,有幾點可以推測:

然後資料庫是更複雜的結構,應對大量資料的處理。上面兩種方式最大問題是它們的修改都是整體修改,一張很大的plist檔案裡的某乙個小部分的修改,也需要把整個檔案讀取,修改然後再整個重新寫入,所以對於資料量大和修改頻繁的情況,前兩種不好。

@inte***ce book : nsobject@property (nonatomic) nsstring *name;

@property (nonatomic) nsstring *name1;

@property (nonatomic) nsstring *name2;

@property (nonatomic) nsstring *name3;

@end

複製**

建乙個類,使用歸檔方式寫入檔案,然後使用字典模擬這個類的結構,把字典寫入plist檔案,對比兩個檔案:

1個物件

10個100個

1000個

歸檔259

7335477

52128

plist

3742300

21290

211190

相比之下,歸檔檔案要小很多,但從10-100-1000對比看,貌似還是和plist檔案一樣,都是線性增長。

照著這個思路,只要找到一種描述物件記憶體的方式,就可以按這種方式組織記憶體,然後寫入檔案裡,就可以設計一種新的持久化方案。最簡單的,使用json描述物件,然後把json檔案寫入硬碟。神奇的是在這個例子裡,10000個物件後,json檔案比歸檔還小!!!

sqlite原生操作

建庫sqlite3_open一句搞定,沒有檔案的會自動建立

建表執行sql語句create table 表名稱 (列名1 列型別1, 列名2 列型別2)

列名有5種基本型別:

integer 根據值的大小會自動變化,資料庫中只有乙個表,表中就乙個列為integer時,1000條資料時,值全部為1(1個位元組)時資料庫檔案為25k,值為1ll<<60(8個位元組)時為33k,可以說很明顯了。

讀取的時候提供了sqlite3_column_intsqlite3_column_int64兩個方法來指定長度讀取。

親和型別

除了5大基本型別外,在建表的時候可以寫入其他型別,會根據親和型別,把你寫入的型別轉到基本型別來儲存。比如常見的char(20),這個是text的親和型別,資料庫內部實際按text儲存,但建表的時候可以char(20)這麼寫。

列的親和型別

插入資料

insert into 表名稱 (列名1,列名2) values (值1,值2)然後執行sql語句就可以了。

注意:不指定列名時表示對所有列都插入資料;值是字串型別的要使用引號包括起來;

查詢資料

select * from 表名稱,或者指定查詢的列select 列名1,列名2 from 表名稱

然後後面可以接查詢條件:

where子語句

更新資料

update book set 列名1 = 值1, 列名2 = 值2 [條件語句]一種方式值直接把值寫入sql語句裡,然後執行,還有一種是在值的位置填入問號?,然後使用sqlite3_bind系列的函式繫結資料,具體操作示例:

sqlite3_stmt *stmt;

sqlite3_prepare_v2(dbhanle, [updatesql cstringusingencoding:nsutf8stringencoding], (int)updatesql.length, &stmt, nil);

//1sqlite3_bind_text(stmt, 1, [book.name cstringusingencoding:nsutf8stringencoding], book.name.length, nil);

sqlite3_bind_int64(stmt, 2, book.age);

sqlite3_step(stmt);

//2sqlite3_finalize(stmt);

複製**

位置1到2之間可迴圈操作多條資料。

刪除資料

delete from 表名稱 [條件語句],然後執行sql語句事務

使用事務的好處:

事務和多執行緒

表資訊表修改

iOS資料持久化1 SQLite

這裡採用乙個二次封裝的例項來初步演示和實現 更新 如果嫌麻煩,這裡放乙個,建議github 你將有這幾個檔案 其中data.db是database檔案 讓後組織進 project 最好放在最外面,使用時就不必新增子目錄 修改 building settings swift compiler gene...

iOS終端資料持久化

ios有很多資料持久化技術,包括傳統的資料庫,但也有一些較新的技術,它主要的持久化技術有 資料庫 屬性列表 物件歸檔和。本節將分別介紹這四種持久化方式,輔助本文在設計與實現中針對不同的需求選擇合適的資料持久化方式。資料庫技術被廣泛的使用在各大系統中,資料庫也是乙個系統的核心部分,資料庫管理系統如今發...

iOS 資料持久化 Plist

獲取plist檔案位址 nsstring path nsbundle mainbundle pathforresource people oftype plist 獲取plist檔案內容 乙個字典 nsdictionary dict nsdictionary dictionarywithconten...