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++;
                            }
                        }
                        )
        }
    }
AI 代码解读

动态添加数据是非常简单的,比如我们在 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()
 }
AI 代码解读
相关文章
数据库数据删除策略:硬删除vs软删除的最佳实践指南
在项目开发中,“删除”操作常见但方式多样,主要分为硬删除与软删除。硬删除直接从数据库移除数据,操作简单、高效,但不可恢复;适用于临时或敏感数据。软删除通过标记字段保留数据,支持恢复和审计,但增加查询复杂度与数据量;适合需追踪历史或可恢复的场景。两者各有优劣,实际开发中常结合使用以满足不同需求。
211 4
数据存储使用文件还是数据库,哪个更合适?
数据库和文件系统各有优劣:数据库读写性能较低、结构 rigid,但具备计算能力和数据一致性保障;文件系统灵活易管理、读写高效,但缺乏计算能力且无法保证一致性。针对仅需高效存储与灵活管理的场景,文件系统更优,但其计算短板可通过开源工具 SPL(Structured Process Language)弥补。SPL 提供独立计算语法及高性能文件格式(如集文件、组表),支持复杂计算与多源混合查询,甚至可替代数据仓库。此外,SPL 易集成、支持热切换,大幅提升开发运维效率,是后数据库时代文件存储的理想补充方案。
云栖重磅|从数据到智能:Data+AI驱动的云原生数据库
在9月20日2024云栖大会上,阿里云智能集团副总裁,数据库产品事业部负责人,ACM、CCF、IEEE会士(Fellow)李飞飞发表《从数据到智能:Data+AI驱动的云原生数据库》主题演讲。他表示,数据是生成式AI的核心资产,大模型时代的数据管理系统需具备多模处理和实时分析能力。阿里云瑶池将数据+AI全面融合,构建一站式多模数据管理平台,以数据驱动决策与创新,为用户提供像“搭积木”一样易用、好用、高可用的使用体验。
云栖重磅|从数据到智能:Data+AI驱动的云原生数据库
在C++的QT框架中实现SQLite数据库的连接与操作
以上就是在C++的QT框架中实现SQLite数据库的连接与操作的基本步骤。这些步骤包括创建数据库连接、执行SQL命令、处理查询结果和关闭数据库连接。在实际使用中,你可能需要根据具体的需求来修改这些代码。
209 14
有哪些方法可以验证用户输入数据的格式是否符合数据库的要求?
有哪些方法可以验证用户输入数据的格式是否符合数据库的要求?
299 75
【YashanDB知识库】python驱动查询gbk字符集崖山数据库CLOB字段,数据被驱动截断
【YashanDB知识库】python驱动查询gbk字符集崖山数据库CLOB字段,数据被驱动截断
让数据与AI贴得更近,阿里云瑶池数据库系列产品焕新升级
4月9日阿里云AI势能大会上,阿里云瑶池数据库发布重磅新品及一系列产品能力升级。「推理加速服务」Tair KVCache全新上线,实现KVCache动态分层存储,显著提高内存资源利用率,为大模型推理降本提速。
【YashanDB 知识库】用 yasldr 配置 Bulkload 模式作单线程迁移 300G 的业务数据到分布式数据库,迁移任务频繁出错
问题描述 详细版本:YashanDB Server Enterprise Edition Release 23.2.4.100 x86_64 6db1237 影响范围: 离线数据迁移场景,影响业务数据入库。 外场将部分 NewCIS 的报表业务放到分布式数据库,验证 SQL 性能水平。 操作系统环境配置: 125G 内存 32C CPU 2T 的 HDD 磁盘 问题出现的步骤/操作: 1、部署崖山分布式数据库 1mm 1cn 3dn 单线启动 yasldr 数据迁移任务,设置 32 线程的 bulk load 模式 2、观察 yasldr.log 是否出现如下错
Hutool创建数据源工厂动态查询不同数据库不同数据表的数据
Hutool创建数据源工厂动态查询不同数据库不同数据表的数据
95 2
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问