在ios开发中数据库升级解决方案

来源:互联网 发布:数据库时间戳类型 编辑:程序博客网 时间:2024/05/16 19:22

在iOS开发中,经常会用到sqlite,在app迭代过程中,可能会有需求变更,需求的改变可能会影响数据库结构的改变;那么在不丢失原有数据的同时,又要修改数据库结构,就要进行数据迁移。

我的做法是本地存储一个app版本号,每次app启动都会与Info.plist里面的版本号比对,如果某个版本需要迁移数据,待数据迁移完成后再更新本地存储的app版本号。

下面介绍一下导入的详细过程:

首先介绍一下项目的背景,有多个用户的数据库,那么就存在同时迁移多个数据库。所以设计思路就是,每个Operation对应一个数据库的迁移,并加入到OperationQueue队列中。这里主要的任务落在了Operation中。

数据库操作用 FMDB github地址

迁移流程如下图所示:


假设:数据库有一个表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;


如果数据库有索引或者视图之类的,在此基础上添加一些相关逻辑即可;


0 0
原创粉丝点击