| 版本名称 | 集成环境 | 测试设备 |
|---|---|---|
| agconnect-database:1.2.3.301 | Unity 2019.4.17f1c1 | 荣耀magic2 OPPO Reno2 |
3、导入HuaweiServices的Package包:
在Assect Store中搜索Huawei Services, 找到AGC的包,然后点击Import,导入相应的包。
在存储区页面,点击新增,新增一个名为QuickStartDemo的存储区
3、服务开通以后,回到项目设置界面,下载最新的json文件。在我的项目-项目设置-常规-应用下,点击agconnect-services.json下载
将刚下载好json文件,放到Unity项目Assets / Plugins / Android目录下:
2、在Other Setting中配置包名:注意需要和AG官网的包名保持一致:
3、配置项目级gradle,此处对应Assets\Plugins\Android路径下的baseProjectTmeplate.gradle文件,添加如下内容
allprojects {
buildscript {
repositories {
maven { url 'https://developer.huawei.com/repo/' }
}
}
dependencies {
classpath 'com.android.tools.build:gradle:3.4.0'
classpath 'com.huawei.agconnect:agcp:1.4.2.301'
**BUILD_SCRIPT_DEPS**
}
}
repositories {
maven { url 'https://developer.huawei.com/repo/' }
}
}
4、配置应用级gradle,此处对应Assets\Plugins\Android路径下的LauncherTmeplate.gradle文件,添加如下内容:
apply plugin: 'com.android.application'
apply plugin: 'com.huawei.agconnect'
dependencies {
implementation project(':unityLibrary')
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.huawei.agconnect:agconnect-core:1.2.0.300'
implementation "com.huawei.agconnect:agconnect-database:1.2.3.301"
}
5、回到AGC界面,导出对象类型文件:
1、点击“导出”,选择json,将json文件导出到Unity项目Assets / Plugins / Android目录下
2、点击“导出”,选择java,选择“Android”,配置包名,将zip文件导出并且解压到Unity项目Assets / Plugins / Android目录下
6、生成CloudDB文件:
在Unity中,点击菜单栏的CloudDB Kit - > CloudDB Settting 相应的配置如下:
1、 JavaCode Package Name:配置导出java文件时配置的包名
2、 ObjectType JsonFile Path:选择对应导出的json文件:例如我的路径为‘Assets/Plugins/Andriod/model.json’
3、 Namespace:生成的C# 文件所用的namespace
4、 Export Path:导出的C# 文件的存放路径
using System;
using System.Collections;
using UnityEngine;
using HuaweiService;
using HuaweiService.CloudDB;
using HuaweiService.Auth;
using HuaweiServiceDemo;
public class testDBDemo : MonoBehaviour
{
private static AGConnectCloudDB mCloudDB;
private static CloudDBZone mCloudDBZone;
private static CloudDBZoneConfig mConfig;
private static CloudDBZoneQuery mQuery;
private const string mClouudDBZoneName = "QuickStartDemo";
private const string bookInfoClass = "com.huawei.agc.clouddb.quickstart.model.BookInfo";
private const string testAllClass = "com.huawei.agc.clouddb.quickstart.model.TestAll";
private static CloudDBZoneObjectList<BookInfo> mObjectList = new CloudDBZoneObjectList<BookInfo> ();
// 成功回调
public delegate void SuccessCallBack<T>(T o);
public class HmsSuccessListener<T>:OnSuccessListener{
public SuccessCallBack<T> CallBack;
public HmsSuccessListener(SuccessCallBack<T> c){
CallBack = c;
}
public void onSuccess(T arg0)
{
Debug.Log("OnSuccessListener onSuccess");
if(CallBack != null)
{
CallBack.Invoke(arg0);
}
}
public override void onSuccess(AndroidJavaObject arg0){
Debug.Log("OnSuccessListener onSuccess");
if(CallBack !=null)
{
Type type = typeof(T);
IHmsBase ret = (IHmsBase)Activator.CreateInstance(type);
ret.obj = arg0;
CallBack.Invoke((T)ret);
}
}
}
// 失败回调
public delegate void FailureCallBack(HuaweiService.Exception e);
public class HmsFailureListener : OnFailureListener
{
public FailureCallBack CallBack;
public HmsFailureListener(FailureCallBack c)
{
CallBack = c;
}
public override void onFailure(HuaweiService.Exception arg0)
{
if (CallBack != null)
{
CallBack.Invoke(arg0);
}
}
}
// Start is called before the first frame update
void Start()
{
login();
}
// Update is called once per frame
void Update()
{
}
}
public void login()
{
AGConnectAuth auth = AGConnectAuth.getInstance();
auth.signInAnonymously().addOnSuccessListener(new HuaweiOnsuccessListener<SignInResult>((signresult) =>
{
Debug.Log("sign in successfully." + signresult.getUser().getUid());
})).addOnFailureListener(new HuaweiOnFailureListener((e) =>
{
Debug.Log("sign in failed");
}));
}
public void CreateObjectType()
{
AGConnectCloudDB.initialize(new Context());
mCloudDB = AGConnectCloudDB.getInstance();
Debug.Log("CloudDBInstance: " + mCloudDB);
try
{
mCloudDB.createObjectType(ObjectTypeInfoHelper.getObjectTypeInfo());
Debug.Log("createObjectType:" + mCloudDB );
}
catch (System.Exception e)
{
Debug.Log("createObjectType: " + e.Message);
}
}
public void OpenCloudDBZone()
{
// Debug.Log("Start OpenCloudDBZone:" + mCloudDB );
mConfig = new CloudDBZoneConfig("QuickStartDemo",
CloudDBZoneConfig.CloudDBZoneSyncProperty.CLOUDDBZONE_CLOUD_CACHE,
CloudDBZoneConfig.CloudDBZoneAccessProperty.CLOUDDBZONE_PUBLIC);
mConfig.setPersistenceEnabled(true);
Task openDBZoneTask = mCloudDB.openCloudDBZone2(mConfig, true);
openDBZoneTask.addOnSuccessListener(new HmsSuccessListener<CloudDBZone>((cloudDBZone) =>
{
mCloudDBZone = cloudDBZone;
Debug.Log("open clouddbzone2 success");
}))
.addOnFailureListener(new HmsFailureListener((HuaweiService.Exception e) =>
{
Debug.Log("open clouddbzone2 failed " + e.toString());
}));
}
public void upsertBookInfo(){
if (mCloudDBZone == null)
{
Debug.Log("CloudDBZone is null, try re-open it");
return;
}
var bookInfo = new BookInfo { Id = 4, BookName = "test4" };
Task task = mCloudDBZone.executeUpsert(bookInfo);
task.addOnSuccessListener(new HmsSuccessListener<int>((cloudDBZoneResult) =>
{
Debug.Log("upsert " + cloudDBZoneResult + " records");
}))
public void testQueryInfo () {
mQuery = CloudDBZoneQuery.where (new AndroidJavaClass (bookInfoClass)).equalTo ("shadowFlag", true);
if (mCloudDBZone == null || mQuery == null) {
Debug.Log("CloudDBZone or CloudDBZoneQuery is null, try re-open it");
return;
}
Task queryTask = mCloudDBZone.executeQuery (mQuery, CloudDBZoneQuery.CloudDBZoneQueryPolicy.POLICY_QUERY_FROM_CLOUD_ONLY);
queryTask.addOnSuccessListener (new HmsSuccessListener<CloudDBZoneSnapshot<BookInfo>> ((snapshot) => {
processQueryResult (snapshot);
}))
.addOnFailureListener (new HmsFailureListener ((exception) => {
Debug.Log ("Query book list from cloud failed: " + exception.toString ());
}));
}
private void processQueryResult (CloudDBZoneSnapshot<BookInfo> snapshot) {
mObjectList = snapshot.getSnapshotObjects ();
List<BookInfo> bookInfoList = new List<BookInfo> ();
try {
string result = "";
while (mObjectList.hasNext ()) {
BookInfo bookInfo = mObjectList.next ();
bookInfoList.add (bookInfo);
result += $"{bookInfo.BookName} ";
}
Debug.Log ($"QueryResult: {result}");
} catch (System.Exception e) {
Debug.Log ($"QueryResult : {e.Message}");
} finally {
snapshot.release ();
}
}
其中,插入和删除数据都可以在AGC界面查看到。
欲了解更多详情,可参考:
云数据库Demo:https://github.com/AppGalleryConnect/agc-demos/tree/main/Android/agc-clouddb-demo-java
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru
在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo
我在app/helpers/sessions_helper.rb中有一个帮助程序文件,其中包含一个方法my_preference,它返回当前登录用户的首选项。我想在集成测试中访问该方法。例如,这样我就可以在测试中使用getuser_path(my_preference)。在其他帖子中,我读到这可以通过在测试文件中包含requiresessions_helper来实现,但我仍然收到错误NameError:undefinedlocalvariableormethod'my_preference'.我做错了什么?require'test_helper'require'sessions_hel
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
我一直很高兴地使用DelayedJob习惯用法:foo.send_later(:bar)这会调用DelayedJob进程中对象foo的方法bar。我一直在使用DaemonSpawn在我的服务器上启动DelayedJob进程。但是...如果foo抛出异常,Hoptoad不会捕获它。这是任何这些包中的错误...还是我需要更改某些配置...或者我是否需要在DS或DJ中插入一些异常处理来调用Hoptoad通知程序?回应下面的第一条评论。classDelayedJobWorker 最佳答案 尝试monkeypatchingDelayed::W
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
您如何在Rails中的实时服务器上进行有效调试,无论是在测试版/生产服务器上?我试过直接在服务器上修改文件,然后重启应用,但是修改好像没有生效,或者需要很长时间(缓存?)我也试过在本地做“脚本/服务器生产”,但是那很慢另一种选择是编码和部署,但效率很低。有人对他们如何有效地做到这一点有任何见解吗? 最佳答案 我会回答你的问题,即使我不同意这种热修补服务器代码的方式:)首先,你真的确定你已经重启了服务器吗?您可以通过跟踪日志文件来检查它。您更改的代码显示的View可能会被缓存。缓存页面位于tmp/cache文件夹下。您可以尝试手动删除