-
快应用的数据将会储存在云侧,本地不会缓存数据。在进行数据管理操作时,您将会直接操作云侧数据。快应用 SDK将会为您的应用与云数据库的通讯和通讯安全提供保障。使用Cloud DB构建快应用,需要完成以下准备工作:您已经在开发者联盟官网注册帐号并通过实名认证,详细请参见帐号注册认证。完成开发环境的搭建,包括在PC上安装快应用IDE、在测试手机安装快应用加载器,详细参见安装开发工具。在AppGallery Connect控制台上完成快应用的创建,详细参见创建快应用。使用快应用IDE生成证书指纹,并在AppGallery Connect控制台上完成指纹的配置,详细参见生成、配置指纹证书。您已经获取到示例代码,请从示例代码获取。启用服务使用Cloud DB服务前,您需要先启用服务。登录AppGallery Connect网站,选择“我的项目”。在项目列表页面中选择项目,单击项目下需要启用云数据库服务的应用。在导航树上选择“构建 > 云数据库”。单击“立即开通”,开通云数据库服务。 (可选)如您还未选择数据处理位置,需要您先设置数据处理位置,具体操作请参见设置数据处理位置。服务初始化成功后,即启用云数据库服务成功。新增和导出对象类型您需要基于AppGallery Connect控制台创建对象类型,请您遵循操作步骤创建示例中涉及的对象类型,并导出用于快应用开发的json格式和js格式对象类型文件。不允许修改导出的json格式和js格式文件,否则会导致数据同步功能异常。登录AppGallery Connect网站,选择“我的项目”。在项目列表页面中选择项目,单击项目下需要创建对象类型的应用。在导航树上选择“构建 > 云数据库”。单击“新增”,进入创建对象类型页面。 输入对象类型名为“BookInfo”后,单击“下一步”。单击,新增如下字段后,单击“下一步”。表1 字段定义表字段名称类型主键非空加密默认值idInteger√√––bookNameString––––authorString––––priceDouble––––publisherString––––publishTimeDate––––shadowFlagBoolean–––true单击,设置索引名为“bookName”,索引字段为“bookName”后,单击“下一步”。按照如下要求设置各角色权限后,单击“下一步”。单击“确定”。创建完成后返回对象类型列表中,可以查看已创建的对象类型。单击“导出”。 导出“json格式”和“js格式”文件,导出的文件在后续步骤用于添加至本地开发环境。导出json格式文件选择“json格式”。单击“导出”。导出js格式文件选择“js格式”。选择js文件类型,选择“js”。单击“导出”。新增存储区您可基于AppGallery Connect控制台在云侧创建数据存储区,请您遵循操作步骤创建一个存储区名称为“QuickStartDemo”的存储区。登录AppGallery Connect网站,选择“我的项目”。在项目列表页面中选择项目,单击项目下需要创建存储区的应用。在导航树上选择“构建 > 云数据库”。选择“存储区”页签。单击“新增”,进入创建存储区页面。 输入存储区名称为“QuickStartDemo”。单击“确定”。创建完成后返回存储区列表中,可以查看已创建的存储区。配置开发环境创建一个快应用项目。打开快应用IDE,在欢迎页单击登录,在跳转的网页中登录注册的帐号。登录成功后,IDE的导航选择“新建工程 > 快应用-云开发”,选择关联应用、模板,设置项目路径后,单击“确定”。关联应用:选择之前在AppGallery Connect上创建的快应用。项目路径:存放Serverless项目工程的路径。 新建项目结构主要由quickapp.config.json、client、cloudfunctions组成。|-- client 用于存放标准快应用代码|-- |-- src 标准快应用源码目录|-- |-- |-- Common 快应用公共资源文件目录|-- |-- |-- Hello 快应用主文件目录|-- |-- |-- app.ux 快应用入口文件|-- |-- |-- manifest.json 快应用配置文件|-- |-- package.json 快应用代码依赖云函数SDK的配置文件|-- cloudfunctions 云函数目录,该目录下可以创建多个云函数目录|-- quickapp.config.json serverless项目的配置文件 quickapp.config.json针对serverless项目的配置信息如下:quickappRoot:表示client端快应用代码目录,快应用serverless项目只会编译打包该目录下的内容。 cloudfunctionRoot:表示serverless项目云函数目录,该目录主要存放项目所有云函数代码。配置应用信息。登录AppGallery Connect网站,选择“我的项目”。在项目列表页面中选择项目,单击项目下的应用。选择“常规”页签,下载配置文件“agconnect-services.json”,并拷贝到您的快应用项目src目录下。在hello.ux文件中添加agconnect-services.json文件引用。const context = require('../agconnect-services.json');集成Cloud DB SDK。执行如下命令,安装Cloud DB JavaScript SDK云数据库服务模块到您的项目中。npm install --save @agconnect/database在您的项目中导入database组件。import "@agconnect/database";在manifest.json文件的 features属性中增加如下配置。{"name": "system.cipher"}添加对象类型文件在开发应用时,可直接将AppGallery Connect控制台上导出的json格式和js格式文件添加至本地开发环境,并通过AGConnectCloudDB类中的createObjectType()方法实现对象类型的定义和创建。您在进行本地应用开发时,无需再次创建对象类型。将已在AppGallery Connect控制台上导出的全部json格式和js格式文件添加至本地开发环境。初始化Cloud DB,通过AGConnectCloudDB类中的createObjectType()方法实现对象类型的定义和创建,详细请参见初始化。初始化在添加对象类型文件后,您就可以使用云数据库进行应用开发。您开发应用时,需要先执行初始化操作,初始化AGConnectCloudDB、创建Cloud DB zone和对象类型。通过initialize()初始化AGConnectCloudDB。AGConnectCloudDB.initialize(context);通过getInstance()方法获取AGConnectCloudDB实例,并使用createObjectType()创建对象类型。const schema = require('./BookInfo.json'); agcCloudDB = AGConnectCloudDB.getInstance(); agcCloudDB.createObjectType(schema);打开Cloud DB zone。const config = new CloudDBZoneConfig('QuickStartDemo'); cloudDBZone = await agcCloudDB.openCloudDBZone(config);写入数据在本节主要介绍如何在应用程序中进行数据写入操作,如下所示,使用executeUpsert()实现数据的写入。async function executeUpsert (book) { try { const cloudDBZoneResult = await cloudDBZone.executeUpsert(book); console.log('upsert' + cloudDBZoneResult + 'record' ); } catch (e) { console.log('upsert failed with reason'); conso.log(e); } }查看数据获取数据变化用户在应用界面中新增的数据,将会被存储在云侧。在端侧注册数据变化侦听器,当云侧数据发生变化时,端侧能够感知数据变化。通过查询条件与subscribeSnapshot()方法组合使用,可以指定侦听对象,当侦听对象的数据发生变化时,端侧会收到数据变化通知,并生成新的快照,触发用户回调。async function subscribeSnapshot () { const query = CloudDBZoneQuery.where(BookInfo); query.equalTo('shadowFlag', true); try { const onSnapshotListener = { onSnapshot: (snapshot, e) => { if (e !== null && e !== undefined && e.code !== AGConnectCloudDBExceptionCode.Ok) { console.log('subscribeSnapshot error'); console.log(e); } return snapshot.getSnapshotObjects(); } }; const listenerHandler = await cloudDBZone.subscribeSnapshot(query, onSnapshotListener); console.log(listenerHandler); } catch (e) { console.log('subscribeSnapshot error'); console.log(e); return null; } } function subscribeBookList() { subscribeSnapshot().then(snapshot => { snapshot.getDeletedObjects(); const resultList = snapshot.getSnapshotObjects(); console.log(resultList); }) }数据查询和排序通过executeQuery()实现异步方式查询数据。async function executeQuery() { try { const query = CloudDBZoneQuery.where(BookInfo); const snapshot = await cloudDBZone.executeQuery(query); const resultArray = snapshot.getSnapshotObjects(); console.log(resultArray); } catch(e) { console.log(e); } }通过查询与limit()方法组合,实现限制查询数据显示条数的功能;与orderByAsc()方法或者orderByDesc()方法组合来实现数据的排序功能。async function executeQueryWithOrder (object) { const query = CloudDBZoneQuery.where(BookInfo); if (object.name.length > 0) { query.equalTo('bookName', object.name); } if (parseFloat(object.minPrice) > 0) { query.greaterThanOrEqualTo('price', parseFloat(object.minPrice)); } if (parseFloat(object.maxPrice) > 0 && parseFloat(object.maxPrice) > parseFloat(object.minPrice)) { query.lessThanOrEqualTo('price', parseFloat(object.maxPrice)); } if (parseInt(object.bookCount) > 0) { query.limit(parseInt(object.bookCount)); } query.orderByAsc('id'); try { const snapshot = await cloudDBZone.executeQuery(query); console.log('resultArray'); console.log(snapshot.getSnapshotObjects()); return snapshot.getSnapshotObjects(); } catch (e) { console.log('query failed with reason'); console.log(e); } }
-
概述Web应用的数据将会储存在云侧,本地不会缓存数据。在进行数据管理操作时,您将会直接操作云侧数据。Web SDK将会为您的应用与云数据库的通讯和通讯安全提供保障。此示例应用演示了如何快速的使用Cloud DB构建简单的图书管理服务。通过快速入门和示例应用,您将会了解到如下信息:如何使用Cloud DB进行应用开发。应用数据如何写入到Cloud DB。如何实现数据的查询。实时侦听数据的更改。体验端云数据同步等功能。开发准备使用Cloud DB构建应用服务,需要完成以下准备工作:您已经在开发者联盟官网注册帐号并通过实名认证,详细请参见帐号注册认证。您已经在AppGallery Connect控制台上创建项目和应用,详细请参见创建项目。示例应用使用了认证用户的相关权限,需要开通AppGallery Connect认证服务中“匿名帐号”服务,详细请参见认证服务。您已经获取到示例代码,请从示例代码获取。注意事项当对象类型中字段的默认值设置为中文字符或者其他特殊字符时,本地编辑器或IDE默认编码格式应设置为utf-8,否则会导致端云数据同步失败。支持的浏览器Cloud DB JavaScript SDK支持的浏览器:服务ChromeEdgeFirefox华为浏览器SafariUC浏览器QQ浏览器IE11Cloud DB√√√√√√√√说明由于IE11只支持ES5,需要通过如下步骤将ES6配置为兼容ES5,让JavaScript SDK支持IE11。执行如下命令,安装babel-polyfill到您的项目中。npm install --save-dev babel-polyfill在代码入口主文件中导入babel-polyfill组件。import 'babel-polyfill';打开工程的配置文件,例如vue2.x+vue-cli中的webpack.base.conf.js文件,修改entry字段值,假设main.js是代码入口主文件。entry:['babel-polyfill','./src/main.js']在package.json文件中查看是否包含babel-loader,如果无babel-loader,请执行如下命令安装babel-loader。npm install babel-loader在工程的配置文件中添加如下规则,例如vue2.x+vue-cli中的webpack.base.conf.js文件。{ test: /\.js$/, loader: 'babel-loader', include: [resolve('node_modules/@agconnect/database')] }启用服务使用Cloud DB服务前,您需要先启用服务。登录AppGallery Connect网站,选择“我的项目”。在项目列表页面中选择项目,单击项目下需要启用云数据库服务的应用。在导航树上选择“构建 > 云数据库”。单击“立即开通”,开通云数据库服务。 (可选)如您还未选择数据处理位置,需要您先设置数据处理位置,具体操作请参见设置数据处理位置。服务初始化成功后,即启用云数据库服务成功。新增和导出对象类型您需要基于AppGallery Connect控制台创建对象类型,请您遵循操作步骤创建示例中涉及的对象类型,并导出用于Web应用开发的json格式和js格式对象类型文件。不允许修改导出的json格式和js格式文件,否则会导致数据同步功能异常。登录AppGallery Connect网站,选择“我的项目”。在项目列表页面中选择项目,单击项目下需要创建对象类型的应用。在导航树上选择“构建 > 云数据库”。单击“新增”,进入创建对象类型页面。 输入对象类型名为“BookInfo”后,单击“下一步”。单击 ,新增如下字段后,单击“下一步”。表1 字段定义表字段名称类型主键非空加密默认值idInteger√√––bookNameString––––authorString––––priceDouble––––publisherString––––publishTimeDate––––shadowFlagBoolean–––true单击 ,设置索引名为“bookName”,索引字段为“bookName”后,单击“下一步”。按照如下要求设置各角色权限后,单击“下一步”。表2 权限配置表角色queryupsertdelete所有人√––认证用户√√√数据创建者√√√管理员√√√单击“确定”。创建完成后返回对象类型列表中,可以查看已创建的对象类型。单击“导出”。 导出“json格式”和“js格式”文件,导出的文件在后续步骤用于添加至本地开发环境。导出json格式文件选择“json格式”。单击“导出”。导出js格式文件选择“js格式”。选择js文件类型,选择“js”。单击“导出”。新增存储区您可基于AppGallery Connect控制台在云侧创建数据存储区,请您遵循操作步骤创建一个存储区名称为“QuickStartDemo”的存储区。登录AppGallery Connect网站,选择“我的项目”。在项目列表页面中选择项目,单击项目下需要创建存储区的应用。在导航树上选择“构建 > 云数据库”。选择“存储区”页签。单击“新增”,进入创建存储区页面。输入存储区名称为“QuickStartDemo”。单击“确定”。创建完成后返回存储区列表中,可以查看已创建的存储区。配置开发环境使用编译平台打开示例项目。集成AGC SDK,详细请参见集成AGC SDK。集成Cloud DB SDK。执行如下命令,安装Cloud DB JavaScript SDK云数据库服务模块到您的项目中。npm install --save @agconnect/database在您的项目中导入database组件。import "@agconnect/database";添加对象类型文件在开发应用时,可直接将AppGallery Connect控制台上导出的json格式和js格式文件添加至本地开发环境,并通过AGConnectCloudDB类中的createObjectType()方法实现对象类型的定义和创建。您在进行本地应用开发时,无需再次创建对象类型。将已在AppGallery Connect控制台上导出的全部json格式和js格式文件添加至本地开发环境,如已存在,请覆盖原文件,文件位置如下所示:json格式:quickstart-js-sdk/src/components/configjs格式:quickstart-js-sdk/src/components/model初始化Cloud DB,通过AGConnectCloudDB类中的createObjectType()方法实现对象类型的定义和创建,详细请参见初始化。初始化在添加对象类型文件后,您就可以使用云数据库进行应用开发。您开发应用时,需要先执行初始化操作,初始化AGConnectCloudDB、创建Cloud DB zone和对象类型。 通过initialize()初始化AGConnectCloudDB。AGConnectCloudDB.initialize(context);通过getInstance()方法获取AGConnectCloudDB实例,并使用createObjectType()创建对象类型。const schema = require('./BookInfo.json'); agcCloudDB = AGConnectCloudDB.getInstance(); agcCloudDB.createObjectType(schema);打开Cloud DB zone。const config = new CloudDBZoneConfig('QuickStartDemo'); cloudDBZone = await agcCloudDB.openCloudDBZone(config);写入数据在本节主要介绍如何在应用程序中进行数据写入操作,以便您了解如何使用Cloud DB SDK实现数据的写入。在应用界面中,增加了“添加”按钮,用于用户新增数据,并在代码中通过executeUpsert()实现数据的写入。async function executeUpsert (book) { try { const cloudDBZoneResult = await cloudDBZone.executeUpsert(book); console.log('upsert' + cloudDBZoneResult + 'record' ); } catch (e) { conso.log(e); } }查看数据获取数据变化用户在应用界面中新增的数据,将会被存储在云侧。在端侧注册数据变化侦听器,当云侧数据发生变化时,端侧能够感知数据变化。通过查询条件与subscribeSnapshot()方法组合使用,可以指定侦听对象,当侦听对象的数据发生变化时,端侧会收到数据变化通知,并生成新的快照,触发用户回调。async function subscribeSnapshot () { const query = CloudDBZoneQuery.where(BookInfo); query.equalTo('shadowFlag', true); try { const onSnapshotListener = { onSnapshot: (snapshot, e) => { if (e !== null && e !== undefined && e.code !== AGConnectCloudDBExceptionCode.Ok) { console.log('subscribeSnapshot error'); console.log(e); } return snapshot.getSnapshotObjects(); } }; const listenerHandler = await cloudDBZone.subscribeSnapshot(query, onSnapshotListener); console.log(listenerHandler); } catch (e) { console.log('subscribeSnapshot error'); console.log(e); return null; } } function subscribeBookList() { subscribeSnapshot().then(snapshot => { snapshot.getDeletedObjects(); const resultList = snapshot.getSnapshotObjects(); console.log(resultList); }) }数据查询和排序在应用界面中,增加了“查询”按钮和排序功能,通过executeQuery()实现异步方式查询数据。async function executeQuery() { try { const query = CloudDBZoneQuery.where(BookInfo); const snapshot = await cloudDBZone.executeQuery(query); const resultArray = snapshot.getSnapshotObjects(); console.log(resultArray); } catch(e) { console.log(e); } }通过查询与limit()方法组合,实现限制查询数据显示条数的功能;与orderByAsc()方法或者orderByDesc()方法组合来实现数据的排序功能。async function executeQueryWithOrder (object) { const query = CloudDBZoneQuery.where(BookInfo); if (object.name.length > 0) { query.equalTo('bookName', object.name); } if (parseFloat(object.minPrice) > 0) { query.greaterThanOrEqualTo('price', parseFloat(object.minPrice)); } if (parseFloat(object.maxPrice) > 0 && parseFloat(object.maxPrice) > parseFloat(object.minPrice)) { query.lessThanOrEqualTo('price', parseFloat(object.maxPrice)); } if (parseInt(object.bookCount) > 0) { query.limit(parseInt(object.bookCount)); } query.orderByAsc('id'); try { const snapshot = await cloudDBZone.executeQuery(query); console.log('resultArray'); console.log(snapshot.getSnapshotObjects()); return snapshot.getSnapshotObjects(); } catch (e) { console.log('query failed with reason'); console.log(e); } }应用编译运行到此,您已经了解了示例应用的开发流程。您可以在WebStorm编译器上执行npm run serve命令运行示例应用。
-
APP资产清单园区通用APP资产由以下APP组成:表1 APP资产说明资产名称资产描述统一门户APP提供APP的统一入口,同时提供菜单编辑。针对展示内容,提供组件资产、菜单及信息等的增加、删除、更新及查询接口。系统管理APP提供用户管理,权限管理和大屏管理的能力。针对展示内容,提供操作员密码、操作员及相关权限等的增加、删除、更新及查询接口。APP版本查询订购园区解决方案后,登录智慧园区运营中心,单击右上角登录用户账号下的菜单项目“关于”,即可查看已安装应用的版本号,如图1所示。图1 APP版本查询页面
-
概述此示例应用演示了如何快速的使用Cloud DB构建简单的图书管理服务。通过快速入门和示例应用,您将会了解到如下信息:如何使用Cloud DB进行应用开发。应用数据如何写入到Cloud DB。如何实现数据的查询。实时侦听数据的更改。体验端云数据同步等功能。开发准备使用Cloud DB构建应用服务,需要完成以下准备工作:您已经在开发者联盟官网注册帐号并通过实名认证,详细请参见帐号注册认证。您已经在AppGallery Connect控制台上创建项目和应用,详细请参见创建项目。示例应用使用了认证用户的相关权限,需要开通AppGallery Connect认证服务中“匿名帐号”服务,详细请参见认证服务。您已经获取到示例代码,请从示例代码获取。您已在本地安装Xcode。启用服务使用Cloud DB服务前,您需要先启用服务。登录AppGallery Connect网站,选择“我的项目”。在项目列表页面中选择项目,单击项目下需要启用云数据库服务的应用。在导航树上选择“构建 > 云数据库”。单击“立即开通”,开通云数据库服务。 (可选)如您还未选择数据处理位置,需要您先设置数据处理位置,具体操作请参见设置数据处理位置。服务初始化成功后,即启用云数据库服务成功。新增和导出对象类型您需要基于AppGallery Connect控制台创建对象类型,请您遵循操作步骤创建示例中涉及的对象类型,并导出Objective-C格式的对象类型文件。不允许修改导出的Objective-C格式文件,否则会导致数据同步功能异常。登录AppGallery Connect网站,选择“我的项目”。在项目列表页面中选择项目,单击项目下需要创建对象类型的应用。在导航树上选择“构建 > 云数据库”。单击“新增”,进入创建对象类型页面。 输入对象类型名为“BookInfo”后,单击“下一步”。单击 +新增字段,新增如下字段后,单击“下一步”。表1 字段定义表字段名称类型主键非空加密默认值idInteger√√––bookNameString––––authorString––––priceDouble––––publisherString––––publishTimeDate––––shadowFlagBoolean–––true单击 +新增索引 ,设置索引名为“bookName”,索引字段为“bookName”后,单击“下一步”。按照如下要求设置各角色权限后,单击“下一步”。单击“确定”。创建完成后返回对象类型列表中,可以查看已创建的对象类型。单击“导出”。 选择导出文件格式,选择“Objective-C格式”。单击“导出”。文件将会导出至本地,其内包含该版本中所有的对象类型。导出的Objective-C格式文件在后续步骤用于添加至本地开发环境。新增存储区可基于AppGallery Connect控制台在云侧创建数据存储区,请您遵循操作步骤创建一个存储区名称为“CloudDBDemo”的存储区。登录AppGallery Connect网站,选择“我的项目”。在项目列表页面中选择项目,单击项目下需要创建存储区的应用。在导航树上选择“构建 > 云数据库”。选择“存储区”页签。单击“新增”,进入创建存储区页面。输入存储区名称为“CloudDBDemo”。单击“确定”。创建完成后返回存储区列表中,可以查看已创建的存储区。配置开发环境使用CocoaPods集成SDK。集成AGC SDK,详细请参见集成AGC SDK。在podfile文件中添加Cloud DB SDK依赖。pod 'AGConnectDatabase', '~>1.0.4.300'执行pod install,然后打开.xcworkspace文件查看该项目。pod install注意:使用SQLCipher默认生成的文件权限为0644,建议将文件权限修改为0640,保证文件在使用过程中的安全性。每次pod install后,在pod工程中的“TARGETS > SQLCipher > Build Settings > Other C Flags”文件中添加“-DSQLITE_DEFAULT_FILE_PERMISSIONS=0640”。Cloud DB iOS SDK依赖SQLCipher,而SQLCipher是基于SQLite开发的开源组件,由于iOS SDK并没有直接集成SQLCipher源码,所有我们无法提供已修复漏洞的SQLCipher版本。但是,我们会持续关注SQLite上的漏洞信息,当发现新的漏洞时,我们会及时分析和验证,确认漏洞可以修复时,会更新至漏洞补丁表中,您可以根据应用需要选择是否修复该漏洞,详细请参见SQLite漏洞修复。添加对象类型文件在开发应用时,可直接将AppGallery Connect控制台上导出的Objective-C格式文件添加至本地开发环境,并通过AGConnectCloudDB类中的createObjectType方法实现对象类型的定义和创建。在进行本地应用开发时,无需再次创建对象类型。将已在AppGallery Connect控制台上导出的全部Objective-C格式文件添加至本地开发环境。初始化Cloud DB,通过AGConnectCloudDB类中的createObjectType方法实现对象类型的定义和创建,详细请参见初始化。初始化在配置完开发环境后,就可以使用云数据库进行应用开发。开发应用时,需要先执行初始化操作,初始化AGConnectCloudDB、创建Cloud DB zone和对象类型。通过initEnvironment方法初始化AGConnectCloudDB。NSError *error = nil; [AGConnectCloudDB initEnvironment:&error];通过shareInstance方法获取AGConnectCloudDB实例,并使用createObjectType方法创建对象类型。self.agcConnectCloudDB = [AGConnectCloudDB shareInstance]; NSError *createError= nil; [self.agcConnectCloudDB createObjectType:[AGCCloudDBObjectTypeInfoHelper obtainObjectTypeInfo] error:&createError];创建Cloud DB zone配置对象,并打开该Cloud DB zone(以Cloud DB zone的同步属性为缓存模式、访问属性为公共存储区为例),详细请参考AGCCloudDBZoneConfig。AGCCloudDBZoneConfig *zoneConfig = [[AGCCloudDBZoneConfig alloc] initWithZoneName:zoneName syncMode:AGCCloudDBZoneSyncModeCloudCache accessMode:AGCCloudDBZoneAccessModePublic]; __weak typeof(self) weakSelf = self; [self.agcConnectCloudDB openCloudDBZone2:zoneConfig allowCreate:YES callback:^(AGCCloudDBZone * _Nullable zone, NSError * _Nullable error) { weakSelf.dbZone = zone; }];写入数据在本节主要介绍如何在应用程序中进行数据写入操作,以便您了解如何使用Cloud DB SDK实现数据的写入。在应用界面中,增加了“添加”按钮,用于用户新增数据,并在代码中通过executeUpsert实现数据的写入。- (void)executeUpsertWithBooks:(NSArray <BookInfo *> *__nonnull)books complete:(void(^)(BOOL success, NSError *error))complete { if (books.count == 0) { return; } [self.dbZone executeUpsert:books onCompleted:^(NSInteger count, NSError * _Nullable error) { if (error) { if (complete) { complete(NO, error); } } else { if (complete) { complete(YES, nil); } } }]; }查看数据获取数据变化用户在应用界面中新增的数据,将会被存储在云侧。在端侧注册数据变化侦听器,当云侧数据发生变化时,端侧能够感知数据变化,及时刷新本地应用数据。通过查询条件与subscribeSnapshotWithQuery方法组合使用,可以指定侦听对象,当侦听对象的数据发生变化时,端侧会收到通知,根据快照获取变化的数据信息,从云侧同步数据至端侧应用。- (void)subscribeSnapshotComplete:(void(^)(NSArray *bookList, NSError *error))complete { AGCCloudDBQuery *query = [AGCCloudDBQuery where:[BookInfo class]]; [query equalTo:@YES forField:@"showFlag"]; [self.dbZone subscribeSnapshotWithQuery:query policy:AGCCloudDBQueryPolicyCloud listener:^(AGCCloudDBSnapshot * _Nullable snapshot, NSError * _Nullable error) { if (snapshot != nil) { NSArray *bookList = snapshot.snapshotObjects; if (complete) { complete(bookList, nil); } } else { if (complete) { complete(nil, error); } } }]; }数据查询和排序在应用界面中,增加了“查询”按钮和排序功能,通过executeQuery实现异步方式查询数据。- (void)queryAllBooksWithResults:(void(^)(NSArray * bookList, NSError *error))results { AGCCloudDBQuery *query = [AGCCloudDBQuery where:[BookInfo class]]; [self.dbZone executeQuery:query policy:AGCCloudDBQueryPolicyCloud onCompleted:^(AGCCloudDBSnapshot *_Nullable snapshot, NSError *_Nullable error) { if (error) { if (results) { results(nil, error); } } else { NSArray *bookList = snapshot.snapshotObjects; if (results) { results(bookList, nil); } } }]; }通过查询与limit方法组合,实现限制查询数据显示条数的功能;与orderByAsc方法或者orderByDesc方法组合来实现数据的排序功能。- (void)fuzzyQueryAGCDataWithBookInfo:(nonnull BMQueryBookDataModel *)bookInfo results:(void(^)(NSArray * bookList, NSError *error))results { AGCCloudDBQuery *query = [AGCCloudDBQuery where:[BookInfo class]]; //contains [query contains:bookInfo.bookName forField:@"bookName"]; //greaterThanOrEqualTo [query greaterThanOrEqualTo:bookInfo.minBookPrice forField:@"price"]; //lessThanOrEqualTo [query lessThanOrEqualTo:bookInfo.maxBookPrice forField:@"price"]; //limit [query limit:(int)bookInfo.count]; //orderByAsc [query orderByAsc:@"bookName"]; [self.dbZone executeQuery:query policy:AGCCloudDBQueryPolicyCloud onCompleted:^(AGCCloudDBSnapshot *_Nullable snapshot, NSError *_Nullable error) { if (error) { if (results) { results(nil, error); } } else { NSArray *bookList = snapshot.snapshotObjects; if (results) { results(bookList, nil); } } }]; }应用编译运行到此,您已经了解了示例应用的开发流程。您可以编译并在iPhone手机或模拟器上运行示例应用。如需体验示例应用,您可以在A手机或A模拟器上打开应用,并新增数据;然后您可以在B手机或B模拟器上打开应用,查看在A手机或A模拟器上写入的数据。
-
概述此示例应用演示了如何快速的使用Cloud DB构建简单的图书管理服务。通过快速入门和示例应用,您将会了解到如下信息:如何使用Cloud DB进行应用开发。应用数据如何写入到Cloud DB。如何实现数据的查询。实时侦听数据的更改。体验端云数据同步等功能。开发准备使用Cloud DB构建应用服务,需要完成以下准备工作:您已经在开发者联盟官网注册帐号并通过实名认证,详细请参见帐号注册认证。您已经在AppGallery Connect控制台上创建项目和应用,详细请参见创建项目。示例应用使用了认证用户的相关权限,需要开通AppGallery Connect认证服务中“匿名帐号”服务,详细请参见认证服务。您已经获取到示例代码,请从示例代码获取。您已在本地安装Android Studio。启用服务使用Cloud DB服务前,您需要先启用服务。登录AppGallery Connect网站,选择“我的项目”。在项目列表页面中选择项目,单击项目下需要启用云数据库服务的应用。在导航树上选择“构建 > 云数据库”。单击“立即开通”,开通云数据库服务。如您还未选择数据处理位置,需要您先设置数据处理位置,Cloud DB支持多个数据处理位置,您可以设置一个数据处理位置,也可以设置多个数据处理位置,具体操作请参见设置数据处理位置。服务初始化成功后,即启用云数据库服务成功。 说明: 您进入云数据库界面后展现的是默认数据处理位置的云数据库,当您的应用需要支持多个数据处理位置时,请在“数据处理位置”选择其他存储地后再分别进行操作。新增和导出对象类型您需要基于AppGallery Connect控制台创建对象类型,请您遵循操作步骤创建示例中涉及的对象类型,并导出用于Android应用开发的java格式对象类型文件。登录AppGallery Connect网站,选择“我的项目”。在项目列表页面中选择项目,单击项目下需要创建对象类型的应用。在导航树上选择“构建 > 云数据库”。单击“新增”,进入创建对象类型页面。输入对象类型名为“BookInfo”后,单击“下一步”。单击 + 新增如下字段后,单击“下一步”。表1 字段定义表字段类型类型主键非空加密默认值idinteger√√--bookNameString----authorString----priceDouble----pulisherString----shadowFlagBoolean---true单击+ 新增索引,设置索引名为“bookName”,索引字段为“bookName”后,单击“下一步”。按照如下要求设置各角色权限后,单击“下一步”。表2 权限配置表角色queryupsertdelete所有人√--认证用户√√√数据创建者√√√管理员√√√单击“确定”。创建完成后返回对象类型列表中,可以查看已创建的对象类型。单击“导出”。选择导出文件格式,选择“java格式”。选择java文件类型,选择“android”。输入包名称,即java文件中的package名称。包名称只能包含以下3种类型:字母(A-Z或a-z)数字(0-9)特殊字符:_和.单击“导出”。文件将会导出至本地,其内包含该版本中所有的对象类型。导出的java格式文件在后续步骤用于添加至本地开发环境。新增存储区您可基于AppGallery Connect控制台在云侧创建数据存储区,请您遵循操作步骤创建一个存储区名称为“QuickStartDemo”的存储区。登录AppGallery Connect网站,选择“我的项目”。在项目列表页面中选择项目,单击项目下需要创建存储区的应用。在导航树上选择“构建 > 云数据库”。选择“存储区”页签。单击“新增”,进入创建存储区页面。输入存储区名称为“QuickStartDemo”。单击“确定”。创建完成后返回存储区列表中,可以查看已创建的存储区。配置开发环境使用Android Studio打开示例项目。集成AGC SDK,详细请参见集成AGC SDK。添加Cloud DB SDK至应用级build.gradle文件。在<项目名>/app/build.gradle文件中dependencies部分添加Cloud DB SDK。dependencies { // 添加Cloud DB SDK implementation 'com.huawei.agconnect:agconnect-cloud-database:1.5.0.300' implementation 'com.huawei.agconnect:agconnect-core:1.5.0.300' }在应用级build.gradle文件中设置Java源码兼容模式为JDK1.8版本。compileOptions { sourceCompatibility = 1.8 targetCompatibility = 1.8 }添加对象类型文件在开发应用时,可直接将AppGallery Connect控制台上导出的java格式文件添加至本地开发环境,并通过AGConnectCloudDB类中的createObjectType()方法实现对象类型的定义和创建。您在进行本地应用开发时,无需再次创建对象类型。将已在AppGallery Connect控制台上导出的全部java格式文件添加至本地开发环境,如已存在,请覆盖原文件。文件位置:/app/src/main/java/com/huawei/agc/clouddb/quickstart/model。初始化Cloud DB,通过AGConnectCloudDB类中的createObjectType()方法实现对象类型的定义和创建,详细请参见初始化。初始化在添加对象类型文件后,您就可以使用云数据库进行应用开发。您开发应用时,需要先执行初始化操作,初始化对应数据处理位置的AGConnectCloudDB、创建Cloud DB zone和对象类型。通过initialize()方法初始化AGConnectCloudDB。Java:public static void initAGConnectCloudDB(Context context) { AGConnectCloudDB.initialize(context); }Kotlin:fun initAGConnectCloudDB(context: Context?) { AGConnectCloudDB.initialize(context!!) }2. 通过setRoutePolicy设置数据处理位置、buildInstance指定配置生成新的AGConnectInstance实例、getInstance(AGConnectInstance connectInstance, AGConnectAuth auth)方法获取对应数据处理位置的AGConnectCloudDB实例,并使用createObjectType()创建对象类型。Java:AGConnectInstance instance = AGConnectInstance.buildInstance(new AGConnectOptionsBuilder().setRoutePolicy(AGCRoutePolicy.CHINA).build(mContext)); mCloudDB = AGConnectCloudDB.getInstance(instance, AGConnectAuth.getInstance(instance)); mCloudDB.createObjectType(ObjectTypeInfoHelper.getObjectTypeInfo());Kotlin:var instance = AGConnectInstance.buildInstance(AGConnectOptionsBuilder().setRoutePolicy(AGCRoutePolicy.CHINA).build(context)); mCloudDB = AGConnectCloudDB.getInstance(instance, AGConnectAuth.getInstance(instance)) mCloudDB.createObjectType(ObjectTypeInfoHelper.getObjectTypeInfo())3.创建Cloud DB zone配置对象,并打开该Cloud DB zone(以Cloud DB zone的同步属性为缓存模式、访问属性为公共存储区为例),详细请参考CloudDBZoneConfig。Java:mConfig = new CloudDBZoneConfig("QuickStartDemo", CloudDBZoneConfig.CloudDBZoneSyncProperty.CLOUDDBZONE_CLOUD_CACHE, CloudDBZoneConfig.CloudDBZoneAccessProperty.CLOUDDBZONE_PUBLIC); mConfig.setPersistenceEnabled(true); Task<CloudDBZone> openDBZoneTask = mCloudDB.openCloudDBZone2(mConfig, true); openDBZoneTask.addOnSuccessListener(new OnSuccessListener<CloudDBZone>() { @Override public void onSuccess(CloudDBZone cloudDBZone) { Log.i(TAG, "open cloudDBZone success"); mCloudDBZone = cloudDBZone; // Add subscription after opening cloudDBZone success addSubscription(); } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(Exception e) { Log.w(TAG, "open cloudDBZone failed for " + e.getMessage()); } });Kotlin:mConfig = CloudDBZoneConfig("QuickStartDemo", CloudDBZoneConfig.CloudDBZoneSyncProperty.CLOUDDBZONE_CLOUD_CACHE, CloudDBZoneConfig.CloudDBZoneAccessProperty.CLOUDDBZONE_PUBLIC) mConfig!!.persistenceEnabled = true val task = mCloudDB.openCloudDBZone2(mConfig!!, true) task.addOnSuccessListener { Log.i(TAG, "Open cloudDBZone success") mCloudDBZone = it // Add subscription after opening cloudDBZone success addSubscription() }.addOnFailureListener { Log.w(TAG, "Open cloudDBZone failed for " + it.message) }写入数据在本节主要介绍如何在应用程序中进行数据写入操作,以便您了解如何使用Cloud DB SDK实现数据的写入。在应用界面中,增加了“添加”按钮,用于用户新增数据,并在代码中通过executeUpsert()实现数据的写入。Java:public void upsertBookInfos(BookInfo bookInfo) { if (mCloudDBZone == null) { Log.w(TAG, "CloudDBZone is null, try re-open it"); return; } Task<Integer> upsertTask = mCloudDBZone.executeUpsert(bookInfo); upsertTask.addOnSuccessListener(new OnSuccessListener<Integer>() { @Override public void onSuccess(Integer cloudDBZoneResult) { Log.i(TAG, "Upsert " + cloudDBZoneResult + " records"); } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(Exception e) { mUiCallBack.updateUiOnError("Insert book info failed"); } }); }Kotlin:fun upsertBookInfos(bookInfo: BookInfo?) { if (mCloudDBZone == null) { Log.w(TAG, "CloudDBZone is null, try re-open it") return } val upsertTask = mCloudDBZone!!.executeUpsert(bookInfo!!) upsertTask.addOnSuccessListener { cloudDBZoneResult -> Log.i(TAG, "Upsert $cloudDBZoneResult records") }.addOnFailureListener { mUiCallBack.updateUiOnError("Insert book info failed") } }查看数据获取数据变化用户在应用界面中新增的数据,将会被存储在云侧。在端侧注册数据变化侦听器,当云侧数据发生变化时,端侧能够感知数据变化,及时刷新本地应用数据。通过查询条件与subscribeSnapshot()方法组合使用,可以指定侦听对象,当侦听对象的数据发生变化时,端侧会收到通知,根据快照获取变化的数据信息,从云侧同步数据至端侧应用。Java:private OnSnapshotListener<BookInfo> mSnapshotListener = new OnSnapshotListener<BookInfo>() { @Override public void onSnapshot(CloudDBZoneSnapshot<BookInfo> cloudDBZoneSnapshot, AGConnectCloudDBException e) { if (e != null) { Log.w(TAG, "onSnapshot: " + e.getMessage()); return; } CloudDBZoneObjectList<BookInfo> snapshotObjects = cloudDBZoneSnapshot.getSnapshotObjects(); List<BookInfo> bookInfos = new ArrayList<>(); try { if (snapshotObjects != null) { while (snapshotObjects.hasNext()) { BookInfo bookInfo = snapshotObjects.next(); bookInfos.add(bookInfo); updateBookIndex(bookInfo); } } mUiCallBack.onSubscribe(bookInfos); } catch (AGConnectCloudDBException snapshotException) { Log.w(TAG, "onSnapshot:(getObject) " + snapshotException.getMessage()); } finally { cloudDBZoneSnapshot.release(); } } }; public void addSubscription() { if (mCloudDBZone == null) { Log.w(TAG, "CloudDBZone is null, try re-open it"); return; } try { CloudDBZoneQuery<BookInfo> snapshotQuery = CloudDBZoneQuery.where(BookInfo.class) .equalTo(BookEditFields.SHADOW_FLAG, true); mRegister = mCloudDBZone.subscribeSnapshot(snapshotQuery, CloudDBZoneQuery.CloudDBZoneQueryPolicy.POLICY_QUERY_FROM_CLOUD_ONLY, mSnapshotListener); } catch (AGConnectCloudDBException e) { Log.w(TAG, "subscribeSnapshot: " + e.getMessage()); } }Kotlin:private val mSnapshotListener = OnSnapshotListener<BookInfo> { cloudDBZoneSnapshot, e -> if (e != null) { Log.w(TAG, "onSnapshot: " + e.message) return@OnSnapshotListener } val snapshotObjects = cloudDBZoneSnapshot.snapshotObjects val bookInfoList: MutableList<BookInfo> = ArrayList() try { if (snapshotObjects != null) { while (snapshotObjects.hasNext()) { val bookInfo = snapshotObjects.next() bookInfoList.add(bookInfo) updateBookIndex(bookInfo) } } mUiCallBack.onSubscribe(bookInfoList) } catch (snapshotException: AGConnectCloudDBException) { Log.w(TAG, "onSnapshot:(getObject) " + snapshotException.message) } finally { cloudDBZoneSnapshot.release() } } private fun addSubscription() { if (mCloudDBZone == null) { Log.w(TAG, "CloudDBZone is null, try re-open it") return } try { val snapshotQuery = CloudDBZoneQuery.where(BookInfo::class.java) .equalTo(BookEditFields.SHADOW_FLAG, true) mRegister = mCloudDBZone!!.subscribeSnapshot(snapshotQuery, CloudDBZoneQuery.CloudDBZoneQueryPolicy.POLICY_QUERY_FROM_CLOUD_ONLY, mSnapshotListener) } catch (e: AGConnectCloudDBException) { Log.w(TAG, "subscribeSnapshot: " + e.message) } }数据查询和排序在应用界面中,增加了“查询”按钮和排序功能,通过executeQuery()、addOnSuccessListener()和addOnFailureListener()方法组合,实现异步方式查询数据。Java:public void queryBooks(CloudDBZoneQuery<BookInfo> query) { if (mCloudDBZone == null) { Log.w(TAG, "CloudDBZone is null, try re-open it"); return; } Task<CloudDBZoneSnapshot<BookInfo>> queryTask = mCloudDBZone.executeQuery(query, CloudDBZoneQuery.CloudDBZoneQueryPolicy.POLICY_QUERY_FROM_CLOUD_ONLY); queryTask.addOnSuccessListener(new OnSuccessListener<CloudDBZoneSnapshot<BookInfo>>() { @Override public void onSuccess(CloudDBZoneSnapshot<BookInfo> snapshot) { processQueryResult(snapshot); } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(Exception e) { mUiCallBack.updateUiOnError("Query failed"); } }); }Kotlin:fun queryBooks(query: CloudDBZoneQuery<BookInfo>) { if (mCloudDBZone == null) { Log.w(TAG, "CloudDBZone is null, try re-open it") return } val queryTask = mCloudDBZone!!.executeQuery(query, CloudDBZoneQuery.CloudDBZoneQueryPolicy.POLICY_QUERY_FROM_CLOUD_ONLY) queryTask.addOnSuccessListener { snapshot -> processQueryResult(snapshot) } .addOnFailureListener { mUiCallBack.updateUiOnError("Query failed") } }通过查询与limit()方法组合,实现限制查询数据显示条数的功能;与orderByAsc()方法或者orderByDesc()方法组合来实现数据的排序功能。Java:private void queryWithOrder() { invalidateViewInNormalMode(); CloudDBZoneQuery<BookInfo> query = CloudDBZoneQuery.where(BookInfo.class); if (!mQueryInfo.bookName.isEmpty()) { query.contains(BookEditFields.BOOK_NAME, mQueryInfo.bookName); } query.greaterThanOrEqualTo(BookEditFields.PRICE, mQueryInfo.lowestPrice); if (mQueryInfo.lowestPrice != mQueryInfo.highestPrice || mQueryInfo.lowestPrice != 0.0) { query.lessThanOrEqualTo(BookEditFields.PRICE, mQueryInfo.highestPrice); } if (mQueryInfo.showCount > 0) { query.limit(mQueryInfo.showCount); } if (mSortState.state == SortState.State.UP) { query.orderByAsc(mSortState.field); } else { query.orderByDesc(mSortState.field); } mHandler.post(() -> mCloudDBZoneWrapper.queryBooks(query)); }Kotlin:private fun queryWithOrder() { invalidateViewInNormalMode() val query = CloudDBZoneQuery.where(BookInfo::class.java) if (mQueryInfo.bookName!!.isNotEmpty()) { query.contains(BookEditFields.BOOK_NAME, mQueryInfo.bookName!!) } query.greaterThanOrEqualTo(BookEditFields.PRICE, mQueryInfo.lowestPrice) if (mQueryInfo.lowestPrice != mQueryInfo.highestPrice || mQueryInfo.lowestPrice != 0.0) { query.lessThanOrEqualTo(BookEditFields.PRICE, mQueryInfo.highestPrice) } if (mQueryInfo.showCount > 0) { query.limit(mQueryInfo.showCount) } if (mSortState.state == SortState.State.UP) { query.orderByAsc(mSortState.field!!) } else { query.orderByDesc(mSortState.field!!) } mHandler.post { mCloudDBZoneWrapper.queryBooks(query) } }应用编译运行到此,您已经了解了示例应用的开发流程。您可以编译并生成APK包,在Android手机上安装、运行示例应用。如需体验示例应用,您可以在A手机上打开应用,并新增数据;然后您可以在B手机上打开应用,查看在A手机上写入的数据。
-
容器运行的APP是自己编写的libcoap客户端, 获取尾端资源名“t_rsc”,尾端运行的是PLC-ioT软件二次开发指南"提供的尾端APP_demo例子,包含资源/* 设备资源 */static DevResource_s resource_demo[RESOURSENUM] = { {"t_rsc", OBS_MODE_FALSE, {{1, COAP_HandleGetData}, {0, NULL}, {0, NULL}, {0, NULL}}}, {"ob_rsc", OBS_MODE_TURE, {{1, COAP_HandleGetObsData}, {0, NULL}, {0, NULL}, {0, NULL}}},};上述两个resource_demo是由贵司提供的,可执行客户端程序却返回如下:root@huawei:/home# ./clientv:1 t:CON c:GET i:3977 {} [ Uri-Path:t_rsc ]v:1 t:ACK c:4.04 i:3977 {} [ ] :: 'Not Found'请看下什么原因,谢谢!
-
【功能模块】打包功能【操作步骤&问题现象】1、打开qd_nav的APP,进行编译,然后报错,报错提示如下图2、APP并没有用到SmartCampus__queryMenuList,SmartCampus__getCurrentOperatorMenuList这两个脚本,无法解决,请帮忙解决此问题,谢谢3,截图在附件文档中【截图信息】【日志信息】(可选,上传日志内容或者附件)顾庆耀/18068848554/guqingyao@chinasoftinc.com
-
构图的应用自动构图有许多的现实需求,如构图推荐,图像重匹配,缩略图生成。(1) 构图推荐学习基本的构图原则虽然是很简单的,但是也需要大量时间锻炼,对于学习能力较差或者对新事物接受能力较慢的人来说,依然是一个难题。目前在索尼相机和一些摄影类软件产品中会出现一个九宫格来辅助拍摄者进行构图,如果有一款产品能够在拍摄时指导拍摄者进行前后左右移动,相信会非常实用和受欢迎的。(2) 图像重匹配很多的时候,我们需要将一个图像,放到一个尺寸与其不匹配的地方,比如相机拍摄的照片,放置到各种移动设备,这需要改变分辨率、长宽比等,这个问题叫做图像重匹配(Image Retargeting)。在图像重匹配的时候,我们会考虑两个重要因素:(1)原始图像的重要信息必须要保留,重要主体不能被裁剪掉;(2)要保存原始图像的结构信息,如构图风格,并且尽量保证目标比例。(3) 缩略图生成所谓缩略图即缩小尺寸的图片或视频,生成缩略图通常是用于帮助识别和组织它们,在互联网网页中为图像提供与普通文本索引相同的角色。缩略图的生成可以看作是图像重匹配问题的一种,如今在摄影App和视频类App中都广泛用于产生封面缩略图。
-
odp安装:创建odp目录 mkdir /home/work/odp使用wget命令下载然后解压安装(在解压目录下找到bin文件,执行odp_install脚本进行安装)odp配置:1)odp服务器有nginx和lighttped,启动方式:nignxsh webserver/loadnginx.sh startsh webserver/loadnginx.sh stoplighttpedsh webserver/bin/lighttped.sh startsh webserver/bin/lighttped.sh stop2)运行环境php-fpm,启动方式:sh php/sbin/php-fmp startODP框架简单介绍odp全称online develop platform,是在线的业务开发平台,提供了标准的webserver环境,标准的PHP环境,MVC框架,统一业务逻辑和部署结构。odp=linux+nignx/lighttped+mysql+phpODP环境目录结构app:应用程序目录,用于放业务php代码,每个业务一个目录;一个典型的app文件夹目录结构newapp 应用名称+-- action 动作类目录+-- conf 配置目录+-- controllers 控制类目录+-- library 本地类根目录+-- models 数据目录 +-- script 脚本目录+-- Bootstrap.php ap框架引导文件+-- build.sh 打包脚本conf:配置目录,用于存放组件和app配置文件log:存放整个odp环境运行中产生的日志文件名称 用途简介webserver/error_log web访问错误日志webserver/access_log web访问记录,该文件记录了客户端对服务器的所有请求,以及请求处理的结果状态码rpc/rpc-request.log.wf 同上. 此文件包含异常调用的日志rpc/rpc-request.log 所有RPC调用日志会在log/rpc目录下. 此文件包含正常调用的日志数据库,服务调用,子系统交互等日志出现在此目录php/php-fpm.log php-fpm的日志php/php-error.log PHP相关的错误日志newapp/newapp.log.wf 同上. 此文件包含WARNING, FATAL级别日志newapp/newapp.log.dt 同上. 此文件包含DEBUG, TRACE级别日志newapp/newapp.log 每一个app执行时都会在log目录下生成一个以app名字命名的目录. 其中根据日志级别设置 , 可能有有三类常见的日志文件. 此文件包含NOTICE级别日志app代码中输出的日志会出现在此目录php:php安装后所在的目录webserve:服务器安装目录,odp支持的服务器有nignx和lighttpedwebroot:默认的web文档目录,一般的项目入口存放此处,该目录下可以存放静态文件,例如js,css,img等文件data:本地文件数据,存放组件和app生成的本机文件缓存等日志级别错误级别 日志类型fatal error日志warning wf日志trace 普通日志debug dt日志
-
问题出现环境:GDE2.1;问题现象:上传文件(运行态页面上传,如下图1)的用户(管理中心登录用户,如下图2)与下载文件(机器人下载)的用户(执行在线所用机机账号绑定的人机用户,如下图3)不一致,而导致文件下载报错,报错信息见下图4图1图2图3图4问题原因:文件存储模型开启了实例缓存解决方案:关闭该模型实例缓存
-
【操作步骤&问题现象】lxc容器的app,通过appm命令启动时,能否支持指定用户,而非root用户我在容器中新建了一个普通用户,使用appm命令,能否以该用户启动app
-
爽!从来没有进行过,这么so easy的开发.在App Engine,已经实现了,人人都能成为产品经理的愿景.一个App或者网页的开发,一般需要10W,周期一般为1月.而且,从无到有开发能力弱,开发低效,开发资源不足.而且还要管理数据库.这些种种让我对App以及网页开发,望而止步!学习完一门语言,比如说HTML5,CSS,JS需要1个月,在学习几个框架,2个月可以学完,但是学完就能做完整的开发了吗.就是一个大项目,自己完整的做下来.假设项目出来了,要改变功能,或者出了Bug谁去维护,维护需不需要资金呢.一个软件的开发,前端+后端+维护+更新,这一套下来,欲哭无泪了.例如说,一个厂家E2E独立交付,逐个项目做定制典型案例:XX在IOC场景中,逐个项目定制,苦不堪言传统的软件开发是神圣的,对普通人,农民,高中生,创客,是高高在上的.而App Engine把它拉下了神坛.在App Engine中,组件库和AI辅助让前端开发更为高效,流程编排引擎加速了应用的构建.支持云上云下协同快速开发部署,在线测试,在线发布,在线升级.一个账户就可以快速开发,平台+资质可规模复制,效率大规模提升.
-
【功能模块】【操作步骤&问题现象】1、有没有像sys.invokeSimpleBO函数调用BO的接口 这样的函数调用 APP提供的接口2、使用client请求接口,在生产环境下的域名是多少?【截图信息】【日志信息】(可选,上传日志内容或者附件)
-
【截图信息】【操作步骤&问题现象】1、上述是华为云物联网平台设备管理界面,里面有一个设备命令下发的功能,比如控制路灯的开和关2、我想通过安卓app实现这一操作,不知是否可行。如果可行的话,又该怎么做呢?也是调用api吗?
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签