Чтение определенного объекта в QDataStream и подсчет количества сохраненных объектов

Я записываю некоторые объекты в двоичный файл, и я хотел бы прочитать их обратно. Чтобы объяснить вам, что я пытаюсь сделать, я подготовил простой пример с классом User, который содержит имя QString и имя QList для детей. Пожалуйста, смотрите код ниже.

#include "QString"
#include "QFile"
#include "QDataStream"
#include "qdebug.h"

class User
{
protected:
QString name;
QList<QString> childrens;

public:
QString getName(){ return name;}
QList<QString> getChildrens(){ return childrens;}

void setName(QString x) {name = x;}
void setChildrens(QList<QString> x) {childrens = x;}

//I have no idea of how to get the number of users in "test.db"
int countDatabase()
{

}

//I would like to read the user named "pn" without putting all users in memory
void read(QString pn)
{
    QFile fileRead("test.db");
    if (!fileRead.open(QIODevice::ReadOnly)) {
        qDebug() << "Cannot open file for writing: test.db";
        return;
    }
    QDataStream in(&fileRead);
    in.setVersion(QDataStream::Qt_5_14);
    in>>*this;
}


void write()
{
    QFile file("test.db");
    if (!file.open(QIODevice::WriteOnly | QIODevice::Append)) {
        qDebug() << "Cannot open file for writing: test.db";
        return;
    }
    QDataStream out(&file);
    out.setVersion(QDataStream::Qt_5_14);
    out<<*this;
}

friend QDataStream &operator<<(QDataStream &out, const User &t)
{
    out << t.name << t.childrens;
    return out;
}

friend QDataStream &operator>>(QDataStream &in, User &t)
{
    QString inname;
    QList<QString> inchildrens;
    in >> inname >> inchildrens;
    t.name = inname;
    t.childrens = inchildrens;
    return in;
}

};


////////////////////////////////////////////////////////////////
int main()
{
    User u;
    u.setName("Georges");
    u.setChildrens(QList<QString>()<<"Jeanne"<<"Jean");
    u.write();

    User v;
    u.setName("Alex");
    u.setChildrens(QList<QString>()<<"Matthew");
    u.write();

    User w;
    w.setName("Mario"); // no children
    w.write();

    User to_read;
    to_read.read("Alex");

    qDebug()<<to_read.getName();
    return 0;
}

Я успешно записываю всех пользователей, которых хочу, в свой двоичный файл. Однако я хотел бы иметь возможность, не загружая все в память:

  • Чтобы узнать, сколько пользователей хранится в двоичном файле,
  • Чтобы прочитать пользователя, указав имя этого пользователя.

До сих пор я использовал QDataStream и перегружаю операторы ‹‹ и >> для сериализации. Может быть, то, что я хочу, невозможно с помощью этого метода. Не могли бы вы дать мне несколько советов, как добиться успеха с QDataStream или некоторыми другими методами?


person froz    schedule 11.02.2020    source источник
comment
Если вы не хотите загружать все в память, я думаю, вам нужно настроить заголовок в начале файла, где вы сохраняете количество записей, а затем вам также понадобится индексный файл или используйте часть файла как n-индекс . Но по его пути вы становитесь все ближе и ближе к базе данных, так почему бы вам просто не использовать sqlite?   -  person Marco    schedule 11.02.2020
comment
Я не хочу использовать sqlite, потому что не хочу, чтобы данные были доступны или изменены вне программы.   -  person froz    schedule 11.02.2020
comment
В то же время я не знаю, как хранить QList в базе данных sqlite.   -  person froz    schedule 11.02.2020


Ответы (1)


Пожалуйста, найдите здесь решение, которое, наконец, не требует двоичных файлов, но использует BLOB в базе данных SQL:

РЕШЕНИЕ

person froz    schedule 13.02.2020