2014-09-22 28 views
0

有沒有可能對存儲在SQLite內存數據庫中的內容進行淺度拷貝?Qt在從SQLite內存數據庫中選擇淺拷貝時

Qt提供(與SQLite互連)在內存級別與SQLite DB一起運行的可能性;然而,在選擇行時,數據通常以深層方式複製(但這對於非內存數據庫是必需的)。 主要問題是通過對已經存儲在內存中的數據進行深層複製,我會將內存消耗增加一倍 - 但是,避免這種加倍消耗會很好,否則任何內存數據庫的方法似乎都相當可觀沒用,因爲我無法做任何具體的存儲爲char *的數據。

從char *到QVariant *有沒有一個簡單的方法,而無需複製已經存在的數據?可能繼承QSqlRecord或覆蓋sqlite驅動程序!

結果應該是我能夠在內存DB中使用SQLite,就像使用Qt的「標準」容器類(如QMap,QHash,QList,...)組成的「原始」數據「 - 以便我能夠將這些淺拷貝的對象/對象結構傳遞給QStandardItem等其他類,以使它們在QTableView中可見。

回答

1

這個問題與Qt沒什麼關係,因爲它的sqlite沒有提供這個功能。你需要直接訪問sqlite數據庫表示中的數據。由於此內存可隨時移動,因此您將獲得的任何指針只有在下一條SQL命令之前纔有效。

如果你這樣做,你需要修改sqlite以公開直接訪問內存數據庫中的數據表示。

唉,我想你有一個過早優化的情況。當Qt訪問數據庫時,它不會複製數據庫的所有內容,僅僅是運行查詢的結果。如果要查詢整個數據庫的所有表,這隻會「加倍」內存使用。如果你這樣做,你會遇到更大的問題,因爲這樣的設計會導致非常糟糕的用戶體驗。

+0

「當Qt訪問數據庫時,它不會複製數據庫的所有內容,只是運行查詢的結果」 - 但這就是我的意思......一般情況下(使用「普通」的數據庫方法是選擇數據並將其提供給QStandardItem/StandardItemModel並顯示它 - 但是,如果方法是將內存數據庫的幾乎所有內容都可視化,則內存將加倍(通常,您無法避免顯示「巨大」數據量) – shockzZ 2014-09-22 10:10:59

+0

@shockzZ想想這裏的數字。想想你的屏幕上有多少像素。在你的內存中每像素32位配置沒有問題。現在考慮一個字母文本需要多少個像素。用小字母填充所有的屏幕需要的存儲空間少於屏幕位圖所需的空間。現在讓我們回顧一下,你可以設置一些東西,只有* visible *項目保留在內存中。即使你有**可怕的糟糕的用戶界面,可以讓你滾動瀏覽數百萬項目(它接近無法使用),你不需要它們全部出現在內存中兩次。 – 2014-09-22 15:55:47

+0

@shockzZ「的方法是選擇數據並將其提供給例如QStandardItem/StandardItemModel並顯示它」好吧,如果你這樣做,那就是你搞砸了,而不是Qt :)這種方法是使用'QSqlTableModel'或'QSqlRelationalTableModel'。這些只是在內存中保留一個小項緩存,並且在視圖請求新數據時查詢數據庫。 – 2014-09-22 15:59:16