【问题标题】:Qt do shallow copy while selecting from SQLite Memory DatabaseQt 在从 SQLite 内存数据库中选择时进行浅拷贝
【发布时间】:2014-09-22 09:29:36
【问题描述】:

是否有可能对存储在 SQLite 内存数据库中的内容进行浅拷贝?

Qt 提供(与 SQLite 互连)在内存级别上操作 SQLite DB 的可能性;但是,在选择行时,通常会以深层方式复制数据(但非内存数据库需要这样做)。 主要问题是通过对已经存储在内存中的数据进行深度复制,我会使内存消耗翻倍 - 但是避免这种双倍消耗会很好,否则任何内存数据库的方法似乎都毫无用处因为我无法对内存中存储为 char* 的数据做任何特定的事情。

有没有一种简单的方法可以从 char* 到 QVariant* 而无需复制已经存在的数据?可能是 QSqlRecord 的子类或覆盖 sqlite 驱动程序!?

结果应该是我能够在内存数据库中使用 SQLite,就像我使用 Qt 的“标准”容器类(如 QMap、QHash、QList ......)由“原始数据”的浅拷贝组成" - 这样我就可以将这些浅拷贝的对象/对象结构传递给 QStandardItem 等其他类,以使其在 QTableView 中可见。

【问题讨论】:

    标签: c++ qt sqlite memory


    【解决方案1】:

    这个问题与 Qt 没有太大关系,因为它是 sqlite 不提供此功能。您需要直接访问 sqlite 数据库表示中的数据。由于此内存可以随时移动,因此您获得的任何指针都只会在下一个 SQL 命令之前有效。

    如果您要这样做,您需要修改 sqlite 以公开对内存中数据表示的直接访问。

    唉,我认为您有过早优化的情况。当 Qt 访问数据库时,它不会复制数据库的所有内容,而只是复制运行查询的结果。如果您要完整地查询数据库的所有表,这只会使内存使用“翻倍”。如果你这样做,你会遇到更大的问题,因为这样的设计会导致非常糟糕的用户体验。

    【讨论】:

    • “当 Qt 访问数据库时,它不会复制所有数据库的内容,而只是复制运行查询的结果”-但这就是我的意思...一般(带有“正常”)数据库的方法是选择数据并将其提供给例如 QStandardItem/StandardItemModel 并显示它 - 但是,如果该方法是可视化内存数据库的几乎所有内容,则内存将加倍(通常你不能避免显示“大量”数据)
    • @shockzZ 想想这里的数字。想想你的屏幕上有多少像素。在您的内存中适合每像素 32 位是没有问题的。现在想想每个文本字母需要多少像素。即使用小字母填充整个屏幕所需的存储空间也比屏幕位图占用的存储空间要少。现在让我们回想一下,您可以进行设置,以便仅将 可见 项保留在内存中。即使您的用户界面非常糟糕可以让您滚动浏览数百万个项目(它几乎无法使用),您也不需要它们都在内存中出现两次。
    • @shockzZ “方法是选择数据并将其提供给 QStandardItem/StandardItemModel 并显示它”好吧,如果你这样做,是你把事情搞砸了,而不是 Qt: ) 方法是使用QSqlTableModelQSqlRelationalTableModel。这些只是在内存中保留一个小项目缓存,并在视图请求新数据时查询数据库。
    • @shockzZ 我认为您陷入了看到与您假定的解决方案完全相关的问题的陷阱但没有首先让我们知道您选择了哪种解决方案 .一旦你选择了正确的方法,问题就会消失。正确的方法是使用QSqlXxxxModel 或滚动您自己的模型,为每个datasetData 查询数据库。
    • @shockzZ 如果不更改 sqlite 代码,就无法从 sqlite 浅拷贝数据。这就是你的答案。你还有什么想知道的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-07
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多