diff --git a/src/imports/localstorage/plugin.cpp b/src/imports/localstorage/plugin.cpp
index 4f08e71fd02a0bbb951ae688166b6e27b866479b..ac007f2849980a2f7343e4a34fb094afd1ee5788 100644
--- a/src/imports/localstorage/plugin.cpp
+++ b/src/imports/localstorage/plugin.cpp
@@ -567,6 +567,9 @@ void QQuickLocalStorage::openDatabaseSync(QQmlV8Function *args)
 {
 #ifndef QT_NO_SETTINGS
     QV8Engine *engine = args->engine();
+    if (engine->engine()->offlineStoragePath().isEmpty())
+        V8THROW_SQL_VOID(SQLEXCEPTION_DATABASE_ERR, QQmlEngine::tr("SQL: can't create database, offline storage is disabled."));
+
     qmlsqldatabase_initDatabasesPath(engine);
 
     QSqlDatabase database;
diff --git a/src/qml/qml/qqmlengine.cpp b/src/qml/qml/qqmlengine.cpp
index 82eeb917abfd745ccc0926006371cfbc5d368f40..aee9c5c1a1f45625b63c4fb867e8176f0f2113db 100644
--- a/src/qml/qml/qqmlengine.cpp
+++ b/src/qml/qml/qqmlengine.cpp
@@ -512,9 +512,10 @@ void QQmlEnginePrivate::init()
     }
 
     QString dataLocation = QStandardPaths::writableLocation(QStandardPaths::DataLocation);
-    offlineStoragePath = dataLocation.replace(QLatin1Char('/'), QDir::separator()) +
-                         QDir::separator() + QLatin1String("QML") +
-                         QDir::separator() + QLatin1String("OfflineStorage");
+    if (!dataLocation.isEmpty())
+        offlineStoragePath = dataLocation.replace(QLatin1Char('/'), QDir::separator())
+                           + QDir::separator() + QLatin1String("QML")
+                           + QDir::separator() + QLatin1String("OfflineStorage");
 }
 
 QQuickWorkerScriptEngine *QQmlEnginePrivate::getWorkerScriptEngine()
diff --git a/tests/auto/qml/qqmlengine/tst_qqmlengine.cpp b/tests/auto/qml/qqmlengine/tst_qqmlengine.cpp
index 89fc8e05d9ab72bfb0a8ef8bddd8ab65ab0ec029..c039429f485323f87ec0448d6bf8afaa5a2fc0e0 100644
--- a/tests/auto/qml/qqmlengine/tst_qqmlengine.cpp
+++ b/tests/auto/qml/qqmlengine/tst_qqmlengine.cpp
@@ -177,7 +177,11 @@ void tst_qqmlengine::offlineStoragePath()
 
     QQmlEngine engine;
 
-    QDir dir(QStandardPaths::writableLocation(QStandardPaths::DataLocation));
+    QString dataLocation = QStandardPaths::writableLocation(QStandardPaths::DataLocation);
+
+    QCOMPARE(dataLocation.isEmpty(), engine.offlineStoragePath().isEmpty());
+
+    QDir dir(dataLocation);
     dir.mkpath("QML");
     dir.cd("QML");
     dir.mkpath("OfflineStorage");
diff --git a/tests/auto/qml/qqmlsqldatabase/tst_qqmlsqldatabase.cpp b/tests/auto/qml/qqmlsqldatabase/tst_qqmlsqldatabase.cpp
index c1a8a63a4d48c0c5ed91aaac43b307dd8894faf7..04fc5e1c7c8030421254b304f6682a0636f565f1 100644
--- a/tests/auto/qml/qqmlsqldatabase/tst_qqmlsqldatabase.cpp
+++ b/tests/auto/qml/qqmlsqldatabase/tst_qqmlsqldatabase.cpp
@@ -104,6 +104,8 @@ void removeRecursive(const QString& dirname)
 
 void tst_qqmlsqldatabase::initTestCase()
 {
+    if (engine->offlineStoragePath().isEmpty())
+        QSKIP("offlineStoragePath is empty, skip this test.");
     QQmlDataTest::initTestCase();
     removeRecursive(dbDir());
     QDir().mkpath(dbDir());
@@ -111,6 +113,8 @@ void tst_qqmlsqldatabase::initTestCase()
 
 void tst_qqmlsqldatabase::cleanupTestCase()
 {
+    if (engine->offlineStoragePath().isEmpty())
+        QSKIP("offlineStoragePath is empty, skip this test.");
     removeRecursive(dbDir());
 }
 
@@ -123,6 +127,9 @@ QString tst_qqmlsqldatabase::dbDir() const
 
 void tst_qqmlsqldatabase::checkDatabasePath()
 {
+    if (engine->offlineStoragePath().isEmpty())
+        QSKIP("offlineStoragePath is empty, skip this test.");
+
     // Check default storage path (we can't use it since we don't want to mess with user's data)
     QVERIFY(engine->offlineStoragePath().contains("tst_qqmlsqldatabase"));
     QVERIFY(engine->offlineStoragePath().contains("OfflineStorage"));
@@ -193,6 +200,9 @@ void tst_qqmlsqldatabase::validateAgainstWebkit()
 
 void tst_qqmlsqldatabase::testQml()
 {
+    if (engine->offlineStoragePath().isEmpty())
+        QSKIP("offlineStoragePath is empty, skip this test.");
+
     // Tests QML SQL Database support with tests
     // that have been validated against Webkit.
     //
@@ -222,6 +232,9 @@ void tst_qqmlsqldatabase::testQml_cleanopen_data()
 
 void tst_qqmlsqldatabase::testQml_cleanopen()
 {
+    if (engine->offlineStoragePath().isEmpty())
+        QSKIP("offlineStoragePath is empty, skip this test.");
+
     // Same as testQml, but clean connections between tests,
     // making it more like the tests are running in new processes.
     testQml();
@@ -235,6 +248,9 @@ void tst_qqmlsqldatabase::testQml_cleanopen()
 
 void tst_qqmlsqldatabase::totalDatabases()
 {
+    if (engine->offlineStoragePath().isEmpty())
+        QSKIP("offlineStoragePath is empty, skip this test.");
+
     QCOMPARE(QDir(dbDir()+"/Databases").entryInfoList(QDir::Files|QDir::NoDotAndDotDot).count(), total_databases_created_by_tests*2);
 }