QML使用Sqlite数据库存储ListModel数据

简介: 本文介绍了在QML中使用Sqlite数据库存储ListModel数据的方法,包括如何创建数据库、读取数据、动态添加和删除数据,以及如何在程序启动和退出时与数据库同步数据。

[导读](本文为utf-8格式,可以直接使用相应代码) Models 是用来提供数据的,它既可以以 QML 的形式出现也可以是 C++的类。QML中的Model有ListModel、XmlListMode

(本文为utf-8格式,可以直接使用相应代码)
Models 是用来提供数据的,它既可以以 QML 的形式出现也可以是 C++的类。QML中的Model有ListModel、XmlListModel、VisualItemModel;C++ 中的 Model 有 QAbstractItemModel、QStringList、 QList等。另外我们可以把数据存到数据库里,程序启动的时候从数据库中读取数据,退出的时候把Model中的数据存放回数据库中。主要代码如下所示:

  ListModel {
        id: mymodel
        Component.onCompleted: loadImageData()
        Component.onDestruction: saveImageData()
        function loadImageData() {
            var db = openDatabaseSync("MyDB", "1.0", "My model SQL", 50000);
            db.transaction(
                        function(tx) {
                            // Create the database if it doesn't already exist
                            tx.executeSql('CREATE TABLE IF NOT EXISTS Images(id INTEGER primary key, title TEXT, picture TEXT)');

                            var rs = tx.executeSql('SELECT * FROM Images');
                            var index = 0;
                            if (rs.rows.length > 0) {
                                var index = 0;
                                while (index < rs.rows.length) {
                                    var myItem = rs.rows.item(index);
                                    mymodel.append( {
                                                       "id": myItem.id,
                                                       "title": myItem.title ,
                                                       "picture": myItem.picture  });
                                    index++;
                                }
                            } else {
                                mymodel.append( {
                                                   "id": 1,
                                                   "title": 'apple' ,
                                                   "picture": 'content/pics/apple.png'  });
                                mymodel.append( {
                                                   "id": 2,
                                                   "title": 'Qt Quick!' ,
                                                   "picture": 'content/pics/Qt.png'  });
                            }
                        }
                        )
        }

        function saveImageData() {
            var db = openDatabaseSync("MyDB", "1.0", "My model SQL", 50000);
            db.transaction(
                        function(tx) {
                            tx.executeSql('DROP TABLE Images');
                            tx.executeSql('CREATE TABLE IF NOT EXISTS Images(id INTEGER primary key, title TEXT, picture TEXT)');
                            var index = 0;
                            while (index < mymodel.count) {
                                var myItem = mymodel.get(index);
                                tx.executeSql('INSERT INTO Images VALUES(?,?,?)', [myItem.id, myItem.title, myItem.picture]);
                                index++;
                            }
                        }
                        )
        }
    }

动态添加数据是非常简单的,比如我们在 onClicked 事件中可以这样做:

onClicked: mymodel.append( { "title": 'Qt', "picture": 'content/pics/Qt.png' })

删除数据:

onClicked: mymodel.remove(listView.currentIndex)

下面是官方文档:

Offline Storage APIDatabase API

The openDatabaseSync() and related functions provide the ability to access local offline storage in an SQL database.

These databases are user-specific and QML-specific, but accessible to all QML applications. They are stored in the Databases subdirectory of QDeclarativeEngine::offlineStoragePath(), currently as SQLite databases.

The API can be used from JavaScript functions in your QML:

 import Qt 4.7

 Text {
     text: "?"

     function findGreetings() {
         var db = openDatabaseSync("QDeclarativeExampleDB", "1.0", "The Example QML SQL!", 1000000);

         db.transaction(
             function(tx) {
                 // Create the database if it doesn't already exist
                 tx.executeSql('CREATE TABLE IF NOT EXISTS Greeting(salutation TEXT, salutee TEXT)');

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

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

                 var r = ""
                 for(var i = 0; i < rs.rows.length; i++) {
                     r += rs.rows.item(i).salutation + ", " + rs.rows.item(i).salutee + "n"
                 }
                 text = r
             }
         )
     }

     Component.onCompleted: findGreetings()
 }
