返回实体中的随机属性(核心数据)

Posted

技术标签:

【中文标题】返回实体中的随机属性(核心数据)【英文标题】:Return random attribute in entity (Core Data) 【发布时间】:2017-08-06 19:08:17 【问题描述】:

verbDatabase Table 我正在使用的数据如下以及上面的屏幕截图中:

+----+------------+------------+------------+
| id | infinitive | ind pre je | ind pre tu |
+----+------------+------------+------------+
|  1 | aimer      | aime       | aimes      |
|  2 | aller      | vais       | vas        |
|  3 | courir     | cours      | cours      |
|  4 | servir     | sers       | sers       |
|  5 | mourir     | meurs      | meurs      |
|  6 | dormir     | dors       | dors       |
|  7 | sentir     | sens       | sens       |
|  8 | vêtir      | vêts       | vêts       |
|  9 | fuir       | fuis       | fuis       |
| 10 | tenir      | tiens      | tiens      |
+----+------------+------------+------------+

我是编码新手,正在开发一个法语变位应用程序,该应用程序通过显示不定式形式的动词(到 verbLabel.text)和所需的时态(到tensileLabel.text)来测试用户的变位。目标是让用户输入(到 userInput.text)那个动词的共轭形式,然后按下一个按钮(checkAnswer)来检查他们的答案。如果答案正确,则会生成一个新的动词,等等。

我有一个名为 verbDatabase 的 CoreData 实体,其属性名为 idinfinitiveindPreJeindPreTu

我已经设法生成了一个随机行(以显示一个随机动词),但我无法生成一个随机属性(indPreJe 或 indPreTu)。要生成随机属性并且因为属性名称必须以小写字母开头,我不能使用与生成随机行相同的方法。

为了解决这个问题,我尝试创建一个包含属性名称的数组,然后生成一个随机数,然后将属性名称附加到紧张标签.text 中显示的获取请求中,但紧张标签文本显示字符串 "verbDatabase[0].indPreJe"而不是verbDatabase[0].indPreJe 的值。

有没有办法让文本标​​签在附加随机属性名称而不是字符串指向该值后显示该值?

如果我以低效的方式处理我的数据,是否有更好的方法将我的数据存储到 Core Data 中,让我能够更好地使用我正在尝试做的事情来访问它?我仍在尝试围绕核心数据结构。我还考虑将动词保存为单独的字典,时态作为键,共轭形式作为对应的值。

理想情况下,我希望能够允许用户选择他们想要测试的时态,并对动词进行分类 - 常规形式、不规则形式、常用动词等。

提前感谢您的帮助!

@IBOutlet weak var verbLabel: UILabel!
@IBOutlet weak var tenseLabel: UILabel!
@IBOutlet weak var userInput: UITextField!
@IBOutlet weak var textView: UITextView!
var currentRow: Int = 0
var countTenseColumns: Int = 2
var currentColumn: Int = 0
var columnNames = ["id","infinitive","indPreJe","indPreTu"]

@IBAction func checkAnswer(_ sender: Any) 

    if userInput.text == verbDatabase[currentRow].indPreTu 
        textView.text = "correct!"
        viewWillLayoutSubviews()
        userInput.text = nil
    

    else 
     textView.text = "the correct answer is \(verbDatabase[currentRow].indPreTu ?? "error")"

    


func randomNumberGeneratorRow() -> Int 
    //generates random number from 1 to verbDatabase.count
    return Int(arc4random_uniform(UInt32(verbDatabase.count)+1))


func randomNumberGeneratorColumn() -> Int 
    //generates random number from 2 to number of columns with tenses
    return Int(arc4random_uniform(UInt32(countTenseColumns)+2))


override func viewWillLayoutSubviews() 
    currentRow = self.randomNumberGeneratorRow()
    currentColumn = self.randomNumberGeneratorColumn()
    var columnName = "verbDatabase[0].\(columnNames[currentColumn])"

    verbLabel.text = verbDatabase[currentRow].infinitive
    tenseLabel.text = columnName     

【问题讨论】:

【参考方案1】:

有没有办法让文本标​​签在附加随机属性名称而不是字符串指向该值后显示该值?

是的,你可以使用value(forKey:)(见the documentation here):

var columnName = columnNames[currentColumn]
tenseLabel.text = verbDatabase[currentRow].value(forKey:columnName)

【讨论】:

非常感谢!我开始担心我必须重新格式化我的数据!为了完整起见,Swift 让我添加了 as! String: tenseLabel.text = verbDatabase[currentRow].value(forKey:columnName) as! String

以上是关于返回实体中的随机属性(核心数据)的主要内容,如果未能解决你的问题,请参考以下文章

来自核心数据多对多关系的随机实体

使用 Swift 3 显示来自核心数据的随机数据

核心数据中的 NSFetchRequest

数据库中的随机值

核心数据:编辑许多属性滞后性能

核心数据随机崩溃,可能存在并发问题