이 글에서는 iOS 앱에서 Couchbase Lite를 시작하는 방법을 살펴봅니다. Couchbase Lite는 독립적으로, P2P 네트워크에서 또는 동기화 게이트웨이를 원격 엔드포인트로 사용하여 작동할 수 있는 임베디드 JSON 데이터베이스입니다. 여기서는 Swift의 iOS 앱의 맥락에서 프레임워크를 살펴볼 것이지만, 여기서 설명하는 모든 내용은 다른 플랫폼(Android, iOS(ObjC), Xamarin)에서 개발된 모바일 앱에도 동일하게 적용됩니다. 편차가 있는 경우 해당 편차를 명시합니다. 다른 플랫폼에 대한 관련 포스팅도 기대해 주세요!
참고: 현재 프로덕션 릴리스인 Couchbase Mobile v1.4에 대해 논의할 예정입니다. 최신 카우치베이스 모바일의 개발자 프리뷰 버전 2.0 . 이에 대해서는 다음 게시물에서 자세히 살펴보겠습니다.
배경
Couchbase 모바일 스택은 Couchbase 서버, Couchbase 동기화 게이트웨이 및 Couchbase Lite 임베디드 데이터베이스로 구성됩니다. 서버에 대한 자세한 내용은 카우치베이스 서버 시작하기 가이드 및 동기화 게이트웨이의 카우치베이스 동기화 게이트웨이 시작하기 가이드.
iOS 앱 개발과 Swift의 기본 사항에 익숙하다고 가정하겠습니다. NoSQL 데이터베이스 또는 Couchbase에 대해 자세히 알아보고 싶으시다면 카우치베이스 사이트.
카우치베이스는 오픈소스입니다. 여기서 사용하는 모든 기능은 무료로 사용해 볼 수 있습니다.
카우치베이스 라이트
카우치베이스 라이트는 여러 배포 모드에서 사용할 수 있습니다.
- 옵션 1: 장치에서 독립형 크로스 플랫폼 임베디드 데이터베이스로 사용할 수 있습니다.
- 옵션 2: 여러 기기에서 데이터를 동기화할 수 있는 원격 동기화 게이트웨이와 함께 사용할 수 있습니다. 이 경우는 Couchbase 서버와 함께 전체 Couchbase 스택을 포함하도록 확장할 수 있습니다. 장치에서 Couchbase Lite의 관점에서 보면 Couchbase Lite가 원격 동기화 게이트웨이와 인터페이스하므로 Couchbase 서버가 있는지 여부는 크게 중요하지 않습니다.
- 옵션 3: P2P 모드에서 사용 가능
여기서는 옵션 1에 초점을 맞추겠습니다.
네이티브 API
카우치베이스 라이트는 앱이 카우치베이스 플랫폼과 쉽게 인터페이스할 수 있는 iOS, 안드로이드, 윈도우용 네이티브 API를 제공합니다. 앱 개발자는 Couchbase Lite 임베디드 데이터베이스의 내부에 대해 걱정할 필요 없이 멋진 앱 구축에만 집중할 수 있습니다. 기본 API를 사용하면 다른 플랫폼 프레임워크/서브시스템과 상호 작용할 때와 마찬가지로 Couchbase Lite 프레임워크와 상호 작용할 수 있습니다. 이 블로그 게시물에서는 다시 한 번 Couchbase Mobile v1.4에 대해 설명하겠습니다. 전체 API 목록은 다음에서 확인할 수 있습니다. 카우치베이스 개발자 사이트.
통합
카우치베이스 라이트 프레임워크를 iOS 앱에 통합하는 데는 여러 가지 옵션이 있습니다. 다음과 같은 종속성 관리 시스템을 사용하는 것이 가장 간단할 것입니다. 코코아팟 또는 카르타고를 사용해도 되지만, 원하는 경우 프레임워크를 앱 프로젝트에 수동으로 포함할 수 있는 옵션이 있습니다. 저희의 카우치베이스 모바일 시작 가이드 를 클릭해 다양한 통합 옵션을 확인하세요.
참고 Swift 앱의 경우 프레임워크를 임포트한 후 브릿징 헤더(앱에 아직 없는 경우)를 생성하고 다음 파일을 임포트해야 합니다.
|
1 2 |
#가져오기 <카우치베이스 라이트/카우치베이스 라이트.h> #가져오기 <카우치베이스 라이트 리스너/CBLListener.h> |
데모 앱
여기에서 데모 Xcode 프로젝트를 다운로드하세요. 깃허브 리포지토리 . 블로그의 나머지 부분에서는 이 앱을 예로 사용하겠습니다.
|
1 |
git 복제 git@github.com:카우치바스랩/카우치베이스-lite-ios-스타터 앱.git |
이 앱은 코코아팟을 사용하여 Couchbase Lite 프레임워크를 통합하며, Couchbase Lite 프레임워크 사용의 기본을 익히기 위한 앱입니다. 다운로드가 완료되면 앱을 빌드하고 실행하세요. 이 앱을 시작점으로 사용하여 다른 API를 테스트하기 위해 앱을 확장할 수 있습니다.

