首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS SQLite.swift,关于应用程序的升级?

iOS SQLite.swift,关于应用程序的升级?
EN

Stack Overflow用户
提问于 2016-12-12 19:38:01
回答 2查看 937关注 0票数 8

关于宏伟而令人惊叹的SQLite.swift,我想知道

您在应用程序商店中有一个应用程序,v7。这是对v8的升级。用户X确实使用应用程序商店将v7升级到v8。

比方说,在v8中,我们稍微更改了一个SQL表,可能添加了一列或重命名了一列。

在这种情况下,在SQLite.swift中是否应该或必须做一些特殊的事情?

SQLite.swift处理这个问题的方法是什么?

(例如,在安卓系统中,有一个方便的onUpgrade

EN

回答 2

Stack Overflow用户

发布于 2016-12-12 21:47:05

SQLiteOpenHelper的实现非常简单:

代码语言:javascript
复制
        db = SQLiteDatabase.openDatabase(...);

        onConfigure(db);

        int version = db.getVersion();
        if (version != mNewVersion) {
            db.beginTransaction();
            try {
                if (version == 0) {
                    onCreate(db);
                } else {
                    if (version > mNewVersion) {
                        onDowngrade(db, version, mNewVersion);
                    } else {
                        onUpgrade(db, version, mNewVersion);
                    }
                }
                db.setVersion(mNewVersion);
                db.setTransactionSuccessful();
            } finally {
                db.endTransaction();
            }
        }

只要在Swift中做同样的事情。

有关如何实现onUpgrade()的信息,请参阅SQLiteOpenHelper onUpgrade() Confusion Android

票数 7
EN

Stack Overflow用户

发布于 2018-10-25 15:20:13

有两种情况需要升级数据库:

  • 没有存储用户数据: tables....
  • There只包含预定义的数据,而您想要更改表的结构、添加新行、添加新的数据库都存储了用户数据:您想要更改数据并保留用户数据。

下面的例子解释了如何解决第一种情况。第二种情况需要根据示例添加更多的逻辑。

代码语言:javascript
复制
import UIKit
import FMDB

class DataConnection: NSObject {
    static let databaseVersion = 2
    static var isDatabaseUpdated = false
    static var database: FMDatabase? = nil
    class func databaseSetup() {
        if database == nil {
            let docsDir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
            let dpPath = docsDir.appendingPathComponent("database.sqlite")
            let file = FileManager.default
            if(!file.fileExists(atPath: dpPath.path)) {
                copyDatabase(file: file, dpPath: dpPath)
                database = FMDatabase(path: dpPath.path)
                do {
                    database!.open()
                    try database!.executeUpdate("PRAGMA user_version = \(databaseVersion)", values: nil)
                    database!.close()
                    isDatabaseUpdated = true
                }catch {
                    print("Error on updating user_version")
                }
            }else {
                database = FMDatabase(path: dpPath.path)
                if !isDatabaseUpdated {
                    var currentVersion = 0
                    do {
                        database!.open()
                        let resultSet: FMResultSet! = try database!.executeQuery("pragma user_version", values: nil)
                        while resultSet.next() {
                            currentVersion = Int(resultSet.int(forColumn: "user_version"))
                        }
                        database!.close()
                    }catch {
                        print("Error on getting user_version")
                    }

                    if databaseVersion > currentVersion {
                        do {
                            try file.removeItem(at: dpPath)
                        }catch {
                            print("Error on getting user_version")
                        }
                        copyDatabase(file: file, dpPath: dpPath)
                        database = FMDatabase(path: dpPath.path)
                        do {
                            database!.open()
                            try database!.executeUpdate("PRAGMA user_version = \(databaseVersion)", values: nil)
                            database!.close()
                            isDatabaseUpdated = true
                        }catch {
                            print("Error on updating user_version")
                        }
                    }else {
                        isDatabaseUpdated = true
                    }
                }
            }
        }
    }

    private class func copyDatabase(file: FileManager, dpPath: URL){
        let dpPathApp = Bundle.main.path(forResource: "database", ofType: "sqlite")
        print("resPath: "+String(describing: dpPathApp))
        do {
            try file.copyItem(atPath: dpPathApp!, toPath: dpPath.path)
            print("copyItemAtPath success")
        } catch {
            print("copyItemAtPath fail")
        }
    }
}

在这个例子中,一旦你发布了一个新的应用程序版本并且想要升级数据库,你只需要增加变量databaseVersion

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41100001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档