关于宏伟而令人惊叹的SQLite.swift,我想知道
您在应用程序商店中有一个应用程序,v7。这是对v8的升级。用户X确实使用应用程序商店将v7升级到v8。
比方说,在v8中,我们稍微更改了一个SQL表,可能添加了一列或重命名了一列。
在这种情况下,在SQLite.swift中是否应该或必须做一些特殊的事情?
SQLite.swift处理这个问题的方法是什么?
(例如,在安卓系统中,有一个方便的onUpgrade
发布于 2016-12-12 21:47:05
SQLiteOpenHelper的实现非常简单:
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。
发布于 2018-10-25 15:20:13
有两种情况需要升级数据库:
下面的例子解释了如何解决第一种情况。第二种情况需要根据示例添加更多的逻辑。
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。
https://stackoverflow.com/questions/41100001
复制相似问题