기본 워크플로
로컬 데이터베이스 만들기
열기 DB메인메뉴뷰컨트롤러.swift 파일을 찾아 createDBWithName 함수입니다.
그러면 기본 경로(/도서관/응용 프로그램 지원)에 지정된 이름의 데이터베이스가 생성됩니다. 인스턴스화할 때 다른 디렉터리를 지정할 수 있습니다. CBLManager 클래스.
|
1 2 3 4 5 6 7 8 9 10 11 12 |
do { // 1: 데이터베이스 옵션 설정 let 옵션 = CBLDatabaseOptions() 옵션.storageType = kCBLSQLiteStorage 옵션.create = true // 2: DB가 존재하지 않는 경우 생성 그렇지 않으면 기존 DB로 핸들 반환 시도 cbManager.오픈 데이터베이스 이름(이름.소문자(), 와 함께: 옵션) } catch { // 오류 처리 } |
- 데이터베이스와 연결할 CBLDatabaseOptions 객체를 만듭니다. 예를 들어 encryptionKey 속성을 사용하여 데이터베이스에 사용할 암호화 키를 설정할 수 있습니다. 다음에서 다른 옵션을 살펴보세요. CBLDatabaseOptions 클래스.
- 데이터베이스 이름은 소문자로 입력해야 합니다. 샘플 앱은 자동으로 이름을 소문자로 표시합니다. 성공하면 로컬 데이터베이스가 없는 경우 새 로컬 데이터베이스가 생성됩니다. 존재하면 기존 데이터베이스에 대한 핸들이 반환됩니다.
데이터베이스 목록
매우 간단합니다. 다음에서 DBListTableViewController.swift 파일입니다. The 모든 데이터베이스 이름 속성을 CBLManager 생성된 데이터베이스를 나열합니다.
데이터베이스에 새 문서 추가하기
열기 DocListTableViewController.swift 파일을 찾아 createDocWithName 함수입니다.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
do { // 1: 고유 ID로 문서 생성 let doc = self.db?.createDocument() // 2: 사용자 속성 개체 생성 let userProps = [문서 사용자 속성.이름.rawValue:이름,문서 사용자 속성.개요.rawValue:개요] // 3: 지정된 사용자 속성으로 새 리비전을 추가합니다. let _ = 시도 doc?.putProperties(userProps) } catch { // 오류 처리 } |
- 이 호출의 결과로 고유 ID를 가진 문서가 생성됩니다.
- 사용자 속성 집합을 쌍으로 지정할 수 있습니다. 다른 방법으로 CBLDocumentModel 객체를 사용하여 애플리케이션 데이터를 지정할 수 있습니다. 애플리케이션의 CBLDocumentModel 는 iOS 플랫폼에서만 사용할 수 있습니다.. 이 예제에서는 속성을 사용하겠습니다.
이렇게 하면 지정된 사용자 속성을 가진 문서의 새 수정본이 생성됩니다.
데이터베이스에 문서 나열
열기 DocListTableViewController.swift 파일을 찾아 데이터베이스에 대한 모든 문서 가져오기 함수
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
do { guard let dbName = dbName else { 반환 } // 1. 지정된 이름의 DB 핸들 가져오기 self.db = 시도 cbManager.기존 데이터베이스 이름(dbName) // 2. 쿼리를 만들어 모든 문서를 가져옵니다. 다음과 같은 여러 속성을 설정할 수 있습니다. // 쿼리 객체에서 라이브 쿼리 = self.db?.createAllDocumentsQuery().asLive() guard let 라이브 쿼리 = 라이브 쿼리 else { 반환 } // 3: 쿼리 객체에서 선택적으로 여러 속성을 설정할 수 있습니다. // 쿼리 객체에서 다른 속성 탐색 라이브 쿼리.limit = UInt(UINT32_MAX) // 모든 문서 // query.postFilter = //4. 데이터베이스 변경 사항 관찰 시작 self.추가 라이브 쿼리 옵저버 및 시작 옵저빙() // 5: 쿼리를 실행하여 문서를 비동기적으로 가져오기 라이브 쿼리.runAsync({ (열거자, 오류) in 스위치 오류 { case nil: // 6: "열거자"는 CBLQueryEnumerator 유형이고 //는 결과의 열거자입니다. self.문서 열거자 = 열거자 기본값: } }) } catch { // 오류 처리 } |
- 지정된 이름의 데이터베이스에 대한 핸들 가져오기
- 만들기 CBLQuery 객체입니다. 이 쿼리는 모든 문서를 가져오는 데 사용됩니다. 일반 쿼리 객체 또는 "라이브" 쿼리 객체를 만들 수 있습니다. "라이브" 쿼리 개체의 유형은 CBLLiveQuery 쿼리 결과에 영향을 미치는 방식으로 데이터베이스가 변경될 때마다 자동으로 새로 고쳐집니다.
- 쿼리 객체에는 결과를 사용자 지정하기 위해 조정할 수 있는 여러 가지 속성이 있습니다. 속성을 수정하고 결과에 미치는 영향을 확인해 보세요.
- 데이터베이스 변경사항에 대한 알림을 받으려면 라이브 쿼리 개체에 명시적으로 옵저버를 추가해야 합니다. 이에 대해서는 "데이터베이스의 문서 변경 사항 관찰하기" 섹션에서 자세히 설명합니다. 관찰자가 더 이상 필요하지 않으면 관찰자를 제거하고 변경 사항 관찰을 중단하는 것을 잊지 마세요!
- 쿼리를 비동기적으로 실행합니다. 원하는 경우 동기식으로 실행할 수도 있지만 데이터 집합이 큰 경우에는 비동기식으로 실행하는 것이 좋습니다.
- 쿼리가 성공적으로 실행되면 쿼리가 성공적으로 실행되면 CBLQueryEnumerator 객체입니다. 쿼리 열거자를 사용하면 결과를 열거할 수 있습니다. 결과를 표시하는 테이블 보기의 데이터 소스로 매우 적합합니다.
기존 문서 편집
열기 DocListTableViewController.swift 파일을 찾아 updateDocWithName 함수입니다.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
do { // 1: 행과 연결된 문서를 가져옵니다. let doc = self.docAtIndex(색인) // 2: 업데이트된 값으로 사용자 속성 객체 만들기 var userProps = [문서 사용자 속성.이름.rawValue:이름,문서 사용자 속성.개요.rawValue:개요] // 3: 문서의 이전 수정본이 있는 경우 해당 수정본을 지정해야 합니다. // 업데이트이므로 존재해야 합니다! 만약 let revId = doc?.currentRevisionID { userProps["_rev"] = revId } // 4: 지정된 사용자 속성을 가진 새 리비전을 추가합니다. let savedRev = 시도 doc?.putProperties(userProps) } catch { // 오류 처리 } 파일 비공개 func docAtIndex(_ 색인:Int) -> CBLDocument? { // 1. 지정된 인덱스에서 CBLQueryRow 객체를 가져옵니다. let 쿼리 행 = self.문서 열거자?.행(에서: UInt(색인)) // 2: 행과 연결된 문서 가져오기 let doc = 쿼리 행?.문서 반환 doc } |
- 편집이 필요한 문서에 대한 핸들을 가져옵니다. 문서에서 CBLQueryEnumerator 를 쿼리하여 선택한 인덱스에서 문서에 대한 핸들을 가져올 수 있습니다.
- 사용자 속성을 쌍으로 업데이트합니다. 다음과 같은 대안이 있습니다. CBLDocumentModel 객체를 사용하여 애플리케이션 데이터를 지정할 수 있습니다. 이 기능은 iOS에서만 사용할 수 있습니다. 이 예제에서는 속성을 사용하겠습니다.
- 문서를 업데이트하려면 업데이트해야 하는 문서의 개정판을 명시적으로 표시하기 위해 개정아이디가 필요합니다. 이것은 "_rev" 키를 입력합니다. 이 키는 충돌 해결에 필요합니다. 자세한 내용은 다음과 같이 확인할 수 있습니다. 여기. 그러면 지정된 사용자 속성을 가진 문서의 새 수정본이 생성됩니다.
기존 문서 삭제하기
열기 DocListTableViewController.swift 파일을 찾아 deleteDocAtIndex 함수입니다.
|
1 2 3 4 5 6 7 8 9 10 |
do { // 1: 행과 연결된 문서를 가져옵니다. let doc = self.docAtIndex(색인) // 2: 문서 삭제 시도 doc?.삭제() } catch { // 오류 처리 } |
- 편집이 필요한 문서의 핸들을 가져옵니다. 선택한 인덱스에서 문서에 대한 핸들을 가져오기 위해 CBLQueryEnumerator를 쿼리할 수 있습니다.
- 문서를 삭제합니다. 이렇게 하면 문서의 모든 수정본이 삭제됩니다.
데이터베이스에서 문서 변경 사항 관찰하기
열기 DocListTableViewController.swift 파일을 찾아 추가 라이브 쿼리 옵저버 및 시작 옵저빙 함수
|
1 2 3 4 5 |
// 1. iOS 전용. 라이브 쿼리 개체에 옵저버 추가하기 라이브 쿼리.추가옵저버(self, forKeyPath: "행", 옵션: NS키값 관찰 옵션.new, 컨텍스트: nil) // 2. 변경 사항 관찰 시작 라이브 쿼리.시작() |
- 쿼리 결과에 영향을 미치는 데이터베이스의 변경 사항을 알림 받으려면 라이브 쿼리 개체에 옵저버를 추가하세요. 이것은 Swift/ Obj C 버전이 다른 모바일 플랫폼과 다른 경우입니다. 다른 플랫폼에서 개발하는 경우, 다른 플랫폼에서 개발하는 경우 추가 변경 리스너 API를 사용할 수 있습니다. 그러나 Couchbase Lite 1.4에서는 이 API가 iOS 플랫폼에서 지원되지 않으며, 대신 iOS의 키-값-옵저버 패턴을 활용하여 변경 알림을 받게 됩니다. 라이브 쿼리 개체에 KVO 옵저버를 추가하여 라이브 쿼리 개체의 "행" 속성에 대한 변경 사항을 관찰하기 시작합니다.
- 변화 관찰 시작
LiveQuery 객체의 "행" 속성에 영향을 미치는 데이터베이스에 변경 사항이 있을 때마다 앱에 변경 알림이 전송됩니다. 변경 알림을 받으면 UI를 업데이트할 수 있으며, 이 경우 테이블 뷰를 다시 로드합니다.
|
1 2 3 4 5 6 |
오버라이드 func 관찰값(forKeyPath 키 경로: 문자열?, 의 객체: 모든?, 변경: [NS키값변경키 : 모든]?, 컨텍스트: UnsafeMutableRawPointer?) { 만약 키 경로 == "행" { self.문서 열거자 = self.라이브 쿼리?.행 tableView.데이터 다시 로드() } } |
데이터베이스 삭제
열기 DBListTableViewController.swift 파일을 찾아 삭제 데이터베이스 인덱스 함수입니다.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
do { // 1. 데이터베이스에 핸들이 있으면 가져옵니다. let db = 시도 cbManager.기존 데이터베이스 이름(dbToDelete) // 2. 데이터베이스 삭제 시도 db.삭제() // 3. 로컬 장부 업데이트 self.dbNames?.제거(에서: indexPath.행) // 4. UI 업데이트 tableView.deleteRows(에서: [indexPath], 와 함께: .자동) } catch { // 오류 처리 } |
데이터베이스 삭제는 데이터베이스에서 간단한 delete() 호출을 통해 처리됩니다.
결론
보시다시피, 독립형 버전의 Couchbase Lite를 신규 또는 기존 iOS 앱에 통합하는 것은 매우 간단합니다. 이 게시물에서 설명한 샘플 앱은 다음 링크에서 다운로드할 수 있습니다. 깃허브 리포지토리 를 클릭하고 다양한 인터페이스를 살펴보세요. 더 궁금한 점이 있으면 언제든지 트위터로 문의해 주세요. @rajagp 또는 이메일을 보내주세요. priya.rajagopal@couchbase.com.
그리고 카우치베이스 모바일 개발자 포럼 는 모바일 관련 질문에 대한 답변을 얻을 수 있는 또 다른 좋은 곳입니다. 또한 카우치베이스 개발자 포털 카우치베이스 모바일에 대해 자세히 알아보세요.
[...] Couchbase Server, 동기화 게이트웨이 및 Couchbase Lite 임베디드 NoSQL 데이터베이스를 소개합니다. 이전 게시물에서 Couchbase Lite를 iOS 앱에서 독립형 임베디드 NoSQL 데이터베이스로 사용하는 방법에 대해 설명했습니다. [...]
[...] 모드로 전환합니다. 이 글에서는 Couchbase Lite와의 통합에 대한 자세한 내용은 다루지 않습니다. Couchbase Lite 시작하기 블로그 [...]에서 시작하기 좋은 곳입니다.