将 CSV 数据导入 Realm 会导致 “null” 字符串,而不是可选字符串的 swift nil

Importing CSV Data to Realm Results in "null" String Instead of Swift nil for Optional String

提问人:Zack 提问时间:10/8/2023 更新时间:10/10/2023 访问量:36

问:

我正在将数据从 CSV 文件导入到本地 Realm 数据库中。我的 Realm 模型中的一个属性是定义为可选的 String (String?)。

当我遇到一个值为空(即,,)的 CSV 字段时,当它导入 Realm 时,它在 Realm Studio 中显示为 null。不是“null”字符串。但是,在 Swift 中,当我检索此属性时,它会返回“null”作为 String 而不是 nil。该属性在我的 Swift 类中是可选的。

@objc dynamic var name: String? = nil

有没有办法处理空的 CSV 值,以便它们在 Swift 中作为实际的 nil 值导入到 Realm 中?我想确保可选的 String 属性在我的 Swift 代码中正确表示为 nil?

iOS Swift 领域

评论

0赞 Jay 10/8/2023
我发布了一个答案,显示将任何内容导入可选字段会导致应有的零值。如果您看到不同的行为,请在问题中提供更多信息,以便我们可以复制它 - 也许是一些示例数据,然后是您在 Realm Studio 中看到的内容的屏幕截图,然后是读取该代码的代码,以显示 Realm Studio 中显示的 null 被读取为非 nil。

答:

1赞 Jay 10/8/2023 #1

Realm Studio 将 nil 值显示为 “null”,其中属性包含 nil,就像在没有值的可选值中一样。

下面是一个示例。创建一个具有两个属性的测试模式,一个是非可选属性,一个是可选属性

class Test: Object {
    @Persisted var name = ""
    @Persisted var myOptional: String?
}

然后是一些代码来测试导入的内容

let results = realm.objects(Test.self)

for r in results {
    print( type(of: r.myOptional) )
    if r.myOptional == nil {
        print("myOptional was nil")
    } else {
        print("myOptional was not nil")
    }
}

上面的代码读取所有导入的值,获取类型对象 is 并将其打印到控制台,然后确定它是否为 nil。myOptional

下面是包含两个要导入的对象的平面文件,称为 Test.csv。请注意,Jay 对象的可选属性是“some string”,而 Cindy 的可选属性是空的

name,myOptional
Jay,some string
Cindy,

然后导入平面文件,在 Realm Studio 中如下所示

enter image description here

运行代码,下面是控制台输出

The myOptional property was of type: Optional<String>
    myOptional was not nil
The myOptional property was of type: Optional<String>
    myOptional was nil

编辑:

有关在标题和数据字段中处理双引号的问题。下面是一个示例

"name","myOptional"
Jay,some string
Cindy,
"Hello","World"
"Hello",

导入时,结果

enter image description here

评论

0赞 Zack 10/9/2023
我按照您的指南创建示例数据,并意识到当我的 csv 标题行有双引号时,问题就来了,即。“id”,“名称”....我猜一定和 Realm Studio 有关
0赞 Jay 10/10/2023
@Zack Realm Studio 应该处理标题和数据字段中的双引号。查看我的编辑