blog

데이터 로컬 지속성을 달성하기 위한 Ark TS @ohos.data.relationalStore(관계형 데이터베이스)

Ark TS는 데이터의 로컬 지속성을 구현합니다....

Oct 14, 2025 · 8 min. read
シェア

I. 공식 소개

관계형 데이터베이스는 데이터를 관리하는 관계형 모델을 기반으로 하는 일종의 데이터베이스입니다. SQLite 컴포넌트를 기반으로 하는 관계형 데이터베이스는 완전한 로컬 데이터베이스 관리 메커니즘을 제공하고 추가, 삭제, 변경, 확인 등과 같은 일련의 외부 인터페이스를 제공하며 복잡한 시나리오의 요구를 충족하기 위해 사용자 입력 SQL 문을 직접 실행할 수도 있습니다. 워커 스레드는 지원되지 않습니다. 지원되는 기본 데이터 유형: 숫자, 문자열, 이진형 데이터, 부울, 데이터 삽입 및 읽기의 성공을 보장하기 위해 데이터는 2M을 초과하지 않는 것이 좋습니다. 삽입이 성공하면 읽기가 실패하고, 삽입 크기가 초과하면 읽기가 실패합니다.

이 모듈은 관계형 데이터베이스와 관련된 다음과 같은 공통 기능을 제공합니다:

  • RdbPredicates: 데이터 개체의 성격, 특성 또는 단어 항목의 데이터 개체 간의 관계를 나타내는 데 사용되는 데이터베이스로, 주로 데이터베이스 작동 조건을 정의하는 데 사용됩니다.
  • RdbStore: 관계형 데이터베이스 메서드를 관리하기 위한 인터페이스를 제공합니다.
  • ResultSet: 사용자가 관계형 데이터베이스 쿼리 인터페이스를 호출한 후 반환된 결과의 컬렉션을 제공합니다.

둘째, 준비 단계

1. 데이터 클래스 준비

사용 중인 페이지에 대한 양방향 데이터 바인딩이 필요하기 때문에 @Observe 데코레이터가 사용되며 id 및 이름 변수가 정의됩니다.

@Observed export default class TaskInfo { id: number name: string constructor(id: number, name: string) { this.id = id this.name = name } }

2. 공통 디렉터리에 새 rdbStore.ets 파일을 만듭니다.

초기화, 읽기, 추가 및 삭제를 정의하여 데이터베이스를 구체화하는 TaskModel 클래스를 정의합니다.

class TaskModel { // 초기화 작업 목록 initTaskDB(context) {} // 쿼리 작업 목록 getTaskList() {} /* * 새 작업 추가 * @param name 작업 이름 * @return 작업 ID * */ addTask(name: string) {} /* * ID에 따라 작업 상태 업데이트 * @param id 작업 ID * */ updataTaskStatus(id: number, name: string) {} /* * ID에 따라 작업 삭제 * @param id 작업 ID * */ deleteTaskById(id: number) {} } const taskModel = new TaskModel() export default taskModel as TaskModel

테이블 초기화하기

rdb 구성, 이름 가져 오기 + 보안 수준 설정

SQL 문을 초기화하여 테이블을 만듭니다.

import relationalStore from '@ohos.data.relationalStore';

도입된 relationalStore의 getRdbStore를 통해 rdb 가져오기

private rdbStore: relationalStore.RdbStore

초기화 후 나중에 메서드에서 사용할 수 있도록 rdbStore를 저장합니다.

// 초기화 작업 목록 initTaskDB(context) { // 1rdb의 구성은 다음과 같습니다. const config = { name: 'MyAppRdbStore.db', // 데이터베이스의 보안 수준을 낮음에서 높음으로 설정합니다. securityLevel: relationalStore.SecurityLevel.S1 } // 2초기화 SQL 문 const sql = `CREATE TABLE IF NOT EXISTS TASK ( ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT NOT NULL )` // 3다음은 rdb를 가져오는 방법에 대한 몇 가지 예입니다. relationalStore.getRdbStore(context, config, (err, rdbStore) => { if (err) { console.log('testTag', 'rdbStore') 가져오지 못했습니다. return } // SQL 실행 rdbStore.executeSql(sql) console.log('testTag', '작업 테이블을 성공적으로 생성했습니다') // rdbStore 저장 this.rdbStore = rdbStore }) }

쿼리
import TaskInfo from '../../common/rdbStore/taskModel' class TaskModel { private tableName: string = 'TASK' }

미리 준비된 데이터 클래스를 도입하고 테이블 이름을 사용자 지정합니다.

// 쿼리 작업 목록 async getTaskList() { // 1.쿼리 조건 빌드 const predicates = new relationalStore.RdbPredicates(this.tableName) // 2. const result = await this.rdbStore.query(predicates, ['ID', 'NAME']) // 3.쿼리 결과 구문 분석 // 3.1 최종 쿼리 결과를 조합하기 위한 배열을 정의하고 준비된 TaskInfo 클래스로 가져옵니다. const tasks: TaskInfo[] = [] // 3.2 반복 패키지 while (!result.isAtLastRow) { // 3.3 포인터를 다음 줄로 이동합니다. result.goToNextRow() // 3.4 데이터 가져오기 const id = result.getLong(result.getColumnIndex('ID')) const name = result.getString(result.getColumnIndex('NAME')) // 배열로 줄 바꿈 tasks.push({ id, name }) } console.log('testTag', '데이터에 대한 쿼리', JSON.stringify(tasks)); return tasks }

New
/* * 새 작업 추가 * @param name 작업 이름 * @return 작업 ID * */ addTask(name: string): Promise<number> { console.log('testTag', '데이터 추가', name); return this.rdbStore.insert(this.tableName, { name }) }

업데이트
 /*
* ID에 따라 작업 상태 업데이트
* @param id 작업 ID
* */
 updataTaskStatus(id: number, name: string) {
 // 1. 업데이트할 데이터
 const data = { name }
 // 2. 업데이트할 조건
 const predicates = new relationalStore.RdbPredicates(this.tableName)
 predicates.equalTo('ID', id)
 // 3. 업데이트 작업
 return this.rdbStore.update(data, predicates)
 }

삭제
/* * ID에 따라 작업 삭제 * @param id 작업 ID * */ deleteTaskById(id: number) { // 1. 삭제 조건 const predicates = new relationalStore.RdbPredicates(this.tableName) predicates.equalTo('ID', id) // 2. 삭제 작업 return this.rdbStore.delete(predicates) }

전체 코드
import relationalStore from '@ohos.data.relationalStore'; import TaskInfo from '../../common/rdbStore/taskModel' class TaskModel { private rdbStore: relationalStore.RdbStore private tableName: string = 'TASK' // 초기화 작업 목록 initTaskDB(context) { // 1rdb의 구성은 다음과 같습니다. const config = { name: 'MyAppRdbStore.db', // 데이터베이스의 보안 수준을 낮음에서 높음으로 설정합니다. securityLevel: relationalStore.SecurityLevel.S1 } // 2초기화 SQL 문 const sql = `CREATE TABLE IF NOT EXISTS TASK ( ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT NOT NULL )` // 3다음은 rdb를 가져오는 방법에 대한 몇 가지 예입니다. relationalStore.getRdbStore(context, config, (err, rdbStore) => { if (err) { console.log('testTag', 'rdbStore') 가져오지 못했습니다. return } // SQL 실행 rdbStore.executeSql(sql) console.log('testTag', '작업 테이블을 성공적으로 생성했습니다') // rdbStore 저장 this.rdbStore = rdbStore }) } // 쿼리 작업 목록 async getTaskList() { // 1.쿼리 조건 빌드 const predicates = new relationalStore.RdbPredicates(this.tableName) // 2. const result = await this.rdbStore.query(predicates, ['ID', 'NAME']) // 3.쿼리 결과 구문 분석 // 3.1 최종 쿼리 결과를 조합하기 위한 배열을 정의하고 준비된 TaskInfo 클래스로 가져옵니다. const tasks: TaskInfo[] = [] // 3.2 반복 패키지 while (!result.isAtLastRow) { // 3.3 포인터를 다음 줄로 이동합니다. result.goToNextRow() // 3.4 데이터 가져오기 const id = result.getLong(result.getColumnIndex('ID')) const name = result.getString(result.getColumnIndex('NAME')) // 배열로 줄 바꿈 tasks.push({ id, name }) } console.log('testTag', '데이터에 대한 쿼리', JSON.stringify(tasks)); return tasks } /* * 새 작업 추가 * @param name 작업 이름 * @return 작업 ID * */ addTask(name: string): Promise<number> { console.log('testTag', '데이터 추가', name); return this.rdbStore.insert(this.tableName, { name }) } /* * ID에 따라 작업 상태 업데이트 * @param id 작업 ID * */ updataTaskStatus(id: number, name: string) { // 1. 업데이트할 데이터 const data = { name } // 2. 업데이트할 조건 const predicates = new relationalStore.RdbPredicates(this.tableName) predicates.equalTo('ID', id) // 3. 업데이트 작업 return this.rdbStore.update(data, predicates) } /* * ID에 따라 작업 삭제 * @param id 작업 ID * */ deleteTaskById(id: number) { // 1. 삭제 조건 const predicates = new relationalStore.RdbPredicates(this.tableName) predicates.equalTo('ID', id) // 2. 삭제 작업 return this.rdbStore.delete(predicates) } } const taskModel = new TaskModel() export default taskModel as TaskModel

사용

1, onCreate 훅 패스 컨텍스트 초기화 테이블의 EntryAbility.ets에 있습니다.

import TaskModel from '../common/rdbStore/rdbStore' onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) { hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate'); // 태스크 모델 초기화 TaskModel.initTaskDB(this.context) }

2, 페이지의 사용, 메소드 만 호출, 페이지 기능을 달성하지 못했습니다.

import TaskModel from '../../common/rdbStore/rdbStore' import TaskInfo from '../../common/rdbStore/taskModel' @Entry @Component struct SearchExample { @State hisSearchArr: TaskInfo[] = [] aboutToAppear() { TaskModel.getTaskList().then((tasks) => { this.hisSearchArr = tasks console.log('testTag', JSON.stringify(this.hisSearchArr), '데이터에 대한 쿼리 ') }).catch((e) => [ console.log('testTag', e, '쿼리 실패') ]) } // 새 데이터 addTask(value: string) { TaskModel.addTask(value).then(id => { this.hisSearchArr.push(new TaskInfo(id, value)) console.log('testTag', JSON.stringify(this.hisSearchArr), '업데이트된 데이터') }).catch((e) => [ console.log('testTag', '''추가에 실패했습니다., JSON.stringify(e)) ]) } build() { Column() { }.width('100%') } }

삭제 및 업데이트 작업은 동일합니다.

PS:

ts 파일은 ets 파일에서 참조할 수 없으며, 마찬가지로 ets 파일은 ts 파일에서 참조할 수 없습니다.

2, 지속 효과는 프리뷰어에서는 적용되지 않으며 시뮬레이터와 실제 머신에서만 적용됩니다.

Read next

zset 설계 지연 큐 프로그램 기반 REDIS 도구 세트

코드 저장소\n배경\n\n그러나 이 프로세스를 사용하는 일부 친구들은 이 지연된 큐 구성 요소에 버그, 특히 메시지 손실이 있다는 것을 발견했습니다.\n따라서 다음 두 가지 아이디어 이후 현재 연구를 대체할 다른 지연 큐 솔루션이 필요했습니다:\n지연된 큐 메시지를 지원하는 새로운 메시지 미들웨어에 대한 액세스(예: R

Oct 14, 2025 · 5 min read