Flutter项目中 IOS小组件访问flutter数据库文件

提前在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?
}

猜你喜欢

转载自blog.csdn.net/renxi0/article/details/131230993