1

我正在开发一个小型 QtQuick 2.0 项目并使用离线存储 API 访问本地 sqlite 数据库。这是我连接到数据库的方式:

LocalStorage.openDatabaseSync("myDatabase", "1.0", "description", 50000000)

事实证明,该myDatabase文件应存储在预定义的位置:~/.local/share/Nokia/QtQmlViewer/QML/OfflineStorage/Databases/

我的问题是,如何将此默认路径更改为保存 db 文件的项目文件夹路径?我查了一下,只能获得用于为数据库设置自定义位置的 C++ 函数

void setOfflineStoragePath (const QString & dir)

如何从 Javascript 为这个单一应用程序设置自定义数据库文件夹路径?这甚至可能吗?

4

2 回答 2

1

从纯 QML 应用程序设置离线存储路径是不可能的,因为没有QDeclarativeEngind::setOfflineStoragePath可用的等价物。

您可以为 QML 提供额外的 C++ 功能,请参阅此处如何操作。但是,如果您在应用程序中引入 C++ 部分,您可以轻松地从那里首先设置存储路径。

于 2013-01-08T15:13:14.293 回答
0

好吧,我知道这是很久以前的事了……但是,作为参考,我会发布我的解决方案。

我在 AppDataStorage 和 OfflineStorage 之间遇到了同样的问题和很多困惑。

在 Main.cpp

  QQmlEngine qqEngine; //Creates an engine to fetch the OfflineStoragePath
 const QString dataFolder = qqEngine.offlineStoragePath(); 
 //Sets the Database folder
 QDir dir(dataFolder+"/Databases");

if (!dir.exists()) {
    dir.mkpath(".");
}
//Encrypt the database name with MD5, default from Qt
QString new_name = QString(QCryptographicHash::hash(("DatabaseName"),QCryptographicHash::Md5).toHex());
//Pick the source DB to be copied to the new location with the MD5 name
QFile file(":/DatabaseName.sqlite");
file.copy(dataFolder+"/Databases/" + new_name + ".sqlite");
file.close();
//The Sqslite must have a ini file with the database version and metadata in the same folder, so we also copy this file
QFile fileIni(":/databaseName.ini");
fileIni.copy(dataFolder+"/Databases/" + new_name + ".ini");
fileIni.close();

这对我来说就像一个魅力。我希望这可以帮助别人。

一个示例 Ini 文件:

[一般的]

描述=测试数据库

驱动程序=QSQLITE

估计大小=1000000

名称=TestDB

版本=1.0

于 2019-09-18T17:13:39.873 回答