ios - 如何使用 Swift3 从我的数据库中获取一列到字典中

标签 ios swift3

我想将数据库中的名称列插入到字典中,然后对其进行排序并将部分添加到我的 tableView 中。 我有只存储数据库中的名称并返回 MutableArray 的函数和另一个返回字典数组的函数。 我不知道为什么,但我的 MutableArray 总是 nil,我设法获取值的唯一方法是当我尝试对字典进行排序并获取类型的返回值时:[String, [String]] 而不是 [String : [字符串]]

我的代码:

let sharedInstance = ModelManager()   

class ModelManager: NSObject {

var database: FMDatabase? = nil

class func getInstance() -> ModelManager
{
    if(sharedInstance.database == nil)
    {
        sharedInstance.database = FMDatabase(path: Util.getPath("test3.sqlite"))
    }
    return sharedInstance
}

func getAllCrimesNames() -> NSMutableArray {    // Part1: database into mutableArray
    sharedInstance.database!.open()
    let resultSet: FMResultSet! = sharedInstance.database!.executeQuery("SELECT * FROM CrimeTable", withArgumentsIn: nil)
    let marrCrimesInfo : NSMutableArray = NSMutableArray()
    if (resultSet != nil) {
        while resultSet.next() {
            let crimesInfo : NameInfo = NameInfo()
            crimesInfo.Name = resultSet.string(forColumn: "Name")
            marrCrimesInfo.add(crimesInfo)
        }
    }

    sharedInstance.database!.close()
    return marrCrimesInfo
}

}

第 2 部分:将我的 mutableArray 放入字典并对其进行排序

class SectionData {

var marrCrimesNames : NSMutableArray!


func getCrimesNames() {
    marrCrimesNames = NSMutableArray()
    marrCrimesNames = ModelManager.getInstance().getAllCrimesNames()
}


func getSectionsFromData() -> [String: [String]] {

    var sectionDictionary =  [String: [String]]()

    if marrCrimesNames != nil {   // for some reason always nil!

    let crime: NameInfo = marrCrimesNames.object(at: 0) as! NameInfo
    _ = crime.Name
    var firstLetter: [String] = []

    for crime in marrCrimesNames {
        firstLetter.append((crime as AnyObject).Name)
    }

    let characters = Array(Set(firstLetter.flatMap({ $0.characters.first })))

    for character in characters.map({ String($0) }) {
        sectionDictionary[character] = firstLetter.filter({ $0.hasPrefix(character) })
    }

    //var sortedSectionDictionary = Array(sectionDictionary.keys).sorted()   // return [String, [String]] instead of [String: [String]]

    }
    return sectionDictionary
}

我知道很多,但我遗漏了一些简单的东西,我真的需要这里的帮助。 谢谢大家...

最佳答案

对字典进行排序没有意义。字典是无序的。

我的猜测是,您希望表的数据由已排序的部分数组表示。每个部分都可以由具有两个字段的结构体表示,一个用于第一个字母,一个用于该部分中的名称数组。

您可以使用如下代码将 sectionDictionary(将首字母映射到名称数组)转换为节结构的排序数组:

struct CrimeNameSection {
    let firstLetter: String
    let names: [String]
}

func getSectionsFromData() -> [CrimeNameSection] {
    // make sure marrCrimesNames is non-nil
    guard marrCrimesNames != nil else {
        return []
    }

    // add each name to dictionary mapping first letters to name arrays
    var sectionDictionary =  [String : [String]]()
    for crime in marrCrimesNames {
        let crime = crime as! NameInfo
        let firstChar = String(crime.Name[crime.Name.startIndex])
        if var names = sectionDictionary[firstChar] {
            names.append(crime.Name)
            sectionDictionary[firstChar] = names
        } else {
            sectionDictionary[firstChar] = [crime.Name]
        }
    }

    // convert sectionDictionary to sorted array of CrimeNameSections
    let sections = sectionDictionary.map { (key, value) in
        return CrimeNameSection(firstLetter: key, names: value)
    }
    let sortedSections = sections.sorted { $0.firstLetter < $1.firstLetter }

    return sortedSections
}

关于ios - 如何使用 Swift3 从我的数据库中获取一列到字典中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40533538/

相关文章:

php - 如何获得所有产品? MySQL, PHP

ios - 在 Swift3 的 iOS 中将查询参数添加到 GET url

ios - 应用启动时DYMTLInitPlatform平台初始化成功日志是什么?

android - Flutter AzureDevOps 设置

ios - uiscrollview 中的低分辨率图像,直到出现在屏幕上或返回一/加一

ios - 在 UIStackview 中添加时未在 UICollectionView 中触发方法

ios - 手动将数组输入 UiTableview

ios - 以编程方式创建具有颜色渐变的 UIView

iphone - 类似于 iPhone 版 Twitter 的导航风格

ios - 添加和删​​除单元格选择 View