Qt For Androidデータベース操作


Qt For Androidデータベース操作
作者:qyvlik
Qtのデータベース操作は、sqliteデータベースドライバが内蔵されているため、一般的なアプリケーションでは、いくつかのニーズに簡単に対応できます.
Qt Quick Local Storage QMLは、QtQuick.LocalStorageデータベースを操作するためのsqliteモジュールを提供する.非同期はサポートされていません.
このモジュールはw 3 cのWebデータベース規格を実現している.
HTML 5のローカルストレージであるWeb SQLデータベースを参照してください.
Web SQL Database仕様が廃棄されたため、現在のSQL仕様はSQLiteのSQL方言を採用していることが明らかになったが、一つの基準としては受け入れられない.ブラウザごとに独自の実現があるのはまだ毛の生えた基準だ.
もちろん、QMLの世界では心配する必要はありません.Qtは統一的な実現基準を用いて,プラットフォームの無関係性を示した.
インタフェースの説明QtQuick.LocalStorageモジュールは非同期のWeb SQLデータベースを実現する.
データベースを開く
W 3 C規格では、以下のようにデータベースを開くインタフェースについて説明する.
[Supplemental, NoInterfaceObject]
interface WindowDatabase {
    Database openDatabase(in DOMString name, 
                          in DOMString version, 
                          in DOMString displayName, 
                          in unsigned long estimatedSize, 
                          in optional DatabaseCallback creationCallback);
};
Window implements WindowDatabase;

[Supplemental, NoInterfaceObject]
interface WorkerUtilsDatabase {
    Database openDatabase(in DOMString name, 
                          in DOMString version, 
                          in DOMString displayName, 
                          in unsigned long estimatedSize, 
                          in optional DatabaseCallback creationCallback);

    DatabaseSync openDatabaseSync(in DOMString name, 
                                  in DOMString version, 
                                  in DOMString displayName, 
                                  in unsigned long estimatedSize, 
                                  in optional DatabaseCallback creationCallback);
};

WorkerUtils implements WorkerUtilsDatabase;

[Callback=FunctionOnly, NoInterfaceObject]
interface DatabaseCallback {
    void handleEvent(in Database database);
};
QtQuick.LocalStorageモジュールは、openDatabaseSyncメソッドを実装し、データベース・オブジェクトのハンドルを返します.
object openDatabaseSync(string name, 
                        string version, 
                        string description, 
                        int estimated_size, 
                        jsobject callback(db))

データベース・オブジェクトDatabaseSync
同期データベースオブジェクトのW 3 Cインタフェースの説明は以下の通りです.
interface DatabaseSync {
    void transaction(in SQLTransactionSyncCallback callback);
    void readTransaction(in SQLTransactionSyncCallback callback);

    readonly attribute DOMString version;
    void changeVersion(in DOMString oldVersion, 
                       in DOMString newVersion, 
                       in optional SQLTransactionSyncCallback callback);
};

[Callback=FunctionOnly, NoInterfaceObject]
interface SQLTransactionSyncCallback {
    void handleEvent(in SQLTransactionSync transaction);
};

したがって、LocalStorage::openDatabaseSyncが返されるオブジェクトにはtransaction,readTransaction,changeVersionのインタフェースがある.
SQL文オブジェクトSQLTransactionSyncの実行SQL文を同期して実行するオブジェクトのW 3 Cの説明を以下に示す.
// typedef sequence<any> ObjectArray;

interface SQLTransactionSync {
    SQLResultSet executeSql(in DOMString sqlStatement, in optional ObjectArray arguments);
};

SQL文を実行して返される結果オブジェクトSQLResultSetSQL文オブジェクトの戻り結果を実行するW 3 Cの説明を以下に示す.
interface SQLResultSet {
    readonly attribute long insertId;
    readonly attribute long rowsAffected;
    readonly attribute SQLResultSetRowList rows;
};

interface SQLResultSetRowList {
    readonly attribute unsigned long length;
    getter any item(in unsigned long index);
};
SQLResultSetRowListは、itemによって対応する下付き文字のデータを取得することができる.
SQLの実行後にエラーを報告SQL後報エラーオブジェクトのW 3 C記述を実行します.
interface SQLError {
    const unsigned short UNKNOWN_ERR = 0;
    const unsigned short DATABASE_ERR = 1;
    const unsigned short VERSION_ERR = 2;
    const unsigned short TOO_LARGE_ERR = 3;
    const unsigned short QUOTA_ERR = 4;
    const unsigned short SYNTAX_ERR = 5;
    const unsigned short CONSTRAINT_ERR = 6;
    const unsigned short TIMEOUT_ERR = 7;
    readonly attribute unsigned short code;
    readonly attribute DOMString message;
};

