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.
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
@peppe có ví dụ nào không? Không thể tin rằng không ai được mã hóa chưa :) – Rinat
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