8#include <QLoggingCategory>
10#include "DatabaseTree.h"
12static Q_LOGGING_CATEGORY(log,
"DB.Tree")
21TreeItem::TreeItem(
const TreeItem &item)
25 m_szName = item.m_szName;
27 m_ParentId = item.m_ParentId;
28 m_SortOrder = item.m_SortOrder;
29 m_CreateTime = item.m_CreateTime;
30 m_ModifyTime = item.m_ModifyTime;
31 m_LastVisitTime = item.m_LastVisitTime;
34bool TreeItem::IsNode()
const
36 return Node == GetType();
39bool TreeItem::IsLeaf()
const
41 return Leaf == GetType();
44TreeItem::TYPE TreeItem::GetType()
const
49void TreeItem::SetType(TYPE type)
54int TreeItem::GetId()
const
59void TreeItem::SetId(
int newId)
64QString TreeItem::GetName()
const
69void TreeItem::SetName(
const QString &newName)
74int TreeItem::GetParentId()
const
79void TreeItem::SetParentId(
int newParentId)
81 m_ParentId = newParentId;
84int TreeItem::GetSortOrder()
const
89void TreeItem::SetSortOrder(
int newSortOrder)
91 m_SortOrder = newSortOrder;
94int TreeItem::GetKey()
const
99void TreeItem::SetKey(
int newNKey)
104QDateTime TreeItem::GetCreateTime()
const
109void TreeItem::SetCreateTime(
const QDateTime &newCreateTime)
111 m_CreateTime = newCreateTime;
139QDateTime TreeItem::GetModifyTime()
const
144void TreeItem::SetModifyTime(
const QDateTime &newModifyTime)
146 m_ModifyTime = newModifyTime;
149QDateTime TreeItem::GetLastVisitTime()
const
151 return m_LastVisitTime;
154void TreeItem::SetLastVisitTime(
const QDateTime &newLastVisitTime)
156 m_LastVisitTime = newLastVisitTime;
159CDatabaseFolder::CDatabaseFolder(QObject *parent)
162 m_szConnectName =
"folder_connect";
163 m_szTableName =
"folders";
166CDatabaseFolder::CDatabaseFolder(
const QString &szPrefix, QObject *parent)
169 if(!szPrefix.isEmpty())
170 m_szTableName = szPrefix +
"_" + m_szTableName;
173bool CDatabaseFolder::OnInitializeSqliteDatabase()
175 QSqlQuery query(GetDatabase());
178 query.exec(
"PRAGMA foreign_keys = ON");
181 bool success = query.exec(
182 "CREATE TABLE IF NOT EXISTS "
185 " id INTEGER PRIMARY KEY AUTOINCREMENT,"
186 " name TEXT NOT NULL,"
187 " parent_id INTEGER DEFAULT 0,"
188 " sort_order INTEGER DEFAULT 0,"
189 " created_time DATETIME DEFAULT CURRENT_TIMESTAMP"
194 qCritical(log) <<
"Failed to create folders sqlite table:"
195 << m_szTableName << query.lastError().text()
196 <<
"Sql:" << query.executedQuery();
201 query.exec(
"CREATE INDEX IF NOT EXISTS idx_" + m_szTableName +
"_parent ON " + m_szTableName +
"(parent_id)");
206bool CDatabaseFolder::OnInitializeMySqlDatabase()
208 QSqlQuery query(GetDatabase());
211 query.exec(
"PRAGMA foreign_keys = ON");
214 bool success = query.exec(
215 "CREATE TABLE IF NOT EXISTS "
218 " id INTEGER PRIMARY KEY AUTO_INCREMENT,"
219 " name TEXT NOT NULL,"
220 " parent_id INTEGER DEFAULT 0,"
221 " sort_order INTEGER DEFAULT 0,"
222 " created_time DATETIME DEFAULT CURRENT_TIMESTAMP,"
223 " INDEX idx_parent (parent_id),"
224 " INDEX idx_parent_sort (parent_id, sort_order)"
228 qCritical(log) <<
"Failed to create folders mysql table:"
229 << m_szTableName << query.lastError().text()
230 <<
"Sql:" << query.executedQuery();
237int CDatabaseFolder::AddFolder(
const QString &name,
int parentId)
240 QSqlQuery query(GetDatabase());
243 query.prepare(
"SELECT id FROM " + m_szTableName
244 +
" WHERE parent_id = :parent_id "
247 query.bindValue(
":parent_id", parentId);
248 query.bindValue(
":name", name);
251 qCritical(log) <<
"Failed to add folders:" << query.lastError().text()
252 <<
"Sql:" << query.executedQuery();
256 return query.value(0).toInt();
260 query.prepare(
"SELECT MAX(sort_order) FROM " + m_szTableName
261 +
" WHERE parent_id = :parent_id");
262 query.bindValue(
":parent_id", parentId);
267 maxOrder = query.value(0).toInt() + 1;
271 "INSERT INTO " + m_szTableName +
272 " (name, parent_id, sort_order) "
273 " VALUES (:name, :parent_id, :sort_order) "
275 query.bindValue(
":name", name);
276 query.bindValue(
":parent_id", parentId);
277 query.bindValue(
":sort_order", maxOrder);
280 bool success = query.exec();
282 id = query.lastInsertId().toInt();
284 emit sigAddFolder(
id, parentId);
288 qCritical(log) <<
"Failed to add folders:" << query.lastError().text()
289 <<
"Sql:" << query.executedQuery();
294bool CDatabaseFolder::RenameFolder(
int id,
const QString &newName)
296 QSqlQuery query(GetDatabase());
297 query.prepare(
"UPDATE " + m_szTableName +
298 " SET name = :name WHERE id = :id");
299 query.bindValue(
":id",
id);
300 query.bindValue(
":name", newName);
302 bool success = query.exec();
307 qCritical(log) <<
"Failed to rename folders:"
308 << query.lastError().text()
309 <<
"Sql:" << query.executedQuery();
314bool CDatabaseFolder::DeleteFolder(
int id, std::function<
int (
int parentId)> cbDeleteLeaf)
317 auto folders = GetSubFolders(
id);
318 foreach(
auto f, folders) {
319 DeleteFolder(f.GetId(), cbDeleteLeaf);
329 QSqlQuery query(GetDatabase());
330 query.prepare(
"DELETE FROM " + m_szTableName +
" WHERE id = :id");
331 query.bindValue(
":id",
id);
333 bool success = query.exec();
338 qCritical(log) <<
"Failed to delete folders:"
339 << query.lastError().text()
340 <<
"Sql:" << query.executedQuery();
345bool CDatabaseFolder::OnDeleteLeafs(
int id)
350QString CDatabaseFolder::GetTableName()
const
352 return m_szTableName;
355void CDatabaseFolder::SetTableName(
const QString &newSzTableName)
357 m_szTableName = newSzTableName;
360bool CDatabaseFolder::MoveFolder(
int id,
int newParentId)
362 QSqlQuery query(GetDatabase());
363 query.prepare(
"UPDATE " + m_szTableName +
" SET parent_id = :parent_id WHERE id = :id");
364 query.bindValue(
":id",
id);
365 query.bindValue(
":parent_id", newParentId);
367 bool success = query.exec();
372 qCritical(log) <<
"Failed to move folders:" << query.lastError().text()
373 <<
"Sql:" << query.executedQuery();
378TreeItem CDatabaseFolder::GetFolder(
int id)
381 if(0 >=
id)
return folder;
382 QSqlQuery query(GetDatabase());
384 "SELECT id, name, parent_id, sort_order, created_time "
385 "FROM " + m_szTableName +
" "
388 query.bindValue(
":id",
id);
391 folder.SetType(TreeItem::Node);
392 folder.SetId(query.value(0).toInt());
393 folder.SetName(query.value(1).toString());
394 folder.SetParentId(query.value(2).toInt());
395 folder.SetSortOrder(query.value(3).toInt());
396 folder.SetCreateTime(query.value(4).toDateTime());
399 qCritical(log) <<
"Failed to get folder:"
400 <<
id << query.lastError().text()
401 <<
"Sql:" << query.executedQuery();
406QList<TreeItem> CDatabaseFolder::GetAllFolders()
408 QList<TreeItem> folders;
410 QSqlQuery query(GetDatabase());
412 "SELECT id, name, parent_id, sort_order, created_time "
413 "FROM " + m_szTableName +
" "
414 "ORDER BY parent_id, sort_order, name"
418 while (query.next()) {
420 folder.SetType(TreeItem::Node);
421 folder.SetId(query.value(0).toInt());
422 folder.SetName(query.value(1).toString());
423 folder.SetParentId(query.value(2).toInt());
424 folder.SetSortOrder(query.value(3).toInt());
425 folder.SetCreateTime(query.value(4).toDateTime());
427 folders.append(folder);
434QList<TreeItem> CDatabaseFolder::GetSubFolders(
int parentId)
436 QList<TreeItem> folders;
438 QSqlQuery query(GetDatabase());
440 "SELECT id, name, parent_id, sort_order, created_time "
441 "FROM " + m_szTableName +
" "
442 "WHERE parent_id = :parent_id "
443 "ORDER BY sort_order, name"
445 query.bindValue(
":parent_id", parentId);
448 while (query.next()) {
450 folder.SetType(TreeItem::Node);
451 folder.SetId(query.value(0).toInt());
452 folder.SetName(query.value(1).toString());
453 folder.SetParentId(query.value(2).toInt());
454 folder.SetSortOrder(query.value(3).toInt());
455 folder.SetCreateTime(query.value(4).toDateTime());
457 folders.append(folder);
466 QSqlQuery query(GetDatabase());
468 query.prepare(
"SELECT COUNT(*) FROM " + m_szTableName);
470 query.prepare(
"SELECT COUNT(*) FROM " + m_szTableName +
" WHERE parent_id=:id");
471 query.bindValue(
":id", parentId);
473 if (query.exec() && query.next())
474 return query.value(0).toInt();
478bool CDatabaseFolder::ExportToJson(QJsonObject& obj)
480 QSqlQuery query(GetDatabase());
482 "SELECT id, name, parent_id, sort_order, created_time "
483 "FROM " + m_szTableName +
" "
485 bool success = query.exec();
487 qCritical(log) <<
"Failed to export folder to json:"
488 << m_szTableName << query.lastError().text()
489 <<
"Sql:" << query.executedQuery();
493 while(query.next()) {
495 f.insert(
"id", query.value(0).toInt());
496 f.insert(
"name", query.value(1).toString());
497 f.insert(
"parent_id", query.value(2).toInt());
498 f.insert(
"sort_order", query.value(3).toInt());
499 f.insert(
"created_time", query.value(4).toDateTime().toString());
502 if(!folder.isEmpty())
503 obj.insert(
"folder", folder);
507bool CDatabaseFolder::ImportFromJson(
const QJsonObject& obj)
512CDatabaseTree::CDatabaseTree(QObject *parent)
515 m_szTableName =
"tree";
516 m_szConnectName =
"tree_connect";
519CDatabaseTree::CDatabaseTree(
const QString &szPrefix, QObject *parent)
522 if(!szPrefix.isEmpty())
523 m_szTableName = szPrefix +
"_" + m_szTableName;
524 m_FolderDB.SetTableName(szPrefix +
"_" + m_FolderDB.GetTableName());
527bool CDatabaseTree::OnInitializeDatabase()
530 bRet = CDatabase::OnInitializeDatabase();
532 if(!bRet)
return false;
533 m_FolderDB.SetDatabase(GetDatabase(), m_pPara);
534 bRet = m_FolderDB.OnInitializeDatabase();
535 if(!bRet)
return false;
536 bRet = connect(&m_FolderDB, &CDatabaseFolder::sigAddFolder,
537 this, &CDatabaseTree::sigAddFolder);
543bool CDatabaseTree::OnInitializeSqliteDatabase()
545 QSqlQuery query(GetDatabase());
548 query.exec(
"PRAGMA foreign_keys = ON");
551 bool success = query.exec(
552 "CREATE TABLE IF NOT EXISTS " + m_szTableName +
" ("
553 " id INTEGER PRIMARY KEY AUTOINCREMENT,"
554 " parent_id INTEGER DEFAULT 0,"
556 " value INTEGER DEFAULT 0,"
557 " created_time DATETIME DEFAULT CURRENT_TIMESTAMP,"
558 " modified_time DATETIME DEFAULT CURRENT_TIMESTAMP,"
559 " last_visit_time DATETIME"
564 qCritical(log) <<
"Failed to create tree table:"
565 << m_szTableName << query.lastError().text()
566 <<
"Sql:" << query.executedQuery();
571 query.exec(
"CREATE INDEX IF NOT EXISTS idx_" + m_szTableName +
"_value ON " + m_szTableName +
"(value)");
572 query.exec(
"CREATE INDEX IF NOT EXISTS idx_" + m_szTableName +
"_parent_id ON " + m_szTableName +
"(parent_id)");
577bool CDatabaseTree::OnInitializeMySqlDatabase()
579 QSqlQuery query(GetDatabase());
582 query.exec(
"PRAGMA foreign_keys = ON");
585 bool success = query.exec(
586 "CREATE TABLE IF NOT EXISTS " + m_szTableName +
" ("
587 " id INTEGER PRIMARY KEY AUTO_INCREMENT,"
588 " parent_id INTEGER DEFAULT 0,"
590 " value INTEGER DEFAULT 0,"
591 " created_time DATETIME DEFAULT CURRENT_TIMESTAMP,"
592 " modified_time DATETIME DEFAULT CURRENT_TIMESTAMP,"
593 " last_visit_time DATETIME,"
594 " INDEX idx_value (value),"
595 " INDEX idx_parent_id (parent_id)"
600 qCritical(log) <<
"Failed to create tree table:"
601 << m_szTableName << query.lastError().text()
602 <<
"Sql:" << query.executedQuery();
612 QSqlQuery query(GetDatabase());
616 "SELECT id FROM " + m_szTableName +
617 " WHERE value=:key AND parent_id=:parent_id"
619 query.bindValue(
":key", item.GetKey());
620 query.bindValue(
":parent_id", item.GetParentId());
623 qCritical(log) <<
"Failed to add tree:" << query.lastError().text()
624 <<
"Sql:" << query.executedQuery();
628 return query.value(0).toInt();
633 "INSERT INTO " + m_szTableName +
" (name, value, "
634 "created_time, modified_time, last_visit_time, parent_id) "
635 "VALUES (:name, :key, "
636 ":created_time, :modified_time, :last_visit_time, :parent_id)"
639 query.bindValue(
":name", item.GetName());
640 query.bindValue(
":key", item.GetKey());
641 QDateTime time = QDateTime::currentDateTime();
642 query.bindValue(
":created_time", time);
643 query.bindValue(
":modified_time", time);
644 query.bindValue(
":last_visit_time", time);
645 query.bindValue(
":parent_id", item.GetParentId());
647 bool success = query.exec();
650 qCritical(log) <<
"Failed to add tree item:"
651 << query.lastError().text()
652 <<
"Sql:" << query.executedQuery();
656 int id = query.lastInsertId().toInt();
658 emit sigAdd(
id, item.GetParentId());
662bool CDatabaseTree::Update(
const TreeItem &item)
664 QSqlQuery query(GetDatabase());
666 "UPDATE " + m_szTableName +
" SET "
669 "created_time = :created_time, "
670 "modified_time = :modified_time, "
671 "last_visit_time = :last_visit_time, "
672 "parent_id = :parent_id "
675 query.bindValue(
":name", item.GetName());
676 query.bindValue(
":key", item.GetKey());
677 query.bindValue(
":created_time", item.GetCreateTime());
678 query.bindValue(
":modified_time", QDateTime::currentDateTime());
679 query.bindValue(
":last_visit_time", item.GetLastVisitTime());
680 query.bindValue(
":parent_id", item.GetParentId());
681 query.bindValue(
":id", item.GetId());
682 qDebug(log) <<
"Sql:" << query.executedQuery();
683 qDebug(log) <<
"Bound value:" << query.boundValues();
684 bool success = query.exec();
686 qCritical(log) <<
"Failed to update tree item:"
687 << m_szTableName << query.lastError().text()
688 <<
"Sql:" << query.executedQuery();
693bool CDatabaseTree::Delete(
int id,
bool delKey)
697 auto leaf = GetLeaf(
id);
698 if(leaf.GetKey() > 0) {
700 if(leaves.count() == 1) {
707 QSqlQuery query(GetDatabase());
708 query.prepare(
"DELETE FROM " + m_szTableName +
" WHERE id = :id");
709 query.bindValue(
":id",
id);
711 bool success = query.exec();
713 qCritical(log) <<
"Failed to delete item:"
714 << m_szTableName << query.lastError().text()
715 <<
"Sql:" << query.executedQuery();
721bool CDatabaseTree::Delete(QList<int> items,
bool delKey)
723 if(items.isEmpty())
return false;
726 foreach(
auto id, items) {
728 auto leaf = GetLeaf(
id);
729 if(leaf.GetKey() > 0) {
731 if(leaves.count() == 1) {
740 QSqlQuery query(GetDatabase());
741 QString szSql =
"DELETE FROM " + m_szTableName +
" WHERE ";
743 foreach(
auto id, items) {
746 szSql +=
" id = " + QString::number(
id);
748 szSql +=
" OR id = " + QString::number(
id);
751 bool success = query.exec(szSql);
753 qCritical(log) <<
"Failed to delete item:"
754 << m_szTableName << query.lastError().text()
755 <<
"Sql:" << query.executedQuery();
761bool CDatabaseTree::DeleteChild(
int parentId,
bool delKey)
765 foreach(
auto leaf, leaves) {
766 if(!Delete(leaf.GetId(), delKey))
772 QSqlQuery query(GetDatabase());
773 query.prepare(
"DELETE FROM " + m_szTableName +
" WHERE parent_id = :parent_id");
774 query.bindValue(
":parent_id", parentId);
776 bool success = query.exec();
778 qCritical(log) <<
"Failed to delete child item:"
779 << m_szTableName << query.lastError().text()
780 <<
"Sql:" << query.executedQuery();
786bool CDatabaseTree::Move(
int id,
int newParent)
788 QSqlQuery query(GetDatabase());
790 "UPDATE " + m_szTableName +
" SET "
791 "parent_id = :parent_id WHERE id = :id");
792 query.bindValue(
":parent_id", newParent);
793 query.bindValue(
":id",
id);
795 bool success = query.exec();
797 qCritical(log) <<
"Failed to add tree item:"
798 << m_szTableName << query.lastError().text()
799 <<
"Sql:" << query.executedQuery();
805TreeItem CDatabaseTree::GetLeaf(
int id)
808 item.SetType(TreeItem::Leaf);
810 QSqlQuery query(GetDatabase());
812 "SELECT name, value, "
813 "created_time, modified_time, last_visit_time, parent_id FROM " + m_szTableName +
815 query.bindValue(
":id",
id);
817 bool success = query.exec();
819 qCritical(log) <<
"Failed to get leaf:"
820 << m_szTableName << query.lastError().text()
821 <<
"Sql:" << query.executedQuery();
827 item.SetName(query.value(0).toString());
828 item.SetKey(query.value(1).toInt());
829 item.SetCreateTime(query.value(2).toDateTime());
830 item.SetModifyTime(query.value(3).toDateTime());
831 item.SetLastVisitTime(query.value(4).toDateTime());
832 item.SetParentId(query.value(5).toInt());
839 QList<TreeItem> items;
840 QSqlQuery query(GetDatabase());
842 szSql =
"SELECT id, name, value, "
843 "created_time, modified_time, last_visit_time, parent_id "
844 "FROM " + m_szTableName;
846 szSql +=
" WHERE parent_id = :parent_id";
847 query.prepare(szSql);
848 query.bindValue(
":parent_id", nodeId);
849 bool success = query.exec();
851 qCritical(log) <<
"Failed to get leaves:"
852 << m_szTableName << query.lastError().text()
853 <<
"Sql:" << query.executedQuery();
857 while(query.next()) {
859 item.SetType(TreeItem::Leaf);
860 item.SetId(query.value(0).toInt());
861 item.SetName(query.value(1).toString());
862 item.SetKey(query.value(2).toInt());
863 item.SetCreateTime(query.value(3).toDateTime());
864 item.SetModifyTime(query.value(4).toDateTime());
865 item.SetLastVisitTime(query.value(5).toDateTime());
866 item.SetParentId(query.value(6).toInt());
875 QList<TreeItem> items;
877 QSqlQuery query(GetDatabase());
879 szSql =
"SELECT id, name, "
880 "created_time, modified_time, last_visit_time, parent_id "
881 "FROM " + m_szTableName +
882 " WHERE value = :key";
883 query.prepare(szSql);
884 query.bindValue(
":key", key);
885 bool success = query.exec();
887 qCritical(log) <<
"Failed to get leaves by key:"
888 << m_szTableName << query.lastError().text()
889 <<
"Sql:" << query.executedQuery();
893 while(query.next()) {
895 item.SetType(TreeItem::Leaf);
896 item.SetId(query.value(0).toInt());
897 item.SetName(query.value(1).toString());
899 item.SetCreateTime(query.value(2).toDateTime());
900 item.SetModifyTime(query.value(3).toDateTime());
901 item.SetLastVisitTime(query.value(4).toDateTime());
902 item.SetParentId(query.value(5).toInt());
911 QList<TreeItem> items;
912 if(key.isEmpty())
return items;
914 QSqlQuery query(GetDatabase());
916 szSql =
"SELECT id, name, value, "
917 "created_time, modified_time, last_visit_time, parent_id "
918 "FROM " + m_szTableName +
921 foreach(
auto KeyId, key) {
923 szSql +=
" value = " + QString::number(KeyId);
926 szSql +=
" OR value = " + QString::number(KeyId);
928 bool success = query.exec(szSql);
930 qCritical(log) <<
"Failed to get leaves by key:"
931 << m_szTableName << query.lastError().text()
932 <<
"Sql:" << query.executedQuery();
936 while(query.next()) {
938 item.SetType(TreeItem::Leaf);
939 item.SetId(query.value(0).toInt());
940 item.SetName(query.value(1).toString());
941 item.SetKey(query.value(2).toInt());
942 item.SetCreateTime(query.value(3).toDateTime());
943 item.SetModifyTime(query.value(4).toDateTime());
944 item.SetLastVisitTime(query.value(5).toDateTime());
945 item.SetParentId(query.value(6).toInt());
952int CDatabaseTree::GetLeafCount(
int parentId)
954 QSqlQuery query(GetDatabase());
956 query.prepare(
"SELECT COUNT(*) FROM " + m_szTableName);
958 query.prepare(
"SELECT COUNT(*) FROM " + m_szTableName +
" WHERE parent_id=:id");
959 query.bindValue(
":id", parentId);
961 if (query.exec() && query.next())
962 return query.value(0).toInt();
966int CDatabaseTree::AddNode(
const QString &name,
int parentId)
968 return m_FolderDB.AddFolder(name, parentId);
971bool CDatabaseTree::RenameNode(
int id,
const QString &newName)
973 return m_FolderDB.RenameFolder(
id, newName);
976bool CDatabaseTree::DeleteNode(
int id,
bool delKey)
978 return m_FolderDB.DeleteFolder(
id, [&, delKey](
int parentId)->
int {
979 return DeleteChild(parentId, delKey);
983bool CDatabaseTree::MoveNode(
int id,
int newParentId)
985 return m_FolderDB.MoveFolder(
id, newParentId);
988TreeItem CDatabaseTree::GetNode(
int id)
990 return m_FolderDB.GetFolder(
id);
993QList<TreeItem> CDatabaseTree::GetAllNodes()
995 return m_FolderDB.GetAllFolders();
998QList<TreeItem> CDatabaseTree::GetSubNodes(
int parentId)
1000 return m_FolderDB.GetSubFolders(parentId);
1003int CDatabaseTree::GetNodeCount(
int nParentId)
1005 return m_FolderDB.
GetCount(nParentId);
1010 return GetNodeCount(parentId) + GetLeafCount(parentId);
1018bool CDatabaseTree::ExportToJson(QJsonObject& obj)
1022 QSqlQuery query(GetDatabase());
1024 "SELECT id, parent_id, name, value, "
1025 "created_time, modified_time, last_visit_time FROM " + m_szTableName);
1026 bool success = query.exec();
1028 qCritical(log) <<
"Failed to export tree to json:"
1029 << m_szTableName << query.lastError().text()
1030 <<
"Sql:" << query.executedQuery();
1035 while(query.next()) {
1037 t.insert(
"id", query.value(0).toInt());
1038 t.insert(
"parent_id", query.value(1).toInt());
1039 t.insert(
"name", query.value(2).toString());
1040 t.insert(
"key", query.value(3).toInt());
1041 t.insert(
"created_time", query.value(4).toDateTime().toString());
1042 t.insert(
"modified_time", query.value(5).toDateTime().toString());
1043 t.insert(
"last_visit_time", query.value(6).toDateTime().toString());
1047 obj.insert(
"tree", tree);
1049 bRet = m_FolderDB.ExportToJson(obj);
1053bool CDatabaseTree::ImportFromJson(
const QJsonObject& obj)
1056 bRet = m_FolderDB.ImportFromJson(obj);
int GetCount(int parentId=0)
Get count
virtual int Add(const TreeItem &item)
Add item
QList< TreeItem > GetLeavesByKey(int key)
Get leaves
virtual bool OnDeleteKey(int key)
从 key 相关的表中删除 key
int GetCount(int parentId=0)
得到指定id节点下的所有节点和叶子数。不递归。
QList< TreeItem > GetLeaves(int nodeId)
Get the leaves under nodeId