I want to create o point feature and add string value to string attribute (ex:"description") in offline status and then sync to server.In my example I can create point feature and I give value to "description" attribute and then I give parameter in addFeature( ).In online mode my new point feature geometry created but my "description" attribute value is empty.How can I record my attribute value(ex:"Hi").?My code is below:
Thanks.
// Copyright 2014 ESRI
//
// All rights reserved under the copyright laws of the United States
// and applicable international laws, treaties, and conventions.
//
// You may freely redistribute and use this sample code, with or
// without modification, provided you include the original copyright
// notice and use restrictions.
//
// See the Sample code usage restrictions document for further information.
//
import QtQuick 2.2
import QtQuick.Controls 1.2
import ArcGIS.Runtime 10.3
import ArcGIS.Extras 1.0
ApplicationWindow {
id: appWindow
width: 800
height: 600
title: "OfflineTest"
property double scaleFactor: System.displayScaleFactor
property int fontSize: 15 * scaleFactor
property bool isOnline: true
property string featuresUrl: "http://sampleserver6.arcgisonline.com/arcgis/rest/services/Sync/WildfireSync/FeatureServer"
property string gdbPath: "~/ArcGIS/Runtime/Data/Test/offlineSample.geodatabase"
property var selectedFeatureId: null
Envelope {
id: sfExtent
xMin: -13643665.582273144
yMin: 4533030.152110769
xMax: -13618899.985108782
yMax: 4554203.2089457335
}
Map {
id: mainMap
anchors {
left: parent.left
top: parent.top
right: parent.right
bottom: msgRow.top
}
extent: sfExtent
ArcGISTiledMapServiceLayer
{
url: "http://services.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Light_Gray_Base/MapServer"
}
FeatureLayer {
id: onlineLayer
featureTable: featureServiceTable
Component.onCompleted: {
renderer = onlineRenderer
}
}
FeatureLayer {
id: offLineLayer
featureTable: GeodatabaseFeatureTable {
geodatabase: gdb.valid ? gdb : null
featureServiceLayerId: 0
}
selectionColor: "cyan"
}
onMouseClicked: {
var featureJson = {
geometry: {
x: mouse.mapX,
y: mouse.mapY,
spatialReference: mouse.mapPoint.spatialReference
},
attributes:
{
description: "Hi"
}
}
var feature = offLineLayer.featureTable.addFeature(featureJson);
syncButton.enabled = true;
statusText.text = "Tap on Sync to update the Feature Service with the edits";
}
}
SimpleRenderer {
id: onlineRenderer
symbol: SimpleMarkerSymbol {
style: Enums.SimpleMarkerSymbolStyleCircle
color: "red"
size: 7
}
}
GeodatabaseFeatureServiceTable {
id: featureServiceTable
url: featuresUrl + "/0"
}
ServiceInfoTask {
id: serviceInfoTask
url: featuresUrl
onFeatureServiceInfoStatusChanged: {
if (featureServiceInfoStatus === ServiceInfoTask.FeatureServiceInfoComplete) {
statusText.text = "Service info received";
generateButton.enabled = true;
} else if (featureServiceInfoStatus === ServiceInfoTask.featureServiceInfoError) {
statusText.text = "Error:" + errorString;
generateButton.enabled = false;
cancelButton.text = "Start Over";
}
}
}
Feature {
id: featureToEdit
}
Point {
id: newPoint
spatialReference: mainMap.spatialReference
}
Rectangle {
anchors {
fill: controlsColumn
margins: -10 * scaleFactor
}
color: "lightgrey"
radius: 5 * scaleFactor
border.color: "black"
opacity: 0.77
}
Column {
id: controlsColumn
anchors {
left: parent.left
top: parent.top
margins: 20 * scaleFactor
}
spacing: 7
Button {
text: "Generate Geodatabase"
id: generateButton
enabled: false
onClicked: {
generateGeodatabaseParameters.initialize(serviceInfoTask.featureServiceInfo);
generateGeodatabaseParameters.extent = mainMap.extent;
generateGeodatabaseParameters.returnAttachments = true;
statusText.text = "Starting generate geodatabase task";
geodatabaseSyncTask.generateGeodatabase(generateGeodatabaseParameters, gdbPath);
busyIndicator.visible = true;
}
}
Button {
id: syncButton
text: "Sync"
width: generateButton.width
enabled: false
onClicked: {
enabled = false;
geodatabaseSyncTask.syncGeodatabase(gdb.syncGeodatabaseParameters, gdb);
busyIndicator.visible = true;
statusText.text = "Starting sync task";
}
}
Button {
id: cancelButton
text: "Cancel"
width: generateButton.width
enabled: false
onClicked: {
geodatabaseSyncTask.cancelJob(syncStatusInfo);
enabled = false;
text = "Cancel";
}
}
Row {
id: toggleOnlineOffline
spacing: 10
Text {
id: onlineStatus
text: appWindow.isOnline ? " Online " : " Offline "
color: "black"
}
Switch {
id: switchToggle
checked: appWindow.isOnline
enabled: false
onCheckedChanged: {
appWindow.isOnline = checked;
if (checked === true && Enums.GenerateStatusCompleted)
statusText.text = "Switch to Offline Mode to continue editing.";
else if (checked === false && Enums.GenerateStatusCompleted)
statusText.text = "Select a feature.";
}
}
}
}
Geodatabase {
id: gdb
path: geodatabaseSyncTask.geodatabasePath
onValidChanged: {
if (valid) {
var gdbtables = gdb.geodatabaseFeatureTables;
for(var i in gdbtables) {
console.log (gdbtables.featureServiceLayerName);
}
}
}
}
GeodatabaseSyncStatusInfo {
id: syncStatusInfo
}
GeodatabaseSyncTask {
id: geodatabaseSyncTask
url: featuresUrl
onGenerateStatusChanged: {
statusText.text = generateStatus;
if (generateStatus === GeodatabaseSyncTask.GenerateComplete) {
statusText.text = geodatabasePath;
cancelButton.enabled = false;
isOnline = false;
busyIndicator.visible = false;
generateButton.enabled = false;
} else if (generateStatus === GeodatabaseSyncTask.GenerateError) {
statusText.text = "Error: " + generateGeodatabaseError.message + " Code= " + generateGeodatabaseError.code.toString() + " " + generateGeodatabaseError.details;
generateButton.enabled = false;
cancelButton.text = "Start Over";
}
}
onGeodatabaseSyncStatusInfoChanged: {
if (geodatabaseSyncStatusInfo.status === Enums.GeodatabaseStatusUploadingDelta) {
var deltaProgress = geodatabaseSyncStatusInfo.deltaUploadProgress/1000;
var deltaSize = geodatabaseSyncStatusInfo.deltaSize/1000;
statusText.text = geodatabaseSyncStatusInfo.statusString + " " + String(deltaProgress) + " of " + String(deltaSize) + " KBs...";
} else
statusText.text = geodatabaseSyncStatusInfo.statusString + " " + geodatabaseSyncStatusInfo.lastUpdatedTime.toString() + " " + geodatabaseSyncStatusInfo.jobId.toString();
if (geodatabaseSyncStatusInfo.status !== GeodatabaseSyncStatusInfo.Cancelled)
cancelButton.enabled = true;
syncStatusInfo.json = geodatabaseSyncStatusInfo.json;
}
onSyncStatusChanged: {
featureServiceTable.applyFeatureEdits();
featureServiceTable.refreshFeatures();
if (syncStatus === GeodatabaseSyncTask.SyncComplete) {
cancelButton.enabled = false;
syncButton.enabled = false;
statusText.text = "Sync completed."
busyIndicator.visible = false;
switchToggle.enabled = true;
var errorString = "";
for (var j = 0; j < syncErrors.featureEditErrors.length; j++) {
var error = syncErrors.featureEditErrors;
errorString += "\nLayer Id: " + error.layerId + "\nObject Id: " + error.objectId + "\nGlobal Id: " + error.globalId + "\nEdit operation: " + error.editOperationString + "\nError: " + error.error.description;
}
}
if (syncStatus === GeodatabaseSyncTask.SyncError)
statusText.text = "Error: " + syncGeodatabaseError.message + " Code= " + syncGeodatabaseError.code.toString() + " " + syncGeodatabaseError.details;
}
}
GenerateGeodatabaseParameters {
id: generateGeodatabaseParameters
}
Rectangle {
anchors {
fill: msgRow
leftMargin: -10 * scaleFactor
}
color: "lightgrey"
border.color: "black"
opacity: 0.77
}
Row {
id: msgRow
anchors {
bottom: parent.bottom
left: parent.left
leftMargin: 10 * scaleFactor
right: parent.right
}
spacing: 10 * scaleFactor
BusyIndicator {
id: busyIndicator
anchors.verticalCenter: parent.verticalCenter
enabled: false
visible: enabled
height: (parent.height * 0.5) * scaleFactor
width: height * scaleFactor
}
Text {
id: statusText
anchors.bottom: parent.bottom
width: parent.width
wrapMode: Text.WordWrap
font.pixelSize: fontSize
}
}
Rectangle {
anchors.fill: parent
color: "transparent"
border {
width: 0.5 * scaleFactor
color: "black"
}
}
Component.onCompleted: {
statusText.text = "Getting service info";
serviceInfoTask.fetchFeatureServiceInfo();
}
}