Isar는 Flutter 및 Dart 환경에서 사용 가능한 NoSQL 데이터베이스입니다. 매우 빠르고, 가벼우며, 오프라인 애플리케이션에서 사용하기 적합합니다.
Isar에서는 데이터를 저장하고 관리하기 위해 쿼리를 사용할 수 있습니다. 여기에서는 Isar의 쿼리를 어떻게 작성하고 사용할 수 있는지 쉽고 자세히 설명합니다.
Isar에서 데이터를 검색하거나 필터링하기 위해 쿼리를 작성합니다.
final books = await isar.books.filter().isPublishedEqualTo(true).findAll();
위 코드는 books 컬렉션에서 isPublished 필드가 true인 모든 데이터를 가져오는 예제입니다.
.filter(): 필터링 조건을 시작합니다.isPublishedEqualTo(true): isPublished 필드가 true인 항목만 선택합니다..findAll(): 조건에 맞는 모든 데이터를 가져옵니다.// Book 모델 정의
()
class Book {
Id? id;
String title;
bool isPublished;
}
// 쿼리 사용 예시
final publishedBooks = await isar.books.filter().isPublishedEqualTo(true).findAll();
print(publishedBooks);
Isar의 필터링은 매우 강력하며 다양한 조건을 지원합니다.
final filteredBooks = await isar.books.filter()
.priceGreaterThan(10)
.priceLessThan(50)
.findAll();
위 코드는 가격이 10보다 크고 50보다 작은 모든 책을 검색합니다.
priceGreaterThan(10): 가격이 10보다 큰 책을 필터링합니다.priceLessThan(50): 가격이 50보다 작은 책을 필터링합니다.final affordableBooks = await isar.books.filter()
.priceGreaterThan(10) // 가격이 10보다 큰 조건
.priceLessThan(50) // 가격이 50보다 작은 조건
.findAll();
for (var book in affordableBooks) {
print('Title: ${book.title}, Price: ${book.price}');
}
여러 조건을 결합하여 더욱 세부적으로 데이터를 필터링할 수 있습니다.
final result = await isar.books.filter()
.titleContains("Flutter")
.and()
.priceGreaterThan(20)
.findAll();
titleContains("Flutter"): 제목에 "Flutter"라는 단어가 포함된 항목을 찾습니다..and(): 두 조건을 논리적으로 결합합니다.final specificBooks = await isar.books.filter()
.titleContains("Dart") // 제목에 'Dart' 포함
.and() // 논리적 AND 조건
.priceLessThan(30) // 가격이 30 이하
.findAll();
for (var book in specificBooks) {
print('Title: ${book.title}, Price: ${book.price}');
}
필터링한 데이터를 정렬할 수도 있습니다.
final sortedBooks = await isar.books.filter()
.isPublishedEqualTo(true)
.sortByPrice()
.findAll();
.sortByPrice(): 가격을 기준으로 오름차순 정렬합니다..sortByPriceDesc(): 가격을 기준으로 내림차순 정렬합니다.final sortedBooks = await isar.books.filter()
.isPublishedEqualTo(true) // 발행된 책만 필터링
.sortByTitle() // 제목 기준으로 정렬
.findAll();
for (var book in sortedBooks) {
print('Title: ${book.title}, Published: ${book.isPublished}');
}
데이터의 통계 정보를 얻기 위해 집계 함수를 사용할 수 있습니다.
final totalBooks = await isar.books.where().count();
print('Total Books: $totalBooks');
.maxByPrice(): 가격이 가장 높은 항목을 반환합니다..minByPrice(): 가격이 가장 낮은 항목을 반환합니다.final maxPriceBook = await isar.books.where().maxByPrice();
print('Most Expensive Book: ${maxPriceBook?.title}, Price: ${maxPriceBook?.price}');
final totalCount = await isar.books.where().count();
print('Total Books in Collection: $totalCount');
조건을 동적으로 변경하여 쿼리를 생성할 수 있습니다.
final filterQuery = isar.books.filter(); // Isar에서 데이터를 검색할 쿼리 객체 생성
// isPublishedFilter가 true일 경우, 발행된 책만 필터링 조건 추가
if (isPublishedFilter) {
filterQuery.isPublishedEqualTo(true);
}
// maxPrice가 null이 아닐 경우, 주어진 가격보다 낮은 책만 필터링 조건 추가
if (maxPrice != null) {
filterQuery.priceLessThan(maxPrice);
}
// 필터 조건에 맞는 모든 책 데이터를 검색
final books = await filterQuery.findAll();
isPublishedFilter**와 **maxPrice**는 동적으로 쿼리 조건을 추가할 수 있도록 합니다.bool isPublishedFilter = true;
int? maxPrice = 50;
final dynamicQuery = isar.books.filter();
if (isPublishedFilter) {
dynamicQuery.isPublishedEqualTo(true); // 발행된 책만
}
if (maxPrice != null) {
dynamicQuery.priceLessThan(maxPrice); // 최대 가격 조건
}
final filteredBooks = await dynamicQuery.findAll();
for (var book in filteredBooks) {
print('Title: ${book.title}, Price: ${book.price}, Published: ${book.isPublished}');
}
.filter(): 데이터를 조건에 따라 필터링합니다..and(), .or(): 여러 조건을 결합합니다..sortByField(): 데이터를 정렬합니다..count(), .maxByField() 등으로 집계 정보를 얻을 수 있습니다.Isar의 쿼리는 간결하면서도 강력합니다. 코드 예제를 따라 작성하며 사용법을 익혀 보세요.