iOS 移動儲存初探 一 SQLite

2021-09-11 11:38:55 字數 3672 閱讀 1228

首先我關於移動端的儲存,其實有很多的解決方案,ios端》可以使phlist,userdefaults,歸檔,當然還有很多人覺得》難用的coredata,當然最重要的還有sqlite,sqlite設計》之初就是為了解決小型資料庫使用的,輕,便,快。所以 當然蘋果中也可以使用sqlite,所以蘋果公司就為我們封 裝了,coredata這個api為了方便開發者的使用,但是有很多人卻覺得不怎麼好用,也可能是因為,對接觸過資料庫操作的人來說相應的查詢等語句會更加的親切好用。

這裡我就不討論coredata了,因為最近正在研究coredata,因為蘋果自己很多的應用使用的是coredata,我覺得難用的東西一但會用了,就能夠事半功倍了。

不多這次就先說下sqlite--乙個普遍的移動端資料持久化資料庫。

首先說下sqlite: 雖然蘋果為我們提供了coredata但我們也可以使用比較低層的sqlite. 在swift中如何使用呢?(swift3.0) 首先也要引入庫libsqlite3.0.tbd由於swift中要使用oc先要引入標頭檔案。所以這次我就用橋接檔案直接把所有的引用放在橋接檔案.h中

//opaquepointer: *db,資料庫控制代碼,跟檔案控制代碼fifl類似,這裡是sqlite3指標;

//sqlite3_stmt: *stmt,相當於odbc的command物件,用於儲存編譯好的sql語句;

//sqlite3_open(): 開啟資料庫,沒有資料庫時建立;

//sqlite3_exec(): 執行非查詢的sql語句;

//sqlite3_step(): 在呼叫sqlite3_prepare後,使用這個函式在記錄集中移動;

//sqlite3_close():關閉資料庫檔案;

//sqlite3_column_text():取text型別的資料;

//sqlite3_column_blob():取blob型別的資料;

//sqlite3_column_int():取int型別的資料

複製**

在oc中可以使用sqlite3_stmt*指標運算元據庫,在swift中由於基本不使用指標,但是我們可以使用opaquepointer作為替代,opaquepointer是swift中不透明指標,當然swift中還有unsafepointer這種明確準確的指標可以使用,但在這裡他們不是重點。

由於大名鼎鼎的fmdb在開發者中的廣泛使用,使我們能夠減少避免使用更低層的語言來運算元據庫和使用。但是作為一名沒事找事的程式設計師還是想要使用自己的類庫,所以就稍微看了看fmdb的原始碼再結合一些資料庫的知識,給自己寫了個sqlite的manager類,方便以後運算元據庫。

首先資料庫都是儲存在本地的沙盒裡的,我們可以給自己建立乙個資料庫檔案名字一般是「***.sqlite」當然建立一次就夠了,接著再使用之前還是需要開啟的不然就不能使用了。同時為了方便使用也寫把manager分裝成了單例

開啟資料庫也可以使用sqlite3_open來開啟資料庫,但是有時會報錯,error: only read為了確保資料庫的可讀寫,就使用sqlite3_open_v2來開啟和配置資料庫為readwrite(可讀寫)

資料庫已經有了,可是沒有**也是不能儲存資料的,接下來就是建表

這裡會做一些判斷,主要是資料庫有沒有判斷還有**已存在的判斷 現在**有了,之後想幹嘛就能幹嘛了,哈哈哈 接著是**的增刪改查 可以使用sqlite3_exec()來執行,但是效率會低點,因為sqlite3_exec()會反覆的執行sqlite3_prepare_v2,sqlite3_step等所以效率會低,所以我們直接使用sqlite3_prepare_v2,sqlite3_step 首先是插入操作,由於每個人的想法思路不同,**結構也會不同 語句判斷(臨時寫的還需要大改)

func prepareforsqlite(type:sqlliteexectype,paramdic:[string:any]?,tablename:string)->opaquepointer?

var stmt : opaquepointer? = nil

guard let params = paramdic else

if params.keys.count < 0

// 1.獲取建立表的sql語句

let querysql = arraytostring(type:type,paramdic: paramdic!, tablename: tablename)

var rc:int32? = nil

if !(stmt != nil)

}var idx = 0

let querycount = sqlite3_bind_parameter_count(stmt);

for (key,value) in params

else

}_ = stepsql(sql: querysql, stmt: stmt!)

if (idx != int(querycount))

return stmt

}複製**

private func arraytostring(type:sqlliteexectype,paramdic:[string:any],tablename:string)->string.joined(separator: ",")

let querysql = "insert or replace into \(tablename)(\(keys)) values(\(valuess));"

return querysql

case .delete:

let querysql = "delete from \(tablename);"

return querysql

case .update:

return

"" default:

let querysql = "select * from \(tablename);"

return querysql}}

複製**

//mark:<*****==資料bind*****==>

//mark:繫結資料

////// - parameters:

/// - obj: 資料

/// - index: 位置

/// - stmt: 指標sqlite3_stmt物件

private func bindobjectbyindexwithp(obj:any,ndx:int32,stmt:opaquepointer) else

iflet data = obj as? nsdata else

iflet date = obj as? date else

iflet val = obj as? bool else

iflet val = obj as? double else

iflet val = obj as? int else

if flag != sqlite_ok

}複製**

**有點亂,但是基本的思路是

sqlite3_prepare_v2 準備 sqlite3_bind_*** 繫結資料 sqlite3_step 單步執行 sqlite3_finalize 釋放操作

一 移動CRM初探

總結多年以來開發實施 crm系統,發現當初由於客戶網路條件不能完成的功能在目前和未來幾年 3g和電線無線廣域網的網路條件下,竟可以做到完美,特將自己的一些想法總結,希望大家共同努力,為移動 crm的發展貢獻自己的乙份光。我以前從事 crm系統主要涉及市場管理 銷售終端管理 渠道管理 售後服務等 cr...

IOS資料儲存(一)

首先軟體在蘋果手機上的安裝目錄和軟體在手機上的資料檔案儲存目錄是不一樣的。該目錄 nsbundle mainbundle resourcepath 獲得,即軟體的打包目錄,nsbundle管理的一般都是此目錄下資源內容,而且該目錄內容只允許讀取,而不允許修改。在電腦上你可以右鍵選擇顯示包內容,可以看...

初探移動前端開發01 驚鴻一瞥

上周五老夫 自稱老夫是因為葉小釵已經100多歲啦,角色代入習慣了 吃壞了肚子啦,感覺也沒吃什麼東西就中暑了.糾其原因我覺得還是上週找工作太操勞了,太花費精力了,有一種情況是上午面下午面,或者下午2次面。面到周四時候我都有些不知道現在是面的哪家了。大家以後一次性還是不要面太多的公司了,這是個人的一點點...