2017-08-08 9 views
2

私は単語ゲームに取り組んでおり、sqliteデータベースを使用して英語の完全なリストをバンドルしています。私は、文字列かどうかを判断するためにデータベースを検索する最良の方法を見つけることを試みています。今迅速なsqliteデータベースへのクエリへのより良いアプローチ

func fetchWords() { 
    if let managedObjectContext = (UIApplication.shared.delegate as? AppDelegate)?.managedObjectContext { 

     let wordsFetch = NSFetchRequest<NSFetchRequestResult>(entityName: "EnglishWord") 

     do { 
      englishWords = try managedObjectContext.fetch(wordsFetch) as! [EnglishWord] 

      print(englishWords[123323].word) 
      //Prints "injustices" 

      } catch { 
       //error handling 
      } 
     } 
    } 

:私は配列にデータベース全体を取得することができます。この時点で、

。私が本当にやりたいことは、指定された文字列を渡して、それがデータベースに単語として存在するかどうかを確認することです。

func fetchWordsToArray() { 
     if let managedObjectContext = (UIApplication.shared.delegate as? AppDelegate)?.managedObjectContext { 

      let wordsFetch = NSFetchRequest<NSFetchRequestResult>(entityName: "EnglishWord") 

      let searchWord = ["dastardly"] 
      let searchPredicate = NSPredicate(format: "word = %@", argumentArray: searchWord) 

      do { 
       englishWords = try managedObjectContext.fetch(wordsFetch) as! [EnglishWord] 

       let resultFilteredByPredicate = (englishWords as NSArray).filtered(using: predicate) 
       print(resultFilteredByPredicate) 

      } catch { 
       //error handling 
      } 
     } 

    } 

しかし、フィルタリング機能を使用するために、私は私が(例えば、resultFilteredByPredicate.wordを得る)直接の結果では動作しないことができることを意味NSArrayのに変換する必要があります。私は、例えば、述語と不格好なソリューションを持っています。

また、私はおそらくこのすべての間違った方法について考えているように感じます。最初はすべてが配列に入っているので、最初はsqliteデータベースを使う価値が失われています。

データベースをよりよく操作するための推奨されるアプローチはありますか?

事前のお手伝いをさせていただきます。データベースを作るために

+1

SQLiteの質問では、Core Dataの質問です。 – rmaddy

+0

意味があります。コアデータをタグとして追加しました。ありがとうございました – enesefuu

答えて

1

は(その後、インデックスを使用して自動的に最適化することができる)、フィルタリング、put a predicate on the original fetch request行います

let formatRequest : NSFetchRequest<Word> = Word.fetchRequest() 
    fetchRequest.predicate = NSPredicate(format: "word == %@", searchWord) 
    let fetchedResults = try context.fetch(fetchRequest) as! [Word] 

をしかし、Core Dataは、あなたのオブジェクトを管理するためのフレームワークです。 あなたの言葉は、オブジェクトが、単なる値ではないことを決定した場合、あなたが直接SQLを実行し、いくつかの他のライブラリとのコアデータを交換し、代わりにSQLクエリを実行することができます:あなたが投稿コード、このISNに基づいて

SELECT * FROM EnglishWord WHERE word = ? 
+0

お返事ありがとうCLです。コアデータはオブジェクトを管理するためのフレームワークですが、あなたの言葉がオブジェクトではなく値だけであれば、Core DataをSQLを直接扱う他のライブラリに置き換えることができます」とSQLiteを使用して終了しました。迅速に私のニーズに適して感じる。再度、感謝します! – enesefuu

関連する問題