2016-11-10 29 views
0

從我的數據庫中的一個列到字典我要插入從我的數據庫到字典中的名字列在排序並添加部分,以我的tableView。 我有一個從數據庫中只存儲的名稱和返回MutableArray功能和返回字典的陣列另一個函數。 我不知道爲什麼,但我始終MutableArray爲零,心中已經設法得到的值的唯一方法是,當我嘗試排序的字典,並得到類型的返回值:字符串,[字符串]而不是[字符串:[字符串]如何使用Swift3

我的代碼:

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 
} 

}

我知道這是一個很大但我錯過了一些簡單的東西,我真的需要幫助。 謝謝大家...

+2

您在斯威夫特編程。你爲什麼使用NS [Mutable] Array而不是實際的Swift數組? – rmaddy

+0

我可以改變它,仍然不能解決問題 –

+1

如果你想知道爲什麼'marrCrimesNames'總是'nil',請使用你的調試器並跟蹤代碼的執行情況。 – rmaddy

回答

1

排序字典沒有意義。字典是無序的。

我的猜測是你希望你的表的數據由一個有序的數組部分表示。每個部分都可以用一個帶有兩個字段的結構來表示,其中一個用於第一個字母,另一個用於該部分中的名稱數組。

您可以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 
} 
+0

我有60個值這是一個大量的工作,不能把它從數據中可以完成的所有數據映射,而無需手動馬平的每一個值? –

+0

不,您不想手動映射數據,這只是爲了在遊樂場中嘗試代碼。我刪除了這些行,並添加了其餘的getSectionsFromData()。我希望更清楚。我會做的其他評論將考慮將NameInfo中的Name字段重命名爲name(Swift成員名稱通常以小寫字母開頭),並考慮使用Swift數組而不是'NSMutableArray'作爲' marrCrimesNames'。 –

+0

NSMutableArray包含所有數據庫,我的數據庫包含三列:名稱,詳細信息,時間。如果你認爲這樣更好,我可以將mutableArray轉換成swift數組 –