SQL例外SQLの例外オブジェクトのW 3 C記述を実行します.
exception SQLException {
    const unsigned short UNKNOWN_ERR = 0;
    const unsigned short DATABASE_ERR = 1;
    const unsigned short VERSION_ERR = 2;
    const unsigned short TOO_LARGE_ERR = 3;
    const unsigned short QUOTA_ERR = 4;
    const unsigned short SYNTAX_ERR = 5;
    const unsigned short CONSTRAINT_ERR = 6;
    const unsigned short TIMEOUT_ERR = 7;
    unsigned short code;
    DOMString message;
};

下記はQMLでテストしたコードです.
//!        
var db = LocalStorage.openDatabaseSync("QQmlExampleDB", "1.0", "The Example QML SQL!", 1000000);

db.transaction(
    function(tx) {
        //          
        tx.executeSql('CREATE TABLE IF NOT EXISTS Greeting(salutation TEXT, salutee TEXT)');

        //     
        tx.executeSql('INSERT INTO Greeting VALUES(?, ?)', [ 'hello', 'world' ]);

        // Show all added greetings
        //! rs is SQLResultSet type
        var rs = tx.executeSql('SELECT * FROM Greeting');

        var r = ""
        for(var i = 0; i < rs.rows.length; i++) {
            //! rs.rows is SQLResultSetRowList type
            r += rs.rows.item(i).salutation + ", " + rs.rows.item(i).salutee + "
"
} console.log(r); });

次に、LocalStorage::openDatabaseSyncを使用してデータベースを開き、生成されたデータベースファイルのパスはQQmlEngine::offlineStoragePathで取得できます.qmlscene.exeを使用して実行される場合、そのデータベースパスはC:\Users\Administrator\AppData\Local\QtProject\QtQmlViewer\QML\OfflineStorage\Databasesです.パソコンによって異なる場合がありますが、ご参考までに.
QtSql
QSqlDatabase
一般的な操作:
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");     //        
db.setHostName("localhost");                                //          
db.setDatabaseName("test");                                 //        
db.setUserName("root");                                     //            
db.setPassword("123456");                                   //           
db.open();                                                  //        
db.close();                                                 //      

データベース・ファイルの作成
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("database.db");                              //                ,      

データベースを開き、SQL操作を実行
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("database.db");                              //                ,      
if(!db.open()) return false;

QSqlQuery query;
//id     ,        ,         
query.exec("create table Login(id INTEGER PRIMARY KEY autoincrement, " "goods int, store int, time nvarchar(50), type int, place nvarchar(50),temperature nvarchar(10) )"); query.exec("insert into Login values( 1,NULL , NULL,NULL, NULL,NULL,NULL )"); query.exec("insert into Login values( 2,NULL , NULL,NULL, NULL,NULL,NULL )"); query.exec("insert into Login values( 3,NULL , NULL,NULL, NULL,NULL,NULL )"); query.exec("insert into Login values( 4,NULL , NULL,NULL, NULL,NULL,NULL )"); query.exec("insert into Login values( 5,NULL , NULL,NULL, NULL,NULL,NULL )"); query.exec("insert into Login values( 6,NULL , NULL,NULL, NULL,NULL,NULL )");

QSqlQuery
一般的な関数:
seek(int n);                // query       n   。       
first();                    // query           。
last();                     // query            。
next();                     // query       ,        ,           。
previous();                 // query       ,        ,           。
record();                   //          。
value(int n);               //       。       ,      。

検索
//     student     student(text name, int age)
query.exec(“select * from student”); 

この文の実行が完了すると、対応する実行結果が得られます.取得された結果は1つの記録だけではない可能性があるため、結果セットと呼ばれます.
結果セットを巡回するには、次の文を使用します.
while(query.next()) {
    QString name = query.value(0).toString(); //  "name"      "justin",value(i)  i    ,0  name,1  age
    int id = query.value(1).toInt();
    // query.value("age").toInt();
    // query.value("name").toString();
}

その他の詳細なドキュメントは、Qtヘルプドキュメントを参照するか、次の文書を参照してください.
Qtデータベースまとめ
本人githubプロジェクトA-week-to-develop-android-app-planから