commit 9c2f773f90bf08195e58b462ce43ea37685392e1
Author: Christian Ehringfeld <c.ehringfeld@t-online.de>
Date:   Tue Apr 14 19:39:06 2015 +0200

    creating tables without relations works!!!!!!!!!

diff --git a/example/main.cpp b/example/main.cpp
index 926513f..8033f1c 100644
--- a/example/main.cpp
+++ b/example/main.cpp
@@ -9,14 +9,18 @@
 #include <QMetaProperty>
 #include "models/group.h"
 #include "entity.h"
+#include "entitymanager.h"
 #include <QGenericReturnArgument>
 /**
   * create,remove und merge funktionieren
  */
 
 int main(int argc, char *argv[]) {
-//    OpenTeacherTool::EntityManager *e = new OpenTeacherTool::EntityManager("QSQLITE",QDir::currentPath() + "/db.sqlite");
-
+    CuteEntityManager::EntityManager *e = new CuteEntityManager::EntityManager("QSQLITE",QDir::currentPath() + "/db.sqlite");
+    QSharedPointer<Artikel> a = QSharedPointer<Artikel>(new Artikel(20.0,"Müsli"));
+    auto ep = a.dynamicCast<CuteEntityManager::Entity>();
+    qDebug() << e;
+    qDebug() << "Tabelle artikel erstellt:" << e->createTable(ep);
 //    OpenTeacherTool::Artikel *b= new OpenTeacherTool::Artikel(30,"Peter123");
 //    OpenTeacherTool::Entity *entity = b->getEntity();
 //    qDebug() << "findByAttributes:" << e->findByAttributes(entity,true);
diff --git a/example/models/group.h b/example/models/group.h
index aafbf9a..c488d99 100644
--- a/example/models/group.h
+++ b/example/models/group.h
@@ -8,6 +8,7 @@
 #include <QVariantList>
 //#include <QQuickView>
 #include "artikel.h"
+#include <QSharedPointer>
 
 
 
diff --git a/src/entity.h b/src/entity.h
index 724669f..f33091f 100644
--- a/src/entity.h
+++ b/src/entity.h
@@ -20,11 +20,14 @@
 #include <QMap>
 #include <QDebug>
 #include <QObject>
-#include "enums/databasetype.h"
 #include "relation.h"
 #include <QStringList>
 namespace CuteEntityManager {
 
+/**
+ * You should name any persisted property objectName, because its pre used by Qt and will be ignored by Entity Manager
+ * @brief The Entity class
+ */
 class Entity : public QObject {
     Q_OBJECT
     Q_PROPERTY(qint64 id READ getId WRITE setId NOTIFY idChanged)
diff --git a/src/entitymanager.cpp b/src/entitymanager.cpp
index 25aa866..27fd54d 100644
--- a/src/entitymanager.cpp
+++ b/src/entitymanager.cpp
@@ -292,6 +292,10 @@ bool EntityManager::remove(QSharedPointer<Entity> &entity) {
     return rc;
 }
 
+bool EntityManager::createTable(const QSharedPointer<Entity> &entity) {
+    return this->schema.data()->getQueryBuilder().data()->createTable(entity);
+}
+
 void EntityManager::setConnectionNames(QStringList list) {
     EntityManager::connectionNames = list;
 }
diff --git a/src/entitymanager.h b/src/entitymanager.h
index 7d803d2..e548a0e 100644
--- a/src/entitymanager.h
+++ b/src/entitymanager.h
@@ -71,7 +71,7 @@ class EntityManager {
     bool merge(QSharedPointer<Entity> &entity);
     bool remove(QSharedPointer<Entity> &entity);
     bool removeAll(QString tblname);
-    bool createTable(QSharedPointer<Entity> &entity);
+    bool createTable(const QSharedPointer<Entity> &entity);
     qint8 count(Entity *entity, bool ignoreID = true);
     QSharedPointer<Database> getDb() const;
     void setDb(const QSharedPointer<Database> &value);
diff --git a/src/querybuilder.cpp b/src/querybuilder.cpp
index e2235eb..8fe7aad 100644
--- a/src/querybuilder.cpp
+++ b/src/querybuilder.cpp
@@ -7,16 +7,6 @@
 
 using namespace CuteEntityManager;
 
-//bool QueryBuilder::createTable(QString tablename, QHash<QString, QString> tableDefinition) {
-////    QHash<QString, QString> Artikel::getProperties(DatabaseType type) {
-////        QHash<QString, QString> h = QHash<QString, QString>();
-////        h.insert("id",this->idColumnSQL());
-////        h.insert("preis","DOUBLE");
-////        h.insert("name","TEXT");
-////        return h;
-////    }
-//}
-
 QueryBuilder::QueryBuilder(QSharedPointer<Schema> schema, QSharedPointer<Database> database) {
     this->schema = schema;
     this->database = database;
@@ -52,9 +42,9 @@ QString QueryBuilder::createTableQuery(const QString &tableName, const QHash<QSt
         if (first) {
             first = false;
         } else {
-            s.append(',');
+            s.append(", ");
         }
-        s.append(this->schema.data()->quoteColumnName(i.key())).append(" " + i.value());
+        s.append(this->schema.data()->quoteColumnName(i.key())).append(" " + this->getColumnType(i.value()));
         ++i;
     }
     s.append("\n);");
@@ -154,7 +144,8 @@ QHash<QString, QString> QueryBuilder::generateTableDefinition(const QSharedPoint
     for (int var = 0; var < o->propertyCount(); ++var) {
         o->property(var);
         auto m = o->property(var);
-        if (m.isReadable() && !entity.data()->getTransientAttributes().contains(m.name())) {
+        if (m.name() != QString("objectName") && m.isReadable()
+                && !entity.data()->getTransientAttributes().contains(m.name())) {
             if (m.isEnumType()) {
                 map.insert(m.name(), this->schema.data()->getTypeMap().data()->value(this->schema.data()->TYPE_INTEGER));
             } else if (relations.contains(m.name())) {
@@ -206,7 +197,7 @@ QString QueryBuilder::getColumnType(const QString &type) const {
     }
     //cant believe that this could work in Qt
     //https://github.com/yiisoft/yii2/blob/master/framework/db/QueryBuilder.php
-    QRegularExpression reg = QRegularExpression(QRegularExpression::escape("/^(\w+)\((.+?)\)(.*)$/"));
+    QRegularExpression reg = QRegularExpression(QRegularExpression::escape("/^(\\w+)\((.+?)\\)(.*)$/"));
     reg.optimize();
     QRegularExpressionMatchIterator i = reg.globalMatch(type, 0, QRegularExpression::PartialPreferFirstMatch);
     short s = 0;
@@ -218,12 +209,12 @@ QString QueryBuilder::getColumnType(const QString &type) const {
             ok = true;
         }
         if (ok) {
-            return before.replace(QRegularExpression::escape("/\(.+\)/"), "(" + i.next().captured() + ")");
+            return before.replace(QRegularExpression::escape("/\\(.+\\)/"), "(" + i.next().captured() + ")");
         }
         s++;
     }
-    reg = QRegularExpression(QRegularExpression::escape("/^(\w+)\s+/"));
-    QRegularExpressionMatchIterator i = reg.globalMatch(type, 0, QRegularExpression::PartialPreferFirstMatch);
+    reg = QRegularExpression(QRegularExpression::escape("/^(\\w+)\\s+/"));
+    i = reg.globalMatch(type, 0, QRegularExpression::PartialPreferFirstMatch);
     if (i.hasNext()) {
         return before.replace(QRegularExpression::escape("/^w+/"), i.next().captured());
     }
@@ -238,7 +229,7 @@ QHash<QString, QVariant> QueryBuilder::getEntityAttributes(const QSharedPointer<
     for (int var = 0; var < metaObject->propertyCount(); ++var) {
         auto p = metaObject->property(var);
         QString name = QString(p.name());
-        if (p.isValid() && !transientAttrs.contains(name)) {
+        if (p.isValid() && !transientAttrs.contains(name) && name != QString("objectName")) {
             QVariant v = p.read(e);
             //Relation
             if (v.canConvert<Entity *>()) {
diff --git a/src/schema.cpp b/src/schema.cpp
index ea7170c..00f05d7 100644
--- a/src/schema.cpp
+++ b/src/schema.cpp
@@ -9,6 +9,7 @@ Schema::Schema(QSharedPointer<Database> database) {
     this->database = database;
     this->abstractTypeMap = QSharedPointer<QHash<QString, QString>>(new QHash<QString, QString>());
     this->queryBuilder = QSharedPointer<QueryBuilder>();
+    this->typeMap = QSharedPointer<QHash<QString, QString>>(new QHash<QString, QString>());
     this->initAbstractDatabaseTypes();
 }
 
@@ -110,8 +111,8 @@ void Schema::refresh() {
 
 QString Schema::getRawTable(QString name) {
     if (name.indexOf("{{")) {
-        QRegularExpression re(QRegularExpression::escape("/\{\{(.*?)\}\}/"));
-        return name.replace(re, QRegularExpression::escape("\1"));
+        QRegularExpression re(QRegularExpression::escape("/\\{\{(.*?)\\}\\}/"));
+        return name.replace(re, QRegularExpression::escape("\\1"));
     }
     return name;
 }
