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 文件 - 无法遍历实体的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL:将数据导出到 csv 文件

如何将数据框导出到数据湖中的 CSV 文件? [复制]

如何将数据从Python导出到.csv文件?

如何将 Django 模型数据导出到 CSV 文件中

无法将数据从数据库导出到 csv 文件

将特定查询数据从 netezza 数据库导出到 CSV 文件