local:
宛名はoracleに保存した宛名データからcsvを経由してsqliteにコンバート可能、Core Dataのsqliteに直接変換できた (TablePlusを使った)
Core DataではSwiftUIを使うと一覧表示が簡単に作れた
こんなかんじのソース
struct MultiSelectRow : View { var atena: Atena @Binding var selectedItems: Set<ObjectIdentifier> var isSelected: Bool { selectedItems.contains(atena.id) } private func uketori(bit:Character) -> String { let bb : Int = Int(String(bit))! var v = "" if (bb & 1) != 0 { v += "受" } if (bb & 2) != 0 { v += "喪" } if (bb & 4) != 0 { v += "送" } if (bb & 8) != 0 { v += "喪" } return v } var body: some View { let item2: String = self.atena.lastName ?? "" let item3:String = self.atena.firstName ?? "" let item4:String = self.atena.addressCode ?? "" let item5:String = self.atena.fullAddress ?? "" let item6:String = self.atena.nyCard ?? "" let cIndex = item6.index(item6.endIndex, offsetBy: -8) let c = item6[cIndex] // "c" let item7:String = uketori(bit: c) if self.isSelected { ZStack(alignment: .topLeading) { Color.red.ignoresSafeArea() HStack { Text("\(item2) \(item3) \(item4) \(item5) \(item7)") } } .onTapGesture { self.selectedItems.remove(self.atena.id) } } else { ZStack(alignment: .topLeading) { Color.white.ignoresSafeArea() HStack { Text("\(item2) \(item3) \(item4) \(item5) \(item7)") } } .onTapGesture { self.selectedItems.insert(self.atena.id) } } } } struct ContentView: View { @Environment(\.managedObjectContext) private var viewContext @State var selectedRows = Set<ObjectIdentifier>() @FetchRequest( sortDescriptors: [NSSortDescriptor(keyPath: \Atena.furiLastName, ascending: true)], animation: .default) private var items: FetchedResults<Atena> var body: some View { List { ForEach(items) { item in MultiSelectRow(atena: item, selectedItems: self.$selectedRows) } .onDelete(perform: deleteItems) } .toolbar { #if os(iOS) EditButton() #endif Button(action: addItem) { Label("Add Item", systemImage: "plus") } } }
network:
SwiftOracleAutonomousを使うと ocilib を経由して oracle access可能
Swift Package Managerに対応していないため直接プロジェクトに追加
ocilibのビルド方法
chmod +x 755 config/install-sh ./configure --with-oracle-headers-path=$PKG_CONFIG_PATH/sdk/include --with-oracle-lib-path=$PKG_CONFIG_PATH --disable-dependency-tracking make sudo make install
macOS appはコマンドラインツールとは違って、ディフォルトで環境変数を持っていないため、ocilibで使っているTNS_ADMINの取得に必ず失敗してしまう かといって
Macでの環境変数(environment variables)の設定方法 - Qiita
みたいな方法をとるわけにもいかない
しかたないのでアプリ内で setenv で直接環境変数を書き換える
setenv("TNS_ADMIN", "/opt/oracle/network/admin", 1) setenv("NLS_LANG", "JAPANESE_JAPAN.AL32UTF8", 1) setenv("ORACLE_HOME", "/opt/oracle", 1) let b = Connection(connectString: "XXXXdb_tp", user:"admin", pwd: "passtoADW") try! b.open() let cursor = try! b.cursor() try! cursor.execute("select lastname from atena") var results = [String]() for r in cursor { results.append(r["LASTNAME"]!.string) } values = results
GUI作るのでなければやっぱり Go が一番楽だな..