2016-03-25 4 views
0

Ich habe Datenbanken mit DB Browser, ich genieße es wirklich, aber ich weiß nicht, wie man es in QML, ich weiß, wie neue db mit Tabelle bei appdata/local/appname/qml/db erstellen, aber ich don weiß nicht, wie ich meine db aus ressourcen laden kann, kann mir jemand sagen? Ich fand es nur:Gibt es Möglichkeit, sqlite Datenbank von Ressource in QML zu laden?

var db = LocalStorage.openDatabaseSync("QQmlExampleDB", "1.0", "The Example QML SQL!", 1000000); 

und es funktioniert, aber wenn ich möchte, dass mein db

var db = LocalStorage.openDatabaseSync("food.db", "1.0", "The Example QML SQL!", 1000000); 

Es funktioniert nicht, warum laden?

+0

Verwenden Sie eigentlich * sowohl * C++ als auch Javascript? –

+0

Ja. QML, C++ und JS (in demselben Projekt) –

+0

Und der Code, den Sie schreiben möchten, ist was? –

Antwort

0

Soweit ich weiß, ist dies derzeit in QML noch nicht bekannt.

Für die Bereitstellung Ihres eigenen persistenten Db können Sie die C++ - API verwenden, die im sql-Modul verfügbar ist (fügen Sie QT += sql in Ihrer .pro-Datei hinzu). Sie finden einige Beispiele zur Verwendung in QtCreator. Stellen Sie außerdem sicher, dass Sie die Dokumentation gelesen haben, bevor Sie sie verwenden.

Denken Sie daran, dass es nur lesbar ist, wenn Sie es den Ressourcen hinzufügen.
Wenn Sie es beschreibbar sein sollten Sie:

  1. Schiff mit einem anderen Mechanismus
  2. Add-Code in Ihre Anwendung in Ihrer .pro-Datei (der plattformspezifisch ist), um das dB ein bewegen plattformspezifische beschreibbaren Speicherort

Hier ist ein Beispiel dafür, was in der .pro-Datei aufzunehmen:

georecords.files = sestosg.sqlite 
georecords.path = "./" 
macx { 
    georecords.path = "Contents/MacOS" 
} 
android { 
    georecords.path = "/assets" 
} 
QMAKE_BUNDLE_DATA += georecords 
INSTALLS += georecords 

dann in Ihre Anwen Kation sollten Sie die Bedingungen über wann und wo die db zu kopieren, z. wie im folgenden Beispiel. Stellen Sie sicher, dass Sie die relevanten Header importieren. Dies unterstützt OSX, Android und iOS. Andere Plattformen haben möglicherweise andere Anforderungen.

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; 

Schließlich müssen Sie eine Klasse mit Methoden erstellen, die von der DB zu verbinden/Lesen/Schreiben und aussetzen, dass als eine Instanz oder eine Komponente zu QML, vielleicht über ein Modell.