Browse Source

fix some bug: use unique_ptr

runningwater 2 years ago
parent
commit
f4ecf08114

+ 4 - 16
gallery-core/Album.cpp

@@ -2,22 +2,10 @@
 
 Album::Album(const QString& name) : mId(-1), mName(name) {}
 
-// int Album::id() const
-//{
+int Album::id() const { return mId; }
 
-//}
+void Album::setId(int id) { mId = id; }
 
-// void Album::setId(int id)
-//{
+QString Album::name() const { return mName; }
 
-//}
-
-// QString Album::name() const
-//{
-
-//}
-
-// void Album::setName(const QString &name)
-//{
-
-//}
+void Album::setName(const QString& name) { mName = name; }

+ 48 - 3
gallery-core/AlbumDao.cpp

@@ -2,14 +2,59 @@
 
 #include <QSqlDatabase>
 #include <QSqlQuery>
+#include <QVariant>
+#include <QVector>
 
-AlbumDao::AlbumDao(QSqlDatabase &database) : mDatabase(database) {}
+using namespace std;
 
+AlbumDao::AlbumDao(QSqlDatabase& database) : mDatabase(database) {}
+
+/**
+ * @brief AlbumDao::init 初始化
+ */
 void AlbumDao::init() const {
-  const QStringList tables = mDatabase.tables();
-  if (!tables.contains("albums")) {
+  if (!mDatabase.tables().contains("albums")) {
     QSqlQuery query(mDatabase);
     query.exec(
         "CREATE TABLE albums(id INTEGER PRIMARY KEY AUTOINCRMENT, name TEXT)");
   }
 }
+/**
+ * @brief AlbumDao::addAlbum 新增
+ * @param album
+ */
+void AlbumDao::addAlbum(Album& album) const {
+  QSqlQuery query(mDatabase);
+  query.prepare("INSERT INTO albums(name) VALUES(:name)");
+  query.bindValue(":name", album.name());
+  query.exec();
+  album.setId(query.lastInsertId().toInt());
+}
+
+void AlbumDao::updateAlbum(const Album& album) const {
+  QSqlQuery query(mDatabase);
+  query.prepare("UPDATE albums SET name=:name WHERE id=:id");
+  query.bindValue(":name", album.name());
+  query.bindValue(":id", album.id());
+  query.exec();
+}
+
+void AlbumDao::removeAlbum(int id) const {
+  QSqlQuery query(mDatabase);
+  query.prepare("DELETE FROM albums WHERE id=:id");
+  query.bindValue(":id", id);
+  query.exec();
+}
+
+unique_ptr<vector<unique_ptr<Album>>> AlbumDao::albums() const {
+  QSqlQuery query("SELECT * FROM albums", mDatabase);
+  query.exec();
+  unique_ptr<vector<unique_ptr<Album>>> list(new vector<unique_ptr<Album>>);
+  while (query.next()) {
+    unique_ptr<Album> album(new Album());
+    album->setId(query.value("id").toInt());
+    album->setName(query.value("name").toString());
+    list->push_back(std::move(album));
+  }
+  return list;
+}

+ 27 - 0
gallery-core/AlbumDao.h

@@ -1,13 +1,40 @@
 #ifndef ALBUMDAO_H
 #define ALBUMDAO_H
 
+#include "Album.h"
+
 class QSqlDatabase;
+class Album;
 
 class AlbumDao {
  public:
   AlbumDao(QSqlDatabase& database);
+  /**
+   * @brief init 创建 albums 表
+   */
   void init() const;
 
+  /**
+   * @brief addAlbum 新增
+   * @param album
+   */
+  void addAlbum(Album& album) const;
+  /**
+   * @brief updateAlbum 更新
+   * @param album
+   */
+  void updateAlbum(const Album& album) const;
+  /**
+   * @brief removeAlbum 删除
+   * @param id
+   */
+  void removeAlbum(int id) const;
+  /**
+   * @brief albums 查询
+   * @return
+   */
+  std::unique_ptr<std::vector<std::unique_ptr<Album>>> albums() const;
+
  private:
   QSqlDatabase& mDatabase;
 };

+ 4 - 1
gallery-core/DatabaseManager.cpp

@@ -13,7 +13,10 @@ DatabaseManager::~DatabaseManager() {
 }
 
 DatabaseManager::DatabaseManager(const QString &path)
-    : mDatabase(new QSqlDatabase(QSqlDatabase::addDatabase("QSQLITE"))) {
+    : albumDao(*mDatabase),
+    mDatabase(new QSqlDatabase(QSqlDatabase::addDatabase("QSQLITE"))) {
   mDatabase->setDatabaseName(path);
   mDatabase->open();
+
+  albumDao.init();
 }

+ 5 - 0
gallery-core/DatabaseManager.h

@@ -3,6 +3,8 @@
 
 #include <QString>
 
+#include "AlbumDao.h"
+
 class QSqlDatabase;
 
 const QString DATABASE_FILE_NAME = "gallery.db";
@@ -12,6 +14,9 @@ class DatabaseManager {
   static DatabaseManager& instance();
   ~DatabaseManager();
 
+ public:
+  const AlbumDao albumDao;
+
  protected:
   DatabaseManager(const QString& path = DATABASE_FILE_NAME);
   DatabaseManager& operator=(const DatabaseManager& rhs);

+ 4 - 4
gallery-core/Picture.cpp

@@ -6,13 +6,13 @@ Picture::Picture(const QString &filePath)
 Picture::Picture(const QUrl &fileUrl)
     : mId(-1), mAlbumId(-1), mFileUrl(fileUrl) {}
 
-// int Picture::id() const {}
+int Picture::id() const { return mId; }
 
-// void Picture::setId(int id) {}
+void Picture::setId(int id) { mId = id; }
 
-// int Picture::albumId() const {}
+int Picture::albumId() const { return mAlbumId; }
 
-// void Picture::setAlbumId(int albumId) {}
+void Picture::setAlbumId(int albumId) { mAlbumId = albumId; }
 
 QUrl Picture::fileUrl() const { return mFileUrl; }
 

+ 53 - 0
gallery-core/PictureDao.cpp

@@ -0,0 +1,53 @@
+#include "PictureDao.h"
+
+#include <QSqlQuery>
+
+using namespace std;
+
+PictureDao::PictureDao(QSqlDatabase &database) : mDatabase(database) {}
+
+void PictureDao::init() const {
+  if (!mDatabase.tables().contains("pictures")) {
+    QSqlQuery query(mDatabase);
+    query.exec(
+        "CREATE TABLE pictures(id INTEGER PRIMARY KEY AUTOINCRMENT, album_id "
+        "INTEGER, url TEXT)");
+  }
+}
+
+void PictureDao::addPictureInAlbum(int albumId, Picture &picture) const {
+  QSqlQuery query(mDatabase);
+  query.prepare("INSERT INTO pictures(album_id,url) VALUES(:album_id,:url)");
+  query.bindValue(":album_id", albumId);
+  query.bindValue(":url", picture.fileUrl().url());
+}
+
+void PictureDao::removePicture(int id) const {
+  QSqlQuery query(mDatabase);
+  query.prepare("DELETE FROM pictures WHERE id=:id");
+  query.bindValue(":id", id);
+  query.exec();
+}
+
+void PictureDao::removePictureForAlbum(int albumId) const {
+  QSqlQuery query(mDatabase);
+  query.prepare("DELETE FROM pictures WHERE album_id=:albumId");
+  query.bindValue(":albumid", albumId);
+  query.exec();
+}
+unique_ptr<vector<unique_ptr<Picture>>> PictureDao::picturesForAlbum(
+    int albumId) const {
+  QSqlQuery query(mDatabase);
+  query.prepare("SELECT * FROM pictures WHERE album_id=:albumId");
+  query.bindValue(":albumId", albumId);
+  query.exec();
+  unique_ptr<vector<unique_ptr<Picture>>> list(new vector<unique_ptr<Picture>>);
+  while (query.next()) {
+    unique_ptr<Picture> pic(new Picture());
+    pic->setFileUrl(query.value("url").toUrl());
+    pic->setAlbumId(query.value("album_id").toInt());
+    pic->setId(query.value("id").toInt());
+    list->push_back(std::move(pic));
+  }
+  return list;
+}

+ 28 - 0
gallery-core/PictureDao.h

@@ -0,0 +1,28 @@
+#ifndef PICTUREDAO_H
+#define PICTUREDAO_H
+
+#include <QSqlDatabase>
+#include <QVector>
+
+#include "Picture.h"
+
+class QSqlDatabase;
+class Picture;
+
+class PictureDao {
+ public:
+  PictureDao(QSqlDatabase& database);
+  void init() const;
+
+  void addPictureInAlbum(int albumId, Picture& picture) const;
+  void removePicture(int id) const;
+  void removePictureForAlbum(int albumId) const;
+  std::unique_ptr<std::vector<std::unique_ptr<Picture>>> picturesForAlbum(
+      int albumId) const;
+
+ private:
+  QSqlDatabase& mDatabase;
+  const QString mTableName = "pictures";
+};
+
+#endif  // PICTUREDAO_H

+ 3 - 1
gallery-core/gallery-core.pro

@@ -14,11 +14,13 @@ SOURCES += \
     AlbumDao.cpp \
     DatabaseManager.cpp \
     Picture.cpp \
-    Album.cpp
+    Album.cpp \
+    PictureDao.cpp
 
 HEADERS += \
     AlbumDao.h \
     DatabaseManager.h \
+    PictureDao.h \
     gallery-core_global.h \
     Picture.h \
     Album.h