Skip to content

SwiftUI中使用sqlite

完整代码 SwiftUI-Demo-With-SQLite

代码参考: iOS — Persist Data using SQLite.swift Library with SwiftUI example | by Amisha I | Canopas

具体代码如何实现这里不在啰嗦,原作者原文写的非常详细。 这里只一下哪些可以学习的“套路”。

viewModel统一管理数据订阅

例如BikingListViewModel

  • 在List页面出现的时候调用getTaskList更新数据
  • 删除的时候更新数据源
swift
import Foundation
import SwiftUI

class BikingListViewModel: ObservableObject {
    @Published var allTask: [Task] = []

    func getTaskList() {
        allTask = BikingDataStore.shared.getAllTasks()
    }

    // 删除:删除完成刷新页面
    func deleteTask(at indexSet: IndexSet) {
        let id = indexSet.map { self.allTask[$0].id }.first
        if let id = id {
            let delete = BikingDataStore.shared.delete(id: id)
            if delete {
                getTaskList()
            }
        }
    }
}
import Foundation
import SwiftUI

class BikingListViewModel: ObservableObject {
    @Published var allTask: [Task] = []

    func getTaskList() {
        allTask = BikingDataStore.shared.getAllTasks()
    }

    // 删除:删除完成刷新页面
    func deleteTask(at indexSet: IndexSet) {
        let id = indexSet.map { self.allTask[$0].id }.first
        if let id = id {
            let delete = BikingDataStore.shared.delete(id: id)
            if delete {
                getTaskList()
            }
        }
    }
}

Tips

任意图形设置成圆角

使用.cornerRadius(.infinity)

swift
struct BikingStartButton: View {
    var body: some View {
        Image(systemName: "bicycle")
            .resizable()
            .scaledToFill()
            .frame(width: 25, height: 25)
            .foregroundColor(.white)
            .padding(20)
            .background(Color.accentColor)
            // 设置为圆角
            // 这种设置在创建按钮、卡片、标签等圆形或圆角视图时很有用。通常情况下,我们可以设置一个固定的半径来产生具有一定角度的圆角效果,但是当我们想要完全没有角度时,就需要将半径设置为无限大,即 cornerRadius(.infinity)。这样的设置可以使一个矩形视图变为一个完全圆形的视图,或使视图的四个角完全变为圆形,没有任何锐角。
            .cornerRadius(.infinity)
    }
}
struct BikingStartButton: View {
    var body: some View {
        Image(systemName: "bicycle")
            .resizable()
            .scaledToFill()
            .frame(width: 25, height: 25)
            .foregroundColor(.white)
            .padding(20)
            .background(Color.accentColor)
            // 设置为圆角
            // 这种设置在创建按钮、卡片、标签等圆形或圆角视图时很有用。通常情况下,我们可以设置一个固定的半径来产生具有一定角度的圆角效果,但是当我们想要完全没有角度时,就需要将半径设置为无限大,即 cornerRadius(.infinity)。这样的设置可以使一个矩形视图变为一个完全圆形的视图,或使视图的四个角完全变为圆形,没有任何锐角。
            .cornerRadius(.infinity)
    }
}

页面pop

swift
import SwiftUI

struct BikingDetailView: View {
    
    @ObservedObject var viewModel: BikingDetailViewModel
    @Environment(\.presentationMode) var presentationMode
    
    var status = ["Completed", "Incomplete"]

    var body: some View {
        VStack(spacing: 20) {
            HStack(spacing: 20) {
                Text("Name:")
                TextField("Name", text: $viewModel.name)
                    .textFieldStyle(.roundedBorder)
            }

            HStack(spacing: 20) {
                Text("Approx Date:")
                DatePicker("", selection: $viewModel.approxDate)
                Spacer()
            }

            HStack {
                Text("Status:")
                Picker("Choose Status?", selection: $viewModel.status) {
                    ForEach(status, id: \.self) {
                        Text($0)
                    }
                }
                .pickerStyle(.segmented)
                Spacer()
            }

            HStack {
                Button(action: {
                    let updateSuccess = viewModel.onUpdateClick()
                    if updateSuccess {
                        self.presentationMode.wrappedValue.dismiss()
                    }
                }) {
                    Text("Update")
                        .foregroundColor(.white)
                        .font(.headline)
                        .padding(.vertical, 10)
                        .padding(.horizontal, 30)
                }
                .background(Color.accentColor)
                .cornerRadius(.infinity)
                .padding()
            }
            Spacer()
        }
        .padding(.horizontal)
    }
}
import SwiftUI

struct BikingDetailView: View {
    
    @ObservedObject var viewModel: BikingDetailViewModel
    @Environment(\.presentationMode) var presentationMode
    
    var status = ["Completed", "Incomplete"]

    var body: some View {
        VStack(spacing: 20) {
            HStack(spacing: 20) {
                Text("Name:")
                TextField("Name", text: $viewModel.name)
                    .textFieldStyle(.roundedBorder)
            }

            HStack(spacing: 20) {
                Text("Approx Date:")
                DatePicker("", selection: $viewModel.approxDate)
                Spacer()
            }

            HStack {
                Text("Status:")
                Picker("Choose Status?", selection: $viewModel.status) {
                    ForEach(status, id: \.self) {
                        Text($0)
                    }
                }
                .pickerStyle(.segmented)
                Spacer()
            }

            HStack {
                Button(action: {
                    let updateSuccess = viewModel.onUpdateClick()
                    if updateSuccess {
                        self.presentationMode.wrappedValue.dismiss()
                    }
                }) {
                    Text("Update")
                        .foregroundColor(.white)
                        .font(.headline)
                        .padding(.vertical, 10)
                        .padding(.horizontal, 30)
                }
                .background(Color.accentColor)
                .cornerRadius(.infinity)
                .padding()
            }
            Spacer()
        }
        .padding(.horizontal)
    }
}