diff --git a/src/core/qgsmaplayer.cpp b/src/core/qgsmaplayer.cpp index 450250bbe104..f86b8ef6fe61 100644 --- a/src/core/qgsmaplayer.cpp +++ b/src/core/qgsmaplayer.cpp @@ -46,6 +46,7 @@ #include "qgsrasterlayer.h" #include "qgsrectangle.h" #include "qgsvectorlayer.h" +#include "qgsvectordataprovider.h" QgsMapLayer::QgsMapLayer( QgsMapLayer::LayerType type, @@ -569,6 +570,11 @@ bool QgsMapLayer::writeLayerXML( QDomElement& layerElement, QDomDocument& docume urlDest.setQueryItems( urlSource.queryItems() ); src = QString::fromAscii( urlDest.toEncoded() ); } + else if ( vlayer && vlayer->providerType() == "memory" ) + { + // Refetch the source from the provider, because adding fields actually changes the source for this provider. + src = vlayer->dataProvider()->dataSourceUri(); + } else { bool handled = false; diff --git a/tests/src/python/test_provider_memory.py b/tests/src/python/test_provider_memory.py index 2e43162bcb68..645a971fda26 100644 --- a/tests/src/python/test_provider_memory.py +++ b/tests/src/python/test_provider_memory.py @@ -17,7 +17,7 @@ import shutil import glob -from qgis.core import QGis, QgsField, QgsPoint, QgsVectorLayer, QgsFeatureRequest, QgsFeature, QgsProviderRegistry, \ +from qgis.core import QGis, QgsField, QgsPoint, QgsMapLayer, QgsVectorLayer, QgsFeatureRequest, QgsFeature, QgsProviderRegistry, \ QgsGeometry, NULL from PyQt4.QtCore import QSettings from utilities import (unitTestDataPath, @@ -171,6 +171,39 @@ def testFromUri(self): myProvider = myMemoryLayer.dataProvider() assert myProvider is not None + def testSaveFields(self): + # Create a new memory layer with no fields + myMemoryLayer = QgsVectorLayer( + ('Point?crs=epsg:4326&index=yes'), + 'test', + 'memory') + + # Add some fields to the layer + myFields = [QgsField('TestInt', QVariant.Int, 'integer', 2, 0), + QgsField('TestDbl', QVariant.Double, 'double', 8, 6), + QgsField('TestString', QVariant.String, 'string', 50, 0)] + assert myMemoryLayer.startEditing() + for f in myFields: + assert myMemoryLayer.addAttribute(f) + assert myMemoryLayer.commitChanges() + myMemoryLayer.updateFields() + + # Export the layer to a layer-definition-XML + qlr = QgsMapLayer.asLayerDefinition([myMemoryLayer]) + assert qlr is not None + + # Import the layer from the layer-definition-XML + layers = QgsMapLayer.fromLayerDefinition(qlr) + assert layers is not None + myImportedLayer = layers[0] + assert myImportedLayer is not None + + # Check for the presence of the fields + importedFields = myImportedLayer.fields() + assert importedFields is not None + for f in myFields: + assert f == importedFields.field(f.name()) + if __name__ == '__main__': unittest.main()