相关文章
|
3月前
|
存储 人工智能 Cloud Native
云栖重磅|从数据到智能:Data+AI驱动的云原生数据库
在9月20日2024云栖大会上,阿里云智能集团副总裁,数据库产品事业部负责人,ACM、CCF、IEEE会士(Fellow)李飞飞发表《从数据到智能:Data+AI驱动的云原生数据库》主题演讲。他表示,数据是生成式AI的核心资产,大模型时代的数据管理系统需具备多模处理和实时分析能力。阿里云瑶池将数据+AI全面融合,构建一站式多模数据管理平台,以数据驱动决策与创新,为用户提供像“搭积木”一样易用、好用、高可用的使用体验。
云栖重磅|从数据到智能:Data+AI驱动的云原生数据库
|
1月前
|
数据采集 数据库 Python
有哪些方法可以验证用户输入数据的格式是否符合数据库的要求?
有哪些方法可以验证用户输入数据的格式是否符合数据库的要求?
144 75
|
3月前
|
存储 监控 数据处理
flink 向doris 数据库写入数据时出现背压如何排查?
本文介绍了如何确定和解决Flink任务向Doris数据库写入数据时遇到的背压问题。首先通过Flink Web UI和性能指标监控识别背压,然后从Doris数据库性能、网络连接稳定性、Flink任务数据处理逻辑及资源配置等方面排查原因,并通过分析相关日志进一步定位问题。
294 61
|
2月前
|
SQL 存储 运维
从建模到运维:联犀如何完美融入时序数据库 TDengine 实现物联网数据流畅管理
本篇文章是“2024,我想和 TDengine 谈谈”征文活动的三等奖作品。文章从一个具体的业务场景出发,分析了企业在面对海量时序数据时的挑战,并提出了利用 TDengine 高效处理和存储数据的方法,帮助企业解决在数据采集、存储、分析等方面的痛点。通过这篇文章,作者不仅展示了自己对数据处理技术的理解,还进一步阐释了时序数据库在行业中的潜力与应用价值,为读者提供了很多实际的操作思路和技术选型的参考。
56 1
|
2月前
|
存储 Java easyexcel
招行面试:100万级别数据的Excel,如何秒级导入到数据库?
本文由40岁老架构师尼恩撰写,分享了应对招商银行Java后端面试绝命12题的经验。文章详细介绍了如何通过系统化准备,在面试中展示强大的技术实力。针对百万级数据的Excel导入难题,尼恩推荐使用阿里巴巴开源的EasyExcel框架,并结合高性能分片读取、Disruptor队列缓冲和高并发批量写入的架构方案,实现高效的数据处理。此外,文章还提供了完整的代码示例和配置说明,帮助读者快速掌握相关技能。建议读者参考《尼恩Java面试宝典PDF》进行系统化刷题,提升面试竞争力。关注公众号【技术自由圈】可获取更多技术资源和指导。
|
2月前
|
前端开发 JavaScript 数据库
获取数据库中字段的数据作为下拉框选项
获取数据库中字段的数据作为下拉框选项
67 5
|
2月前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
385 15
|
3月前
|
SQL 关系型数据库 数据库
国产数据实战之docker部署MyWebSQL数据库管理工具
【10月更文挑战第23天】国产数据实战之docker部署MyWebSQL数据库管理工具
290 4
国产数据实战之docker部署MyWebSQL数据库管理工具
|
3月前
|
关系型数据库 MySQL 数据库
GBase 数据库如何像MYSQL一样存放多行数据
GBase 数据库如何像MYSQL一样存放多行数据
|
3月前
|
关系型数据库 分布式数据库 数据库
云栖大会|从数据到决策:AI时代数据库如何实现高效数据管理?
在2024云栖大会「海量数据的高效存储与管理」专场,阿里云瑶池讲师团携手AMD、FunPlus、太美医疗科技、中石化、平安科技以及小赢科技、迅雷集团的资深技术专家深入分享了阿里云在OLTP方向的最新技术进展和行业最佳实践。

热门文章

最新文章