簡體   English   中英

Qt表模型示例

[英]Qt Table Model Example

我正在看Qt示例“表模型示例”

在該示例中,connection.h中的createConnection()方法包含以下代碼:

static bool createConnection()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(":memory:");
    if (!db.open()) {...

我在代碼中復制了此示例。 我不明白兩件事。

  1. 局部變量db在createConnection()函數的末尾被破壞(請參閱RAII)。 由於我的數據庫不需要初始化並且我沒有使用“ db”變量,因此我看不到為什么需要此代碼。 但是,如果刪除它,我的程序將無法從現有數據庫中讀取。 我希望數據庫的銷毀會關閉數據庫並使它不可用。 但是,由於我不接觸db變量,為什么在訪問數據庫之前需要先創建然后銷毀它? 由於我不在任何地方使用db變量,並且在調用代碼之前將其銷毀,因此我看不到為什么根本需要調用createConnection()函數。 另一方面,我看不到如何打開數據庫並使變量破壞具有異常安全的RAII代碼。

  2. 我從不讓db.open()失敗。 如果我沒有數據庫,它將創建一個數據庫,然后打開一個空白數據庫。 如果我有數據庫,則將其打開。 我有一個數據庫,如果由於某種原因它無法打開,我不想創建它,我想要一個錯誤,因為發生了嚴重的錯誤。 打開空白數據庫只會給我帶來麻煩。 我該如何處理?

我是Qt的新手,但是對C ++很有經驗。 這段代碼對我來說意義不大。 我希望db變量的生存期是打開數據庫的生存期。 如示例中的代碼所示,我看不到這段代碼是如何沒有資源泄漏的。 據我所知,初始化db會打開某種全局資源,即使db變量被破壞導致泄漏后,它也會保持打開狀態。

這非常令人困惑。

謝謝。

瓷磚

這只是一個小例子。

  1. QSqlDatabase::addDatabase("QSQLITE"); 將創建默認連接,該連接將由任何后續查詢(未明確命名另一個連接)使用。 范圍結束時,連接不會被破壞。 在此示例中,將使用createConnection()初始化inMemory數據庫。 稍后可以使用QSqlDatabase::database()檢索連接。 在標准應用程序中,可能QSqlDatabase db保留為類成員。

  2. 使用inMemory db只會創建一個空的db,就像基於SQLite文件的db一樣。 如果要檢查現有文件(db),請使用QFile::exists(QString path)

如果要打開許多數據庫(在QSqlDatabase::addDatabase("QSQLITE","anotherConnectionName");上使用不同的連接名稱QSqlDatabase::addDatabase("QSQLITE","anotherConnectionName");則會泄漏。否則,您將覆蓋默認的數據庫連接。QApplication本身將保留連接。可以使用QSqlDatabase::removeDatabase()顯式刪除它們;

QSqlDatabase是一個很奇怪的類。 閱讀其文檔。 連接持續存在,並且QSqlDatabase是它的句柄。 連接被命名,並且addDatabase返回具有給定名稱的連接,並選擇創建(如果不存在)。 您可以使任何數量的QSqlDatabase對象代表一個連接。

由於sqlite內存數據庫是特定於您的過程的,因此在您需要時不創建數據庫幾乎沒有意義。 提前創建它的唯一方法是直接從過程中使用sqlite api。 這些數據庫不會持久存在。 這里的行為很明智。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM