SwiftUI - 将核心数据导出到 CSV 文件 - 无法遍历实体
Posted
技术标签:
【中文标题】SwiftUI - 将核心数据导出到 CSV 文件 - 无法遍历实体【英文标题】:SwiftUI - Exporting Core Data to CSV file - cannot iterate through entity 【发布时间】:2020-06-11 06:53:59 【问题描述】:我正在使用 SwiftUI 编写应用程序。 我正在尝试将核心数据中一个实体(NPTransactions,属性:日期(日期),类型(字符串))的所有条目导出到 CSV 文件中。我想使用共享表,例如,用户可以将文件保存到他们的手机中。
我知道该怎么做是: - 创建 CSV 文件 - 保存 CSV 文件 - 打开分享表
问题是: 我不知道如何遍历实体条目并在 CSV 文件中创建新的文本行。
我想像这样从我的实体创建一个数组:
var transactions = [NPTransaction]()
后来我希望遍历这个数组并为每个条目添加新的文本行。但它不起作用。没有从此 for 循环中添加任何文本。
我的代码是这样的:
import SwiftUI
struct SettingsView: View
@State private var isShareSheetShowing = false
var transactions = [NPTransaction]()
var body: some View
NavigationView
Button(action: shareButton)
HStack(alignment: .firstTextBaseline)
Text("Export CSV")
.font(.headline)
Image(systemName: "square.and.arrow.up")
.font(.title)
.navigationBarTitle("Settings")
func shareButton()
let fileName = "export.csv"
let path = NSURL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(fileName)
var csvText = "Date,Type\n"
// This test works
// for _ in 1...5
// csvText += "test 1, test 2\n"
//
// This doesn't work
for transaction in transactions
csvText += "\(transaction.date ?? Date()),\(transaction.type ?? "-")\n"
do
try csvText.write(to: path!, atomically: true, encoding: String.Encoding.utf8)
catch
print("Failed to create file")
print("\(error)")
print(path ?? "not found")
var filesToShare = [Any]()
filesToShare.append(path!)
let av = UIActivityViewController(activityItems: filesToShare, applicationActivities: nil)
UIApplication.shared.windows.first?.rootViewController?.present(av, animated: true, completion: nil)
isShareSheetShowing.toggle()
struct SettingsView_Previews: PreviewProvider
static var previews: some View
SettingsView()
是我的 for 循环有问题还是我应该换一种方式?例如以某种方式使用 fetchRequest?
【问题讨论】:
数组为空。您必须在某处fetch
数据。
谢谢。是的。而且我不知道如何正确地做到这一点。我发现的例子是旧的或不是来自 SwiftUI,我无法让它们工作
获取数据与 SwiftUI 无关。如果你在处理 CoreData,你必须知道如何获取数据。
谢谢,瓦迪安。您的回答帮助我解决了问题:)
【参考方案1】:
尤里卡! :) 我错过了@FetchRequest:
@FetchRequest(entity: NPTransaction.entity(), sortDescriptors: []) var transactions: FetchedResults<NPTransaction>
下面的完整代码。也许它对其他人有用。
import SwiftUI
struct SettingsView: View
@FetchRequest(entity: NPTransaction.entity(), sortDescriptors: []) var transactions: FetchedResults<NPTransaction>
@State private var isShareSheetShowing = false
var body: some View
NavigationView
Button(action: shareButton)
HStack(alignment: .firstTextBaseline)
Text("Export CSV")
.font(.headline)
Image(systemName: "square.and.arrow.up")
.font(.title)
.navigationBarTitle("Settings")
func shareButton()
let fileName = "export.csv"
let path = NSURL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(fileName)
var csvText = "Date,Type\n"
for transaction in transactions
csvText += "\(transaction.date ?? Date()),\(transaction.type ?? "-")\n"
do
try csvText.write(to: path!, atomically: true, encoding: String.Encoding.utf8)
catch
print("Failed to create file")
print("\(error)")
print(path ?? "not found")
var filesToShare = [Any]()
filesToShare.append(path!)
let av = UIActivityViewController(activityItems: filesToShare, applicationActivities: nil)
UIApplication.shared.windows.first?.rootViewController?.present(av, animated: true, completion: nil)
isShareSheetShowing.toggle()
struct SettingsView_Previews: PreviewProvider
static var previews: some View
SettingsView()
【讨论】:
以上是关于SwiftUI - 将核心数据导出到 CSV 文件 - 无法遍历实体的主要内容,如果未能解决你的问题,请参考以下文章