我使用数据库浏览器做了数据库,我真的很喜欢它,但我不知道如何在QML中加载它,我知道如何在appdata / local / appname / qml / db创建带有表的新数据库,但是我不知道如何从资源加载我的数据库,有人能告诉我吗?我才发现它:
var db = LocalStorage.openDatabaseSync("QQmlExampleDB", "1.0", "The Example QML SQL!", 1000000);
它正在工作,但如果我想加载我的数据库
var db = LocalStorage.openDatabaseSync("food.db", "1.0", "The Example QML SQL!", 1000000);
它不起作用,为什么?
答案 0 :(得分:0)
据我所知,目前尚未在QML中公开过。
要部署自己的持久性Db,您可以使用sql
模块中提供的C ++ API(在.pro文件中添加QT += sql
)。
您将在QtCreator中找到有关如何使用它的几个示例。另外,请确保在使用之前阅读文档。
请注意,如果将其添加到资源中,它只能是可读的 如果你想让它可写,你应该:
以下是.pro文件中包含的内容示例:
georecords.files = sestosg.sqlite
georecords.path = "./"
macx {
georecords.path = "Contents/MacOS"
}
android {
georecords.path = "/assets"
}
QMAKE_BUNDLE_DATA += georecords
INSTALLS += georecords
然后在您的应用程序中,您应该管理有关复制数据库的时间和位置的条件,例如:根据以下示例。确保导入相关标头。这支持OSX,Android和iOS。其他平台可能有不同的要求。
QString dbName = "sestosg.sqlite";
// determine source path
QString dbSourcePath = QSysInfo::productType() == "android" ?
"assets:/" + dbName :
QDir(QCoreApplication::applicationDirPath()).filePath(dbName);
QFileInfo dbSourceInfo(dbSourcePath);
// determine destination path
QDir writableLocation(QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation));
if (!writableLocation.exists()) {
writableLocation.mkpath(".");
}
QString dbDestPath = writableLocation.filePath(dbName);
QFileInfo dbDestInfo(dbDestPath);
// determine if the source db has changed
bool dbSourceUpdated = dbSourceInfo.lastModified() > dbDestInfo.lastModified();
// copy or replace db if needed
if ((!dbDestInfo.exists()) || dbSourceUpdated) {
QFile::remove(dbDestPath);
if (!QFile::copy(dbSourcePath, dbDestPath)) {
qCritical() << "ERROR: source db " << dbSourcePath << " not copied to "<< dbDestPath;
return false;
} else {
qDebug() << "db successfully copied or replaced to " << dbDestPath;
}
} else {
qDebug() << "dest db " << dbDestPath << " already exists";
}
// make db writable
QFile::setPermissions(dbDestPath, QFile::WriteOwner | QFile::ReadOwner);
qDebug() << "current db: " << m_dbPath;
最后,您需要创建一个类,其中包含从db连接/读/写的方法,并将其作为实例或组件公开给QML,可能是通过模型。