提前在flutter端准备好的数据库,也可以flutter端对数据文件进行操作。
这里只是对flutter资源文件中的数据库文件进行读取,并在IOS小组件中进行展示。
数据库文件内容(路径:assets/db.sqlite)
(id: 1, context: happy1)
(id: 2, context: happy2)
(id: 3, context: happy3)
(id: 4, context: happy4)
(id: 5, context: happy5)
(id: 6, context: happy6)
(id: 7, context: happy7)
(id: 8, context: happy8)
(id: 9, context: happy9)
(id: 10, context: happy10)
(id: 11, context: happy11)
(id: 12, context: happy12)
获取flutter资源路径后放入UserDefaults
let controller = window?.rootViewController as! FlutterViewController
let key: String = controller.lookupKey(forAsset: "assets/db.sqlite");
let mainBundle = Bundle.main
let path = mainBundle.path(forResource: key, ofType: nil)
let userDefaults = UserDefaults(suiteName: "你的 app group")
userDefaults?.setValue(path, forKey: "path")
print("获取flutter资源文件夹路径:\(String(describing: path))")
创建好小组件后,在生成的小组件文件夹下新建DataBaseService.swift文件。
配置好同一个App Group。
//
// DataBaseService.swift
// Runner
//
// Created by Metajoy-Release-1 on 2023/6/13.
//
import Foundation
import SQLite3
class DatabaseService{
private let queryStatementString = "select id,context from quote;"
private var dbPath: String = ""
// SQLite database to use, equivalent to Dart's Database `_db` field.
private var db: OpaquePointer?
// Convient Swift's method to initialize the class.
init() {
let userDefaults = UserDefaults(suiteName: "你的app group")
dbPath = userDefaults?.string(forKey: "path") ?? ""
print("dbPath:\(dbPath)")
openDb()
}
private func openDb() {
if sqlite3_open(dbPath, &db) != SQLITE_OK {
print("Error opening database")
} else {
print("Successfully opened connection to database at \(dbPath)")
}
}
func getInfo() -> Array<String> {
print("调用getCount")
var maybeCount: Array<String> = []
var queryStatement: OpaquePointer?
let sqlState = sqlite3_prepare_v2(db, queryStatementString, -1, &queryStatement, nil)
print(sqlState)
if sqlState == SQLITE_OK {
while sqlite3_step(queryStatement) == SQLITE_ROW {
guard let value = sqlite3_column_text(queryStatement, 1)
else {
print("Query result is nil")
return []
}
// maybeCount.append(String(cString: context))
let context = String(cString: value)
// print("数据库查询结果:\(context)")
maybeCount.append(context)
}
} else {
print("SELECT statement could not be prepared")
}
sqlite3_finalize(queryStatement)
sqlite3_close_v2(db)
return maybeCount
}
}
在小组件时间轴生成函数中调用方法
func getTimeline(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
var entries: [SimpleEntry] = []
// Generate a timeline consisting of five entries an hour apart, starting from the current date.
let db = DatabaseService.init()
let count:Array<String> = db.getInfo()
let currentDate = Date()
if count.count > 0 {
for hourOffset in 0 ..< count.count {
let entryDate = Calendar.current.date(byAdding: .minute, value: hourOffset, to: currentDate)!
let entry = SimpleEntry(date: entryDate, configuration: configuration, count: count[hourOffset])
entries.append(entry)
}
}else{
for hourOffset in 0 ..< 10 {
let entryDate = Calendar.current.date(byAdding: .minute, value: hourOffset, to: currentDate)!
let entry = SimpleEntry(date: entryDate, configuration: configuration, count: "小组件\(hourOffset)" )
entries.append(entry)
}
}
let timeline = Timeline(entries: entries, policy: .atEnd)
completion(timeline)
}
struct SimpleEntry: TimelineEntry {
let date: Date
let configuration: ConfigurationIntent
let count: String?
}