1. 程式人生 > >在ios開發中資料庫升級解決方案

在ios開發中資料庫升級解決方案

在iOS開發中,經常會用到sqlite,在app迭代過程中,可能會有需求變更,需求的改變可能會影響資料庫結構的改變;那麼在不丟失原有資料的同時,又要修改資料庫結構,就要進行資料遷移。

我的做法是本地儲存一個app版本號,每次app啟動都會與Info.plist裡面的版本號比對,如果某個版本需要遷移資料,待資料遷移完成後再更新本地儲存的app版本號。

下面介紹一下匯入的詳細過程:

首先介紹一下專案的背景,有多個使用者的資料庫,那麼就存在同時遷移多個數據庫。所以設計思路就是,每個Operation對應一個數據庫的遷移,並加入到OperationQueue佇列中。這裡主要的任務落在了Operation中。

遷移流程如下圖所示:


假設:資料庫有一個表album, 欄位title  資料結構增加一個欄位artist

一、準備階段

1.DROP 掉上一次可能在匯入過程中意外中斷而建立的tmp_album;   

DROP TABLE IF EXISTS tmp_album;

2.CREATE 建立臨時表tmp_album;

CREATE TABLE tmp_album (`title` varchar, `artist` varchar);

3.讀取資料庫中資料總條數,以供上層展示進度;

totalCount;

二、遷移資料階段

思路:

  1. 以每頁50條資料,分頁讀取,並且插入到tmp_album表中,artist暫時為空;
  2. 在匯入過程中currentImportCount表示當前遷移條數,用於和totalCount計算進度百分比,供上層展示;
  3. 資料插入都用事務型(Transaction),如果有錯誤或者意外情況,*rollback = YES;cancel掉當前的Operation,最後刪除當前資料庫;
  4. 進入下一個資料庫遷移;

三、資料遷移完成階段

刪除album表,修改tmp_album表為album表,事務提交;

DROP TABLE IF EXISTS album;
ALTER TABLE tmp_album RENAME TO album;

如果資料庫有索引或者檢視之類的,在此基礎上新增一些相關邏輯即可;

相關推薦

ios開發資料庫升級解決方案

在iOS開發中,經常會用到sqlite,在app迭代過程中,可能會有需求變更,需求的改變可能會影響資料庫結構的改變;那麼在不丟失原有資料的同時,又要修改資料庫結構,就要進行資料遷移。 我的做法是本地儲存一個app版本號,每次app啟動都會與Info.plist裡面的版本號比

ios開發資料庫讀取資料牽涉到的日期處理:前一天、今天、後天、一週等

對時間處理,在開發時,時常碰到。一般有獲取具體的年月日和星期,兩個不同時間的差,某一天的前一天或後一天等;在這裡我只介紹獲取具體的年月日和星期,及某一天的前一天或後一天的方法;       對時間的處理一般都會用到NSDate類和NSCalendar類兩個類;      

iOS開發可以節省50%編譯等待時間的解決方案

作為開發者,我們是不是經常在等待Xcode完成build的過程中,感覺iOS程式需要編譯很久,有時候,老闆迫切希望給他的手機裝上最新的版本,然後馬上出門見客戶,這個時候,你肯定是特別希望,Xcode編譯的時候,能夠快一點,我記得有一次,我就因為這個,而被老闆記住了。所以,

iOS 蘋果開發證書失效的解決方案(Failed to locate or generate matching signing assets)

attempted can app 根證書 原因 ... emp ati dev 從2月14日開始,上傳程序的同學可能會遇到提示上傳失敗的提示. 並且打開自己的鑰匙串,發現所有的證書全部都顯示此證書簽發者無效. 出現以下情況: Failed to locate or gen

iOS開發“此證書的簽發者無效”的解決方式

courier data display sina 新浪微博 tracking 項目 text 輸入 iOS開發過程中有時候會出現證書所有變成無效,例如以下圖 然後進行打包的時候會提演示樣例如以下警告: 解決方法: 第一步: 下載ht

js點選事件在ios失效的解決方案

ios中不允許將點選事件繫結在document或者body上,如果繫結上的話將會失效。解決方案: 例如: $(document).on(‘click’, ‘#content’, function ()}… //無效 第一種: 改為: 用#content外面的標

【移動開發iOS和Android不規則按鈕解決方案

【寫在前面】如果看完這篇部落格,對你有幫助的話,歡迎加入全棧技術交流群,群內不定時釋出熱門學習資料,也歡迎進行技術交流,對我的部落格有疑問也可以在群裡@我。《全棧技術交流群歡迎你》 好久沒有寫Android和iOS了,最近看看之前寫的專案,別忘了,2333 效果圖 簡單介紹一下介

瑞智慧園區水電能效管理平臺開發工廠能源節約解決方案

伴隨物聯網的快速發展,企業/工廠等能源建築運營管理綜合資訊水平也在大大提高。源中瑞科技高度整合、大資料分析、智慧感知網等多方面技術的應用到能源綜合管理中,進行先進的能源管理和有效監控管理,達到智慧管控。整體能源資訊監管平臺,突破傳統能源監管模式,建立區域效能源管理管控平臺。實現系統內部各類子系統智慧化的執行;

完美解決ios開發兩個.framework檔案.o檔案衝突的問題(linker command failed with exit code 1 (use -v to see invocation)

專案中使用到XYPrinter.framework和Printer.framework中的兩個.o檔案有衝突, 查了資料通過拆分XYPrinter.framework刪除其中衝突的.o檔案,然後重新生成靜態庫, 解決了問題. 步驟如下: 新建一個資料夾resolveConfli

Unity5.x 專案升級過程常見問題解決方案總結

最近整理Unity4.x專案升級Unity5.0過程中出現的各種常見問題,與大家共享。1:Unity4.x專案中3D模型其材質丟失,成為“白模”?解決方案:手工重新賦值材質貼圖.  1:Unity4.x 專案中3D模型其材質丟失,成為“白模”?       解決方案:手工重

log4j 日誌檔案儲存資料庫解決方案一(配置檔案寫sql語句)

log4jmysql.properties: log4j.rootLogger=ERROR,console,db log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.

iOS開發-SQLite資料庫在App專案的設定及使用

在iOS開發中,除了UI頁面以外使用最多的估計是資料物件的儲存了~比如聊天記錄、通訊錄和通訊記錄、瀏覽記錄等等。我們要根據不同的使用方式去對這些資料儲存並使用。常用的有:①沙盒機制 ②屬性列表plist ③SQLite ④CoreData,本文介紹的就是基礎的SQLite

iOS開發解決UIScrollView滾動時NSTimer失效的問題

我不知道大家在使用NSTimer的時候有沒有發現如果我們滑動ScrollView,NSTimer就會失效。我曾經遇到過這樣的問題,但需求是即使滑動scrollView,NSTimer也不能失效,於是就

Android開發資料庫(sqlite)的檢視及一些問題的解決方法

最近在學習Android中的Sqlite遇到一些問題,這裡做一下總結。 一、建立資料庫 首先你要新建一個使用Sqlite的APP,開發工具Ecplise、AndroidStudio都可,這裡以後者AS為例。如果你沒有現成的程式,可以用博主的這個、 檔名

iOS開發使用NSUserDefaults儲存的物件變成null的解決辦法

問題描述:         在除錯專案的時候遇到的問題,用NSUserDefaults將一個字串寫在本地,然後就重新執行程式,但是此時用NSUserDefaults取到的值為null。 原因分析:  

解決iOS開發涉及到的retain cycle導致控制器無法釋放的問題

這幾天碰到專案中一個bug,從一個列表進入任務詳情頁面,回覆一條資訊後,會導致列表中所有的cell點選進去全都是剛剛回復的那條任務詳情。bug不細說,因為同事之前改過一個問題,有一個對列表資料賦值的操作,但是這個操作只會在介面呼叫完成後在詳情控制器裡進行,如果退出了,那麼控

iOS開發解決Compiling IB documents for earlier than ios 7 is no longer supported的問題

問題: 在利用Xcode9執行之前的專案的時候報錯: Compiling IB documents for earlier than ios 7 is no longer supported。(編譯比ios7更早的IB文件不再受支援。) 找到報錯的

iOS開發地圖與定位

視圖 編寫 aps 簡單 -a 第三方 span spa margin   不管是QQ還是微信的移動client都少不了定位功能,之前在微信demo中沒有加入定位功能,今天就寫個定位的小demo來了解一下定位和地圖的東西。地圖和定位看上去是挺高大上一東西。其有使用方法比

JAVA異常基本知識及異常在Spring框架的整體解決方案

我們 程序 details 編譯錯誤 htm 及其 arch extends exception 異常的頂級父類是Throwable,下面有兩個子類Exception和Error。 Error錯誤一般是虛擬機相關的問題,如系統崩潰,虛擬機錯誤等,應用程序無法處理,直接導致

iOS開發,獲取iOS設備型號

bsp ios設備型號 isequal uid eve ide inf turn res 1、首先要導入頭文件   #import <sys/utsname.h> 2、代碼如下 - (NSString *)getDeviceVersionInfo{