2016-11-10 7 views
0

私のデータベースから辞書に名前の列を挿入して並べ替え、セクションを自分のtableViewに追加したいと思います。 私はデータベースからの名前だけを格納し、MutableArrayと辞書の配列を返す別の関数を返す関数を持っています。 なぜ私のMutableArrayが常にnilであるかわからないのですが、値を取得するために管理されている唯一の方法は、辞書をソートしようとしたときに戻り値の型[String、[String]文字列:[文字列]]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

。実際のSwift配列の代わりに 'NS [Mutable] Array'を使っているのはなぜですか? – rmaddy

+0

私はそれを変更することができますが、まだ問題を解決していません –

+1

'marrCrimesNames'が常に' nil'である理由を知りたい場合は、デバッガを使用してコードの実行をトレースしてください。 – rmaddy

答えて

1

辞書を並べ替えるのは意味がありません。辞書は順序付けられていません。

私の推測では、テーブルのデータをセクションのソートされた配列で表現したいと考えています。各セクションは、最初の文字とそのセクション内の名前の配列のフィールドの2つのフィールドを持つ構造体で表すことができます。

あなたは、このようなコードを使用してセクションの構造体のソートされた配列に名前の配列の最初の文字をマップあなたの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メンバー名は通常小文字で始まります)に変更し、' NSMutableArray'ではなくSwift配列を ' marrCrimesNames'。 –

+0

NSMutableArrayはすべてのデータベースを保持しています。私のデータベースには、名前、詳細、時刻という3つの列があります。あなたがそれがより良いと思うなら、私はmutableArrayをswift配列に変換できます –