2016-10-19 13 views
7

Tôi có một số cơ sở dữ liệu :/test.sqlite3 bên trong .qrc. Và mục tiêu là trực tiếp sử dụng cơ sở dữ liệu này trong chương trình. Cơ sở dữ liệu chỉ được sử dụng để đọc.Có bất kỳ plugin SQL Qt nào để lưu trữ cơ sở dữ liệu trong RAM của VFS (để tải cơ sở dữ liệu từ tệp tài nguyên Qt) không?

QSqlDatabase::setDatabase(":/test.sqlite3") không hoạt động, vì Qt SQLite không được thiết kế để hoạt động với hệ thống tệp của Qt.

Một trong các giải pháp là sao chép cơ sở dữ liệu từ .qrc vào D:\temdb.sqlite3 và sử dụng nó theo QSqlDatabase::setDatabase("D:\\temdb.sqlite3"). Nhưng chương trình không được làm việc với hệ thống tập tin hệ điều hành.

Giải pháp thứ hai lưu trữ :/dump.sql trong tài nguyên, sau đó tạo cơ sở dữ liệu trong bộ nhớ bằng cách QSqlDatabase::setDatabase(":memory:") và nhập kết xuất vào đó bằng cách đọc và thực thi các dòng từ :/dump.sql. Nhưng phương pháp này chậm.

Và, cuối cùng, cách cứng nhưng đúng là tạo plugin Qt riêng cho SQLite với việc triển khai VFS để đọc cơ sở dữ liệu từ RAM, trong đó chúng tôi có byte là ":/test.sqlite3".

Có cách nào khác dễ dàng không?

P.S. Tôi đã đọc tất cả các câu hỏi như Converting in-memory sqlite database to blob/char array và các câu hỏi khác, vì vậy đừng đánh dấu nó là trùng lặp. Câu hỏi của tôi là về bất kỳ phương pháp nào khác.

+0

Cách "dễ dàng", không. Nhưng Sqlite đi kèm với trừu tượng VFS riêng của nó, vì vậy trong lý thuyết nó có thể làm cho nó nhìn thẳng vào các nguồn lực của Qt. – peppe

+0

@peppe có ví dụ nào không? Không thể tin rằng không ai được mã hóa chưa :) – Rinat

+0

Nếu bạn có kế hoạch giữ toàn bộ bộ dữ liệu trong bộ nhớ, sử dụng SQL để truy cập đó có lẽ là khóa học ít hiệu quả nhất mà bạn có thể thực hiện. Bạn có thể đọc trực tiếp dữ liệu vào các vùng chứa C++ thông thường và tận hưởng thời gian truy cập tốt hơn nhiều. – dtech

Trả lời

1

Bạn có thể tận dụng lợi thế của Qt QTemporaryFile để sao chép dữ liệu của bạn và bắt đầu. QTemporaryfile hoạt động trên mọi hệ điều hành.

Dưới đây là một ví dụ (file tạm thời này có liên quan đến toàn bộ qApp để nó sẽ được gỡ bỏ khi bạn thoát khỏi ứng dụng):

QTemporaryFile tmpFile(qApp); 
tmpFile.setFileTemplate("XXXXXX.sqlite3"); 
if (tmpFile.open()) { 
    QString tmp_filename=tmpFile.fileName(); 
    qDebug() << "temporary" << tmp_filename; 

    QFile file(":/test.sqlite3"); 
    if (file.open(QIODevice::ReadOnly)) { 
     tmpFile.write(file.readAll()); 
    } 

    tmpFile.close(); 
} 

Các bạn có thể mở các tập tin tmpFile.fileName() như QSqlDatabase:

QSqlDatabase::setDatabase(tmpFile.fileName()); 
+0

Cảm ơn bạn, không biết về 'QTemporaryFile' trước đây. Nhưng, như tôi đã viết, chương trình không được làm việc với hệ thống tập tin hệ điều hành. – Rinat

+0

ok, tôi chỉ nghĩ rằng bạn không muốn thực hiện một os cụ thể mà là một nền tảng chéo. – bibi

Các vấn đề liên quan