关于宏伟而神奇的SQLite.swift,我想知道
您在应用商店中有一个应用,v7。有一个升级到v8。用户X使用应用程序商店将v7升级到v8。
在v8中说,我们稍微更改了一个sql表,可能是添加一个列或重命名一列。
在这种情况下,SQLite.swift中是否应该执行任何特殊操作?
SQLite.swift处理它的方法是什么?
(例如,Android在onUpgrade中有一个方便的helper class概念......它带有一系列复杂的问题。)
答案 0 :(得分:7)
SQLiteOpenHelper的实施非常简单:
sap.ui.define(['jquery.sap.global', 'sap/m/RadioButtonGroup'
], function (jQuery, RadioButtonGroup) {
"use strict";
var CustomRadioButtonGroup = RadioButtonGroup.extend("my.app.controls.RadioButtonGroup", {
metadata: {
aggregations: {
buttons : {type : "my.app.controls.RadioButtonImage", multiple : true, singularName : "button", bindable : "bindable"}
},
defaultAggregation : "buttons",
}
});
return CustomRadioButtonGroup;
}, true);
在Swift中做同样的事。
有关如何实施 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();
}
}
的信息,请参阅SQLiteOpenHelper onUpgrade() Confusion Android。
答案 1 :(得分:0)
有两种情况要升级数据库:
没有存储用户数据:数据库仅包含预定义数据,并且您想要更改表的结构,添加新行,添加新表。...
其中存储了用户数据:您想要更改数据以及保持用户数据持久化。
以下示例说明了如何解决第一种情况。第二种情况需要根据示例添加更多逻辑。
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
。