From d16c7890a4d44f01b5f375048e00fb5e9f80b03c Mon Sep 17 00:00:00 2001 From: gaohui Date: Sun, 30 Jan 2022 16:00:06 +0800 Subject: [PATCH 1/9] add eTSDDMQuery sample Signed-off-by: gaohui --- data/eTSDDMQuery/README_zh.md | 23 +++ data/eTSDDMQuery/build.gradle | 34 ++++ data/eTSDDMQuery/entry/build.gradle | 21 +++ data/eTSDDMQuery/entry/src/main/config.json | 71 +++++++++ .../entry/src/main/ets/MainAbility/app.ets | 23 +++ .../src/main/ets/MainAbility/common/query.ets | 100 ++++++++++++ .../main/ets/MainAbility/common/titleBar.ets | 31 ++++ .../ets/MainAbility/model/kvStoreMode.ets | 147 ++++++++++++++++++ .../src/main/ets/MainAbility/pages/index.ets | 32 ++++ .../main/resources/base/element/string.json | 36 +++++ .../src/main/resources/base/media/icon.png | Bin 0 -> 6790 bytes .../src/main/resources/en/element/string.json | 36 +++++ .../src/main/resources/zh/element/string.json | 36 +++++ .../screenshots/devices/eTSDDMQuery.png | Bin 0 -> 75048 bytes data/eTSDDMQuery/settings.gradle | 1 + 15 files changed, 591 insertions(+) create mode 100644 data/eTSDDMQuery/README_zh.md create mode 100644 data/eTSDDMQuery/build.gradle create mode 100644 data/eTSDDMQuery/entry/build.gradle create mode 100644 data/eTSDDMQuery/entry/src/main/config.json create mode 100644 data/eTSDDMQuery/entry/src/main/ets/MainAbility/app.ets create mode 100644 data/eTSDDMQuery/entry/src/main/ets/MainAbility/common/query.ets create mode 100644 data/eTSDDMQuery/entry/src/main/ets/MainAbility/common/titleBar.ets create mode 100644 data/eTSDDMQuery/entry/src/main/ets/MainAbility/model/kvStoreMode.ets create mode 100644 data/eTSDDMQuery/entry/src/main/ets/MainAbility/pages/index.ets create mode 100644 data/eTSDDMQuery/entry/src/main/resources/base/element/string.json create mode 100644 data/eTSDDMQuery/entry/src/main/resources/base/media/icon.png create mode 100644 data/eTSDDMQuery/entry/src/main/resources/en/element/string.json create mode 100644 data/eTSDDMQuery/entry/src/main/resources/zh/element/string.json create mode 100644 data/eTSDDMQuery/screenshots/devices/eTSDDMQuery.png create mode 100644 data/eTSDDMQuery/settings.gradle diff --git a/data/eTSDDMQuery/README_zh.md b/data/eTSDDMQuery/README_zh.md new file mode 100644 index 0000000000..e7930762c5 --- /dev/null +++ b/data/eTSDDMQuery/README_zh.md @@ -0,0 +1,23 @@ +# DDM结果集与谓词查询 + +### 简介 + +本示例展示了分布式数据管理中,如何通过构建query对象, 查询kvstore中的数据,获取结果集。 + +### 使用说明 + +1.点击**添加数据**,将模板数据存入数据库 + +2.点击**查询指定字段结果集**,从数据库中查询key包含指定字段的结果集 + +3.点击**查询指定值条目**,通过谓词从数据库中查询key包含指定字段的结果集 + +4.点击**与条件查询**,通过谓词从数据库中查询指定FieldNode对应的值不为特定值的结果集 + +5.点击**查询結果降序**,通过谓词从数据库中查询指定FieldNode对应的值不为特定值且降序排序的结果集 + +6.点击**查询小于指定值**,通过谓词从数据库中查询指定FieldNode对应的值小于特定值的键值对列表 + +### 约束与限制 + +本示例仅支持在标准系统上运行。 \ No newline at end of file diff --git a/data/eTSDDMQuery/build.gradle b/data/eTSDDMQuery/build.gradle new file mode 100644 index 0000000000..f1b1a556a0 --- /dev/null +++ b/data/eTSDDMQuery/build.gradle @@ -0,0 +1,34 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +apply plugin: 'com.huawei.ohos.app' + +//For instructions on signature configuration, see https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404#section1112183053510 +ohos { + compileSdkVersion 8 + supportSystem "standard" +} + +buildscript { + repositories { + maven { + url 'https://repo.huaweicloud.com/repository/maven/' + } + maven { + url 'https://developer.huawei.com/repo/' + } + } + dependencies { + classpath 'com.huawei.ohos:hap:3.0.5.2' + classpath 'com.huawei.ohos:decctest:1.2.7.2' + } +} + +allprojects { + repositories { + maven { + url 'https://repo.huaweicloud.com/repository/maven/' + } + maven { + url 'https://developer.huawei.com/repo/' + } + } +} diff --git a/data/eTSDDMQuery/entry/build.gradle b/data/eTSDDMQuery/entry/build.gradle new file mode 100644 index 0000000000..cef7b37de8 --- /dev/null +++ b/data/eTSDDMQuery/entry/build.gradle @@ -0,0 +1,21 @@ +apply plugin: 'com.huawei.ohos.hap' +//For instructions on signature configuration, see https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404#section1112183053510 +ohos { + compileSdkVersion 8 + defaultConfig { + compatibleSdkVersion 7 + } + buildTypes { + release { + proguardOpt { + proguardEnabled false + rulesFiles 'proguard-rules.pro' + } + } + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) + testImplementation 'junit:junit:4.13.1' +} diff --git a/data/eTSDDMQuery/entry/src/main/config.json b/data/eTSDDMQuery/entry/src/main/config.json new file mode 100644 index 0000000000..20a2ab4d29 --- /dev/null +++ b/data/eTSDDMQuery/entry/src/main/config.json @@ -0,0 +1,71 @@ +{ + "app": { + "bundleName": "ohos.samples.etsddmquery", + "vendor": "samples", + "version": { + "code": 1000000, + "name": "1.0.0" + } + }, + "deviceConfig": {}, + "module": { + "package": "ohos.samples.etsddmquery", + "name": ".MyApplication", + "mainAbility": ".MainAbility", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "entry", + "moduleType": "entry", + "installationFree": false + }, + "abilities": [ + { + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ], + "orientation": "unspecified", + "visible": true, + "srcPath": "MainAbility", + "name": ".MainAbility", + "srcLanguage": "ets", + "icon": "$media:icon", + "description": "$string:description_mainability", + "formsEnabled": false, + "label": "$string:entry_MainAbility", + "type": "page", + "launchType": "standard" + } + ], + "js": [ + { + "mode": { + "syntax": "ets", + "type": "pageAbility" + }, + "pages": [ + "pages/index" + ], + "name": ".MainAbility", + "window": { + "designWidth": 720, + "autoDesignWidth": false + } + } + ], + "reqPermissions": [ + { + "name": "ohos.permission.DISTRIBUTED_DATASYNC" + } + ] + } +} \ No newline at end of file diff --git a/data/eTSDDMQuery/entry/src/main/ets/MainAbility/app.ets b/data/eTSDDMQuery/entry/src/main/ets/MainAbility/app.ets new file mode 100644 index 0000000000..58946d00c6 --- /dev/null +++ b/data/eTSDDMQuery/entry/src/main/ets/MainAbility/app.ets @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2020 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export default { + onCreate() { + console.info('Application onCreate') + }, + onDestroy() { + console.info('Application onDestroy') + }, +} \ No newline at end of file diff --git a/data/eTSDDMQuery/entry/src/main/ets/MainAbility/common/query.ets b/data/eTSDDMQuery/entry/src/main/ets/MainAbility/common/query.ets new file mode 100644 index 0000000000..88ec9b4d9d --- /dev/null +++ b/data/eTSDDMQuery/entry/src/main/ets/MainAbility/common/query.ets @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2020 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import {KvStoreMode} from "../model/kvStoreMode.ets" + +let self = null +let kvStoreMode: KvStoreMode = new KvStoreMode() + +@Component +export struct query { + private options: Resource[] = [$r('app.string.push'), $r('app.string.resultSet'), $r('app.string.prefixKey'), + $r('app.string.orderByDesc'), $r('app.string.addResult'), $r('app.string.lessThan')] + @State textTitle: string = '' + + aboutToAppear() { + self = this + kvStoreMode.createKvStore() + } + + build() { + Scroll() { + Column() { + Scroll() { + Text(this.textTitle) + .fontSize(25) + .width('100%') + .padding(10) + .constraintSize({ minHeight: 150 }) + .layoutWeight(1) + } + .width('90%') + .height('30%') + .border({ width: 1, color: '#000000', radius: 10, style: 0 }) + + ForEach(this.options, (item, index) => { + Button() { + Text(item) + .width('80%') + .height(30) + .fontSize(20) + .textAlign(TextAlign.Center) + .onClick(() => { + switch (index) { + case 0: + kvStoreMode.put((data) => { + self.textTitle = data + }) + break + case 1: + kvStoreMode.getResultSet((data) => { + self.textTitle = data + }) + break + case 2: + kvStoreMode.prefixKey((data) => { + self.textTitle = data + }) + break + case 3: + kvStoreMode.orderByDesc((data) => { + self.textTitle = data + }) + break + case 4: + kvStoreMode.and((data) => { + self.textTitle = data + }) + break + case 5: + kvStoreMode.lessThan((data) => { + self.textTitle = data + }) + break + default: + break + } + }) + } + .margin({ top: 20 }) + .backgroundColor('#0D9FFB') + }, item => JSON.stringify(item)) + } + .margin({ top: 20 }) + .width('100%') + } + .layoutWeight(1) + } +} \ No newline at end of file diff --git a/data/eTSDDMQuery/entry/src/main/ets/MainAbility/common/titleBar.ets b/data/eTSDDMQuery/entry/src/main/ets/MainAbility/common/titleBar.ets new file mode 100644 index 0000000000..28d4e1db6a --- /dev/null +++ b/data/eTSDDMQuery/entry/src/main/ets/MainAbility/common/titleBar.ets @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@Component +export struct TitleBar { + build() { + Row() { + Text($r("app.string.entry_MainAbility")) + .fontColor(Color.White) + .fontSize(30) + .layoutWeight(1) + } + .width('100%') + .height('8%') + .constraintSize({ minHeight: 50 }) + .padding({ left: 15 }) + .backgroundColor('#0D9FFB') + } +} \ No newline at end of file diff --git a/data/eTSDDMQuery/entry/src/main/ets/MainAbility/model/kvStoreMode.ets b/data/eTSDDMQuery/entry/src/main/ets/MainAbility/model/kvStoreMode.ets new file mode 100644 index 0000000000..4afe7b4f50 --- /dev/null +++ b/data/eTSDDMQuery/entry/src/main/ets/MainAbility/model/kvStoreMode.ets @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2020 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import distributedData from '@ohos.data.distributedData' + +const TAG = '[KvStoreMode]:' +const STORE_ID = 'storeId' +let self = null + +export class KvStoreMode { + SingleKVStore + + constructor() { + } + + createKvStore() { + let config = { + bundleName: 'ohos.samples.etsdistributeddataquery', + userInfo: { + userId: '0', + userType: 0 + } + } + let options = { + createIfMissing: true, + encrypt: false, + backup: false, + autoSync: true, + kvStoreType: 1, + securityLevel: 3, + schema: '' + } + distributedData.createKVManager(config).then((manager) => { + console.info(`${TAG} createKVManager success, kvManager = ${JSON.stringify(manager)}`) + + let name = new distributedData.FieldNode('name') + name.type = 1 + name.nullable = false + name.default = 0 + + let schema = new distributedData.Schema() + schema.root.appendChild(name) + schema.indexes = ['$.name'] + schema.mode = 1 + options.schema = schema.toJsonString() + console.log(`${TAG} ${schema.toJsonString()}`) + manager.getKVStore(STORE_ID, options).then((store) => { + console.info(`${TAG} getKVStore success, SingleKVStore = ${store}`) + this.SingleKVStore = store + }) + }) + } + + put(callback) { + let key = 'batch_test_string_key' + for (var i = 0; i < 10; i++) { + console.log(`${TAG} this.SingleKVStore = ${this.SingleKVStore} ${key} ${i}`) + let value = '{"name":' + i + '}' + this.SingleKVStore.put(key + i, value).then((data) => { + console.info(`${TAG} SingleKVStore.put success`) + callback('put success') + }).catch((err) => { + console.error(`${TAG} SingleKVStore.put failed ${JSON.stringify(err)}`) + }) + } + } + + getResultSet(callback) { + self = this + this.SingleKVStore.getResultSet('batch_test_', function (err, result) { + self.resultSet(result, callback) + }) + } + + resultSet(result, callback) { + console.log(`${TAG} getResultSet success result.getCount = ${result.getCount()}`) + console.log(`${TAG} getResultSet success result.moveToFirst = ${result.moveToFirst()}`) + console.log(`${TAG} getResultSet success result.entry = ${JSON.stringify(result.getEntry())}`) + let entries = '' + for (let i = 0;i < result.getCount(); i++) { + console.info(`${TAG} key = ${JSON.stringify(result.getEntry().key)}`) + console.info(`${TAG} value = ${JSON.stringify(result.getEntry().value.value)}`) + entries += `key:${JSON.stringify(result.getEntry().key)},value:${JSON.stringify(result.getEntry().value.value)}\n` + console.info(`${TAG} moveToNext = ${result.moveToNext()}`) + } + callback(entries) + this.SingleKVStore.closeResultSet(result, function (err, data) { + console.info(`${TAG} getResultSet closeResultSet success`) + }) + } + + prefixKey(callback) { + let query = new distributedData.Query() + query.prefixKey('batch_test_string') + this.getResultSetQuery(query, callback) + } + + orderByDesc(callback) { + let query = new distributedData.Query() + query.notEqualTo("$.name", 3) + query.orderByDesc("$.name") + this.getResultSetQuery(query, callback) + } + + and(callback) { + let query = new distributedData.Query() + query.notEqualTo("$.name", 5) + query.and() + query.notEqualTo("$.name", 3) + this.getResultSetQuery(query, callback) + } + + lessThan(callback) { + let query = new distributedData.Query() + query.lessThan("$.name", 7) + this.getEntries(query, callback) + } + + getResultSetQuery(query, callback) { + self = this + this.SingleKVStore.getResultSet(query, function (err, result) { + self.resultSet(result, callback) + }) + } + + getEntries(query, callback) { + self = this + this.SingleKVStore.getEntries(query).then((entries) => { + console.log(`${TAG} getEntries success ${JSON.stringify(entries)}`) + self.resultSet(entries, callback) + }).catch((err) => { + console.info(`${TAG} getEntries fail ${JSON.stringify(err)}`) + }) + } +} \ No newline at end of file diff --git a/data/eTSDDMQuery/entry/src/main/ets/MainAbility/pages/index.ets b/data/eTSDDMQuery/entry/src/main/ets/MainAbility/pages/index.ets new file mode 100644 index 0000000000..94b878f04b --- /dev/null +++ b/data/eTSDDMQuery/entry/src/main/ets/MainAbility/pages/index.ets @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2020 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { query } from "../common/query.ets" +import { TitleBar } from "../common/titleBar.ets" + +@Entry +@Component +struct Index { + private swiperController: SwiperController = new SwiperController() + + build() { + Column(){ + TitleBar() + query() + } + .width('100%') + .height('100%') + } +} \ No newline at end of file diff --git a/data/eTSDDMQuery/entry/src/main/resources/base/element/string.json b/data/eTSDDMQuery/entry/src/main/resources/base/element/string.json new file mode 100644 index 0000000000..323ed8779c --- /dev/null +++ b/data/eTSDDMQuery/entry/src/main/resources/base/element/string.json @@ -0,0 +1,36 @@ +{ + "string": [ + { + "name": "entry_MainAbility", + "value": "eTSDDMQuery" + }, + { + "name": "description_mainability", + "value": "eTS_Empty Ability" + }, + { + "name": "push", + "value": "添加数据" + }, + { + "name": "resultSet", + "value": "查询指定字段结果集" + }, + { + "name": "prefixKey", + "value": "查询指定值条目" + }, + { + "name": "addResult", + "value": "与条件查询" + }, + { + "name": "orderByDesc", + "value": "查询結果降序" + }, + { + "name": "lessThan", + "value": "查询小于指定值" + } + ] +} \ No newline at end of file diff --git a/data/eTSDDMQuery/entry/src/main/resources/base/media/icon.png b/data/eTSDDMQuery/entry/src/main/resources/base/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 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 Date: Sun, 30 Jan 2022 16:05:22 +0800 Subject: [PATCH 2/9] add eTSDDMQuery sample Signed-off-by: gaohui --- .../eTSDDMQuery/entry/src/main/ets/MainAbility/common/query.ets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/eTSDDMQuery/entry/src/main/ets/MainAbility/common/query.ets b/data/eTSDDMQuery/entry/src/main/ets/MainAbility/common/query.ets index 88ec9b4d9d..382d1751cc 100644 --- a/data/eTSDDMQuery/entry/src/main/ets/MainAbility/common/query.ets +++ b/data/eTSDDMQuery/entry/src/main/ets/MainAbility/common/query.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import {KvStoreMode} from "../model/kvStoreMode.ets" +import { KvStoreMode } from "../model/kvStoreMode.ets" let self = null let kvStoreMode: KvStoreMode = new KvStoreMode() -- Gitee From 1f9428afe3d035500c31848dfc037cb869269a4f Mon Sep 17 00:00:00 2001 From: gaohui Date: Sun, 30 Jan 2022 16:59:50 +0800 Subject: [PATCH 3/9] add eTSDDMQuery sample Signed-off-by: gaohui --- .../src/main/ets/MainAbility/common/titleBar.ets | 2 +- .../main/ets/MainAbility/model/kvStoreMode.ets | 15 ++++++++------- .../src/main/resources/base/element/string.json | 12 ++++++------ 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/data/eTSDDMQuery/entry/src/main/ets/MainAbility/common/titleBar.ets b/data/eTSDDMQuery/entry/src/main/ets/MainAbility/common/titleBar.ets index 28d4e1db6a..3566c7486f 100644 --- a/data/eTSDDMQuery/entry/src/main/ets/MainAbility/common/titleBar.ets +++ b/data/eTSDDMQuery/entry/src/main/ets/MainAbility/common/titleBar.ets @@ -17,7 +17,7 @@ export struct TitleBar { build() { Row() { - Text($r("app.string.entry_MainAbility")) + Text($r('app.string.entry_MainAbility')) .fontColor(Color.White) .fontSize(30) .layoutWeight(1) diff --git a/data/eTSDDMQuery/entry/src/main/ets/MainAbility/model/kvStoreMode.ets b/data/eTSDDMQuery/entry/src/main/ets/MainAbility/model/kvStoreMode.ets index 4afe7b4f50..526e71311f 100644 --- a/data/eTSDDMQuery/entry/src/main/ets/MainAbility/model/kvStoreMode.ets +++ b/data/eTSDDMQuery/entry/src/main/ets/MainAbility/model/kvStoreMode.ets @@ -67,7 +67,7 @@ export class KvStoreMode { let key = 'batch_test_string_key' for (var i = 0; i < 10; i++) { console.log(`${TAG} this.SingleKVStore = ${this.SingleKVStore} ${key} ${i}`) - let value = '{"name":' + i + '}' + let value = '{name:' + i + '}' this.SingleKVStore.put(key + i, value).then((data) => { console.info(`${TAG} SingleKVStore.put success`) callback('put success') @@ -87,7 +87,7 @@ export class KvStoreMode { resultSet(result, callback) { console.log(`${TAG} getResultSet success result.getCount = ${result.getCount()}`) console.log(`${TAG} getResultSet success result.moveToFirst = ${result.moveToFirst()}`) - console.log(`${TAG} getResultSet success result.entry = ${JSON.stringify(result.getEntry())}`) + console.log(`${TAG} getResultSet success result.entry = ${JSON.stringify(result.getEntry())}`) let entries = '' for (let i = 0;i < result.getCount(); i++) { console.info(`${TAG} key = ${JSON.stringify(result.getEntry().key)}`) @@ -109,28 +109,29 @@ export class KvStoreMode { orderByDesc(callback) { let query = new distributedData.Query() - query.notEqualTo("$.name", 3) - query.orderByDesc("$.name") + query.notEqualTo('$.name', 3) + query.orderByDesc('$.name') this.getResultSetQuery(query, callback) } and(callback) { let query = new distributedData.Query() - query.notEqualTo("$.name", 5) + query.notEqualTo('$.name', 5) query.and() - query.notEqualTo("$.name", 3) + query.notEqualTo('$.name', 3) this.getResultSetQuery(query, callback) } lessThan(callback) { let query = new distributedData.Query() - query.lessThan("$.name", 7) + query.lessThan('$.name', 7) this.getEntries(query, callback) } getResultSetQuery(query, callback) { self = this this.SingleKVStore.getResultSet(query, function (err, result) { + query = null self.resultSet(result, callback) }) } diff --git a/data/eTSDDMQuery/entry/src/main/resources/base/element/string.json b/data/eTSDDMQuery/entry/src/main/resources/base/element/string.json index 323ed8779c..314c8ff505 100644 --- a/data/eTSDDMQuery/entry/src/main/resources/base/element/string.json +++ b/data/eTSDDMQuery/entry/src/main/resources/base/element/string.json @@ -10,27 +10,27 @@ }, { "name": "push", - "value": "添加数据" + "value": "Add Data" }, { "name": "resultSet", - "value": "查询指定字段结果集" + "value": "Query the result set" }, { "name": "prefixKey", - "value": "查询指定值条目" + "value": "Query the specified value entry" }, { "name": "addResult", - "value": "与条件查询" + "value": "And conditional query" }, { "name": "orderByDesc", - "value": "查询結果降序" + "value": "Query results descending order" }, { "name": "lessThan", - "value": "查询小于指定值" + "value": "Query smaller than value" } ] } \ No newline at end of file -- Gitee From aecf7a1f185f10e52c4001d30244abc38af12db1 Mon Sep 17 00:00:00 2001 From: gaohui Date: Sun, 30 Jan 2022 17:02:48 +0800 Subject: [PATCH 4/9] add eTSDDMQuery sample Signed-off-by: gaohui --- .../entry/src/main/ets/MainAbility/model/kvStoreMode.ets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/eTSDDMQuery/entry/src/main/ets/MainAbility/model/kvStoreMode.ets b/data/eTSDDMQuery/entry/src/main/ets/MainAbility/model/kvStoreMode.ets index 526e71311f..eb235f532e 100644 --- a/data/eTSDDMQuery/entry/src/main/ets/MainAbility/model/kvStoreMode.ets +++ b/data/eTSDDMQuery/entry/src/main/ets/MainAbility/model/kvStoreMode.ets @@ -16,7 +16,7 @@ import distributedData from '@ohos.data.distributedData' const TAG = '[KvStoreMode]:' -const STORE_ID = 'storeId' +const STORE_ID = 'kvStoreTest' let self = null export class KvStoreMode { -- Gitee From db92b07d0e5e4fdaf4878914bac14df2c18f8a70 Mon Sep 17 00:00:00 2001 From: gaohui Date: Wed, 9 Feb 2022 14:19:29 +0800 Subject: [PATCH 5/9] add sample eTSDDMQuery Signed-off-by: gaohui --- .../entry/src/main/ets/MainAbility/common/query.ets | 2 +- .../entry/src/main/ets/MainAbility/model/kvStoreMode.ets | 2 +- .../entry/src/main/ets/MainAbility/pages/index.ets | 5 ++--- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/data/eTSDDMQuery/entry/src/main/ets/MainAbility/common/query.ets b/data/eTSDDMQuery/entry/src/main/ets/MainAbility/common/query.ets index 382d1751cc..22b804c68f 100644 --- a/data/eTSDDMQuery/entry/src/main/ets/MainAbility/common/query.ets +++ b/data/eTSDDMQuery/entry/src/main/ets/MainAbility/common/query.ets @@ -19,7 +19,7 @@ let self = null let kvStoreMode: KvStoreMode = new KvStoreMode() @Component -export struct query { +export struct Query { private options: Resource[] = [$r('app.string.push'), $r('app.string.resultSet'), $r('app.string.prefixKey'), $r('app.string.orderByDesc'), $r('app.string.addResult'), $r('app.string.lessThan')] @State textTitle: string = '' diff --git a/data/eTSDDMQuery/entry/src/main/ets/MainAbility/model/kvStoreMode.ets b/data/eTSDDMQuery/entry/src/main/ets/MainAbility/model/kvStoreMode.ets index eb235f532e..ca44b8817b 100644 --- a/data/eTSDDMQuery/entry/src/main/ets/MainAbility/model/kvStoreMode.ets +++ b/data/eTSDDMQuery/entry/src/main/ets/MainAbility/model/kvStoreMode.ets @@ -89,7 +89,7 @@ export class KvStoreMode { console.log(`${TAG} getResultSet success result.moveToFirst = ${result.moveToFirst()}`) console.log(`${TAG} getResultSet success result.entry = ${JSON.stringify(result.getEntry())}`) let entries = '' - for (let i = 0;i < result.getCount(); i++) { + for (let i = 0; i < result.getCount(); i++) { console.info(`${TAG} key = ${JSON.stringify(result.getEntry().key)}`) console.info(`${TAG} value = ${JSON.stringify(result.getEntry().value.value)}`) entries += `key:${JSON.stringify(result.getEntry().key)},value:${JSON.stringify(result.getEntry().value.value)}\n` diff --git a/data/eTSDDMQuery/entry/src/main/ets/MainAbility/pages/index.ets b/data/eTSDDMQuery/entry/src/main/ets/MainAbility/pages/index.ets index 94b878f04b..86ecd7dd65 100644 --- a/data/eTSDDMQuery/entry/src/main/ets/MainAbility/pages/index.ets +++ b/data/eTSDDMQuery/entry/src/main/ets/MainAbility/pages/index.ets @@ -13,18 +13,17 @@ * limitations under the License. */ -import { query } from "../common/query.ets" +import { Query } from "../common/query.ets" import { TitleBar } from "../common/titleBar.ets" @Entry @Component struct Index { - private swiperController: SwiperController = new SwiperController() build() { Column(){ TitleBar() - query() + Query() } .width('100%') .height('100%') -- Gitee From c8e635ef2e51793ce1da5f089eb7401d95a41a39 Mon Sep 17 00:00:00 2001 From: gaohui Date: Fri, 11 Feb 2022 09:55:19 +0800 Subject: [PATCH 6/9] add sample eTSDDMQuery Signed-off-by: gaohui --- .../src/main/ets/MainAbility/common/query.ets | 49 ++++++++++--------- .../{kvStoreMode.ets => kvStoreModule.ets} | 47 +++++++----------- 2 files changed, 44 insertions(+), 52 deletions(-) rename data/eTSDDMQuery/entry/src/main/ets/MainAbility/model/{kvStoreMode.ets => kvStoreModule.ets} (78%) diff --git a/data/eTSDDMQuery/entry/src/main/ets/MainAbility/common/query.ets b/data/eTSDDMQuery/entry/src/main/ets/MainAbility/common/query.ets index 22b804c68f..dd4d6102e8 100644 --- a/data/eTSDDMQuery/entry/src/main/ets/MainAbility/common/query.ets +++ b/data/eTSDDMQuery/entry/src/main/ets/MainAbility/common/query.ets @@ -13,20 +13,25 @@ * limitations under the License. */ -import { KvStoreMode } from "../model/kvStoreMode.ets" +import { KvStoreModule } from "../model/kvStoreModule.ets" +import distributedData from '@ohos.data.distributedData' -let self = null -let kvStoreMode: KvStoreMode = new KvStoreMode() +let kvStoreModule: KvStoreModule = new KvStoreModule('ohos.samples.etsddmquery', 'kvStoreTest') +let query = new distributedData.Query() @Component -export struct Query { +export struct Query { private options: Resource[] = [$r('app.string.push'), $r('app.string.resultSet'), $r('app.string.prefixKey'), $r('app.string.orderByDesc'), $r('app.string.addResult'), $r('app.string.lessThan')] @State textTitle: string = '' aboutToAppear() { - self = this - kvStoreMode.createKvStore() + kvStoreModule.createKvStore() + } + + onQuery(data) { + console.log('[KvStoreModule] onQuery') + this.textTitle = data } build() { @@ -54,34 +59,30 @@ export struct Query { .onClick(() => { switch (index) { case 0: - kvStoreMode.put((data) => { - self.textTitle = data - }) + let key = 'batch_test_string_key' + kvStoreModule.put(key, this.onQuery.bind(this)) break case 1: - kvStoreMode.getResultSet((data) => { - self.textTitle = data - }) + kvStoreModule.getResultSet('batch_test', this.onQuery.bind(this)) break case 2: - kvStoreMode.prefixKey((data) => { - self.textTitle = data - }) + query.prefixKey('batch_test_string') + kvStoreModule.prefixKey(query, this.onQuery.bind(this)) break case 3: - kvStoreMode.orderByDesc((data) => { - self.textTitle = data - }) + query.notEqualTo('$.name', 3) + query.orderByDesc('$.name') + kvStoreModule.orderByDesc(query, this.onQuery.bind(this)) break case 4: - kvStoreMode.and((data) => { - self.textTitle = data - }) + query.notEqualTo('$.name', 5) + query.and() + query.notEqualTo('$.name', 3) + kvStoreModule.and(query, this.onQuery.bind(this)) break case 5: - kvStoreMode.lessThan((data) => { - self.textTitle = data - }) + query.lessThan('$.name', 7) + kvStoreModule.lessThan(query, this.onQuery.bind(this)) break default: break diff --git a/data/eTSDDMQuery/entry/src/main/ets/MainAbility/model/kvStoreMode.ets b/data/eTSDDMQuery/entry/src/main/ets/MainAbility/model/kvStoreModule.ets similarity index 78% rename from data/eTSDDMQuery/entry/src/main/ets/MainAbility/model/kvStoreMode.ets rename to data/eTSDDMQuery/entry/src/main/ets/MainAbility/model/kvStoreModule.ets index ca44b8817b..c7fc055f96 100644 --- a/data/eTSDDMQuery/entry/src/main/ets/MainAbility/model/kvStoreMode.ets +++ b/data/eTSDDMQuery/entry/src/main/ets/MainAbility/model/kvStoreModule.ets @@ -15,19 +15,22 @@ import distributedData from '@ohos.data.distributedData' -const TAG = '[KvStoreMode]:' -const STORE_ID = 'kvStoreTest' +const TAG = '[KvStoreModule]:' let self = null -export class KvStoreMode { +export class KvStoreModule { + private bundleName:string = '' + private storeId: string = '' SingleKVStore - constructor() { + constructor(bundleNme:string,storeId:string) { + this.bundleName = bundleNme + this.storeId = storeId } createKvStore() { let config = { - bundleName: 'ohos.samples.etsdistributeddataquery', + bundleName: this.bundleName, userInfo: { userId: '0', userType: 0 @@ -56,18 +59,17 @@ export class KvStoreMode { schema.mode = 1 options.schema = schema.toJsonString() console.log(`${TAG} ${schema.toJsonString()}`) - manager.getKVStore(STORE_ID, options).then((store) => { + manager.getKVStore(this.storeId, options).then((store) => { console.info(`${TAG} getKVStore success, SingleKVStore = ${store}`) this.SingleKVStore = store }) }) } - put(callback) { - let key = 'batch_test_string_key' + put(key,callback) { for (var i = 0; i < 10; i++) { - console.log(`${TAG} this.SingleKVStore = ${this.SingleKVStore} ${key} ${i}`) - let value = '{name:' + i + '}' + let value = '{"name":' + i + '}' + console.log(`${TAG} this.SingleKVStore = ${this.SingleKVStore} ${key} ${i} ${value}`) this.SingleKVStore.put(key + i, value).then((data) => { console.info(`${TAG} SingleKVStore.put success`) callback('put success') @@ -77,9 +79,9 @@ export class KvStoreMode { } } - getResultSet(callback) { + getResultSet(key,callback) { self = this - this.SingleKVStore.getResultSet('batch_test_', function (err, result) { + this.SingleKVStore.getResultSet(key, function (err, result) { self.resultSet(result, callback) }) } @@ -89,7 +91,7 @@ export class KvStoreMode { console.log(`${TAG} getResultSet success result.moveToFirst = ${result.moveToFirst()}`) console.log(`${TAG} getResultSet success result.entry = ${JSON.stringify(result.getEntry())}`) let entries = '' - for (let i = 0; i < result.getCount(); i++) { + for (let i = 0;i < result.getCount(); i++) { console.info(`${TAG} key = ${JSON.stringify(result.getEntry().key)}`) console.info(`${TAG} value = ${JSON.stringify(result.getEntry().value.value)}`) entries += `key:${JSON.stringify(result.getEntry().key)},value:${JSON.stringify(result.getEntry().value.value)}\n` @@ -101,30 +103,19 @@ export class KvStoreMode { }) } - prefixKey(callback) { - let query = new distributedData.Query() - query.prefixKey('batch_test_string') + prefixKey(query,callback) { this.getResultSetQuery(query, callback) } - orderByDesc(callback) { - let query = new distributedData.Query() - query.notEqualTo('$.name', 3) - query.orderByDesc('$.name') + orderByDesc(query,callback) { this.getResultSetQuery(query, callback) } - and(callback) { - let query = new distributedData.Query() - query.notEqualTo('$.name', 5) - query.and() - query.notEqualTo('$.name', 3) + and(query,callback) { this.getResultSetQuery(query, callback) } - lessThan(callback) { - let query = new distributedData.Query() - query.lessThan('$.name', 7) + lessThan(query,callback) { this.getEntries(query, callback) } -- Gitee From 6cf91bccf855a4ad722ad8c09f99365198acb32c Mon Sep 17 00:00:00 2001 From: gaohui Date: Fri, 11 Feb 2022 10:30:30 +0800 Subject: [PATCH 7/9] add sample eTSDDMQuery Signed-off-by: gaohui --- .../ets/MainAbility/model/kvStoreModule.ets | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/data/eTSDDMQuery/entry/src/main/ets/MainAbility/model/kvStoreModule.ets b/data/eTSDDMQuery/entry/src/main/ets/MainAbility/model/kvStoreModule.ets index c7fc055f96..d0084578aa 100644 --- a/data/eTSDDMQuery/entry/src/main/ets/MainAbility/model/kvStoreModule.ets +++ b/data/eTSDDMQuery/entry/src/main/ets/MainAbility/model/kvStoreModule.ets @@ -19,11 +19,11 @@ const TAG = '[KvStoreModule]:' let self = null export class KvStoreModule { - private bundleName:string = '' + private bundleName: string = '' private storeId: string = '' SingleKVStore - constructor(bundleNme:string,storeId:string) { + constructor(bundleNme: string, storeId: string) { this.bundleName = bundleNme this.storeId = storeId } @@ -66,8 +66,8 @@ export class KvStoreModule { }) } - put(key,callback) { - for (var i = 0; i < 10; i++) { + put(key, callback) { + for (let i = 0; i < 10; i++) { let value = '{"name":' + i + '}' console.log(`${TAG} this.SingleKVStore = ${this.SingleKVStore} ${key} ${i} ${value}`) this.SingleKVStore.put(key + i, value).then((data) => { @@ -79,7 +79,7 @@ export class KvStoreModule { } } - getResultSet(key,callback) { + getResultSet(key, callback) { self = this this.SingleKVStore.getResultSet(key, function (err, result) { self.resultSet(result, callback) @@ -91,7 +91,7 @@ export class KvStoreModule { console.log(`${TAG} getResultSet success result.moveToFirst = ${result.moveToFirst()}`) console.log(`${TAG} getResultSet success result.entry = ${JSON.stringify(result.getEntry())}`) let entries = '' - for (let i = 0;i < result.getCount(); i++) { + for (let i = 0; i < result.getCount(); i++) { console.info(`${TAG} key = ${JSON.stringify(result.getEntry().key)}`) console.info(`${TAG} value = ${JSON.stringify(result.getEntry().value.value)}`) entries += `key:${JSON.stringify(result.getEntry().key)},value:${JSON.stringify(result.getEntry().value.value)}\n` @@ -103,19 +103,19 @@ export class KvStoreModule { }) } - prefixKey(query,callback) { + prefixKey(query, callback) { this.getResultSetQuery(query, callback) } - orderByDesc(query,callback) { + orderByDesc(query, callback) { this.getResultSetQuery(query, callback) } - and(query,callback) { + and(query, callback) { this.getResultSetQuery(query, callback) } - lessThan(query,callback) { + lessThan(query, callback) { this.getEntries(query, callback) } -- Gitee From 2ef66ecccd4acf1bfbe3aea3a2ab7e777a5588f2 Mon Sep 17 00:00:00 2001 From: gaohui Date: Mon, 14 Feb 2022 10:19:00 +0800 Subject: [PATCH 8/9] add sample eTSDDMQuery Signed-off-by: gaohui --- .../src/main/ets/MainAbility/common/query.ets | 23 +++++---- .../ets/MainAbility/model/kvStoreModule.ets | 47 +++++++------------ 2 files changed, 29 insertions(+), 41 deletions(-) diff --git a/data/eTSDDMQuery/entry/src/main/ets/MainAbility/common/query.ets b/data/eTSDDMQuery/entry/src/main/ets/MainAbility/common/query.ets index dd4d6102e8..698e06940b 100644 --- a/data/eTSDDMQuery/entry/src/main/ets/MainAbility/common/query.ets +++ b/data/eTSDDMQuery/entry/src/main/ets/MainAbility/common/query.ets @@ -24,16 +24,18 @@ export struct Query { private options: Resource[] = [$r('app.string.push'), $r('app.string.resultSet'), $r('app.string.prefixKey'), $r('app.string.orderByDesc'), $r('app.string.addResult'), $r('app.string.lessThan')] @State textTitle: string = '' - - aboutToAppear() { - kvStoreModule.createKvStore() - } + private queryTest = null onQuery(data) { console.log('[KvStoreModule] onQuery') this.textTitle = data } + aboutToAppear() { + kvStoreModule.createKvStore() + this.queryTest = this.onQuery.bind(this) + } + build() { Scroll() { Column() { @@ -57,32 +59,33 @@ export struct Query { .fontSize(20) .textAlign(TextAlign.Center) .onClick(() => { + console.log(`[KvStoreModule] onClick index= ${index}`) switch (index) { case 0: let key = 'batch_test_string_key' - kvStoreModule.put(key, this.onQuery.bind(this)) + kvStoreModule.put(key, this.queryTest) break case 1: - kvStoreModule.getResultSet('batch_test', this.onQuery.bind(this)) + kvStoreModule.getResultSet('batch_test', this.queryTest) break case 2: query.prefixKey('batch_test_string') - kvStoreModule.prefixKey(query, this.onQuery.bind(this)) + kvStoreModule.getResultSetQuery(query, this.queryTest) break case 3: query.notEqualTo('$.name', 3) query.orderByDesc('$.name') - kvStoreModule.orderByDesc(query, this.onQuery.bind(this)) + kvStoreModule.getResultSetQuery(query, this.queryTest) break case 4: query.notEqualTo('$.name', 5) query.and() query.notEqualTo('$.name', 3) - kvStoreModule.and(query, this.onQuery.bind(this)) + kvStoreModule.getResultSetQuery(query, this.queryTest) break case 5: query.lessThan('$.name', 7) - kvStoreModule.lessThan(query, this.onQuery.bind(this)) + kvStoreModule.getEntries(query, this.queryTest) break default: break diff --git a/data/eTSDDMQuery/entry/src/main/ets/MainAbility/model/kvStoreModule.ets b/data/eTSDDMQuery/entry/src/main/ets/MainAbility/model/kvStoreModule.ets index d0084578aa..d995611bcd 100644 --- a/data/eTSDDMQuery/entry/src/main/ets/MainAbility/model/kvStoreModule.ets +++ b/data/eTSDDMQuery/entry/src/main/ets/MainAbility/model/kvStoreModule.ets @@ -16,7 +16,6 @@ import distributedData from '@ohos.data.distributedData' const TAG = '[KvStoreModule]:' -let self = null export class KvStoreModule { private bundleName: string = '' @@ -80,10 +79,9 @@ export class KvStoreModule { } getResultSet(key, callback) { - self = this - this.SingleKVStore.getResultSet(key, function (err, result) { - self.resultSet(result, callback) - }) + this.SingleKVStore.getResultSet(key, function(err, result){ + this.resultSet(result, callback) + }.bind(this)) } resultSet(result, callback) { @@ -103,37 +101,24 @@ export class KvStoreModule { }) } - prefixKey(query, callback) { - this.getResultSetQuery(query, callback) - } - - orderByDesc(query, callback) { - this.getResultSetQuery(query, callback) - } - - and(query, callback) { - this.getResultSetQuery(query, callback) - } - - lessThan(query, callback) { - this.getEntries(query, callback) - } - getResultSetQuery(query, callback) { - self = this - this.SingleKVStore.getResultSet(query, function (err, result) { + console.log(`${TAG} getResultSetQuery enter`) + this.SingleKVStore.getResultSet(query, function(err, result){ query = null - self.resultSet(result, callback) - }) + console.log(`${TAG} getResultSetQuery getResultSet,err=${err}`) + this.resultSet(result, callback) + }.bind(this)) } getEntries(query, callback) { - self = this - this.SingleKVStore.getEntries(query).then((entries) => { - console.log(`${TAG} getEntries success ${JSON.stringify(entries)}`) - self.resultSet(entries, callback) - }).catch((err) => { + try { + this.SingleKVStore.getEntries(query, function(entries){ + console.log(`${TAG} getEntries success ${JSON.stringify(entries)}`) + query = null + this.resultSet(entries, callback) + }.bind(this)) + } catch (err) { console.info(`${TAG} getEntries fail ${JSON.stringify(err)}`) - }) + } } } \ No newline at end of file -- Gitee From d39e3ccb818c862067b722ab685c2c6962b7b6df Mon Sep 17 00:00:00 2001 From: gaohui Date: Mon, 14 Feb 2022 10:40:01 +0800 Subject: [PATCH 9/9] add sample eTSDDMQuery Signed-off-by: gaohui --- .../entry/src/main/ets/MainAbility/model/kvStoreModule.ets | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/data/eTSDDMQuery/entry/src/main/ets/MainAbility/model/kvStoreModule.ets b/data/eTSDDMQuery/entry/src/main/ets/MainAbility/model/kvStoreModule.ets index d995611bcd..335e297814 100644 --- a/data/eTSDDMQuery/entry/src/main/ets/MainAbility/model/kvStoreModule.ets +++ b/data/eTSDDMQuery/entry/src/main/ets/MainAbility/model/kvStoreModule.ets @@ -79,7 +79,7 @@ export class KvStoreModule { } getResultSet(key, callback) { - this.SingleKVStore.getResultSet(key, function(err, result){ + this.SingleKVStore.getResultSet(key, function (err, result){ this.resultSet(result, callback) }.bind(this)) } @@ -103,7 +103,7 @@ export class KvStoreModule { getResultSetQuery(query, callback) { console.log(`${TAG} getResultSetQuery enter`) - this.SingleKVStore.getResultSet(query, function(err, result){ + this.SingleKVStore.getResultSet(query, function (err, result){ query = null console.log(`${TAG} getResultSetQuery getResultSet,err=${err}`) this.resultSet(result, callback) @@ -112,7 +112,7 @@ export class KvStoreModule { getEntries(query, callback) { try { - this.SingleKVStore.getEntries(query, function(entries){ + this.SingleKVStore.getEntries(query, function (entries){ console.log(`${TAG} getEntries success ${JSON.stringify(entries)}`) query = null this.resultSet(entries, callback) -- Gitee