iOS/Swift 어플 따라하기

[Swift] Query using Coredata (Searchbar)

Chafle 2022. 10. 17. 17:57
반응형

1. UISearchBar delegate 설정

2. searchbar.delegate = self (서치바를 ctrl + 해당하는 viewcontroller에 끌어다 놓기)

 

3. delegate메서드 추가하기

 

 

4. context에 요청 (NSFetchRequest 사용)

 

 

 let request: NSFetchRequest<Item> = Item.fetchRequest()

 

반응형

 

 


 

5. 쿼리에 태그 달기 (NSPredicate 사용)

 

 

let predicate = NSPredicate(format: "title CONTAINS[cd] %@", searchBar.text!)
request.predicate = predicate

 

predicate는 서술부 혹은 근거를 두다, 단정하다 정도로 해석되는데

NSPredicate는 아마 ~에 근거에서 쿼리하는 정도가 맞는 듯하다..

 

%@ (%at)

는 전달하려는 모든 종류의 인수를 대체할 수 있다.

 

cd는 c는 case의 약자고 d는 diacritic의 약자인데

[cd]를 넣는 이유는

대/소문자 구별과 발음 구별 부호를 무시?(둔하게?)하게 하는 명령이다 

즉 'ÇHÂŚŠÏ 같은 단어를 찾을 때 chassi만으로도 검색이 가능하게 해주는 기능..

 

format은 당연히 입력인데

args는 매개변수로 값을 넘겨주는 실제의 값이다

 

arg의 실제값이 %@로 대체된다.

그러므로 quary를 해석해보면 array에서 title에 검색한 값이 포함된 것을 찾아라가 된다.

 


 

 

6. DB에서 가져온 data 정렬하기 (NSSortDescriptor 사용)

 

let sortDescriptor = NSSortDescriptor(key: "title", ascending: true)
request.sortDescriptors = [sortDescriptor]

 

do {
            itemArray = try context.fetch(request)
        } catch {
            print("error fetching data from context \(error)")
        }
        tableView.reloadData()
    }

그 이후 context로 가져온 요청을 다시 itemArray에 할당하고 가져오는 작업

 

 

 

 




 

최종 

//1. 
extension TodoListViewController: UISearchBarDelegate {

//3.
    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
    //4.
        let request: NSFetchRequest<Item> = Item.fetchRequest()
        //5.
        request.predicate = NSPredicate(format: "title CONTAINS[cd] %@", searchBar.text!)

        //6.
        request.sortDescriptors = [NSSortDescriptor(key: "title", ascending: true)]
        

       do {
            itemArray = try context.fetch(request)
        } catch {
            print("error fetching data from context \(error)")
        }
        tableView.reloadData()
    }

    }

 

 

 

반응형