有没有办法从QML中的资源加载sqlite数据库?

时间:2016-03-25 19:09:08

标签: javascript qt sqlite qml

我使用数据库浏览器做了数据库,我真的很喜欢它,但我不知道如何在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);

它不起作用,为什么?

1 个答案:

答案 0 :(得分:0)

据我所知,目前尚未在QML中公开过。

要部署自己的持久性Db,您可以使用sql模块中提供的C ++ API(在.pro文件中添加QT += sql)。 您将在QtCreator中找到有关如何使用它的几个示例。另外,请确保在使用之前阅读文档。

请注意,如果将其添加到资源中,它只能是可读的 如果你想让它可写,你应该:

  1. 在.pro文件
  2. 中提供其他一些机制(特定于平台)
  3. 将代码添加到您的应用程序以将dB移动到特定于平台的可写位置
  4. 以下是.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,可能是通过模型。