以äžã§ã¯ã Qt㧠SQLiteã䜿çšããæ¹æ³ã«ã€ããŠèª¬æããŸãã èè ã¯ãå¯èœãªéãQtã®ããŒã¿ããŒã¹ããã°ã©ãã³ã°ãæ€èšããŸããã
äžèšã®ãªã³ã¯ããã©ããšããããã®2ã€ã®ãã°ããã補åã«ã€ããŠèªãããšãã§ããŸããç¹ã«ãSQLiteã®äŸã䜿çšããŠãQtã§ã®ããŒã¿ããŒã¹ããã°ã©ãã³ã°ãå ·äœçã«æ€èšããŸãã SQLiteã¯ãã¯ã©ã€ã¢ã³ããµãŒããŒã¢ãŒããã¯ãã£ãæããªããšããç¹ã§ãMySQLãªã©ã®ãéåžžã®ãããŒã¿ããŒã¹ãšã¯å€å°ç°ãªããšããèšããŸããã ã€ãŸããããŒã¿ããŒã¹ãšã³ãžã³ã¯ãããã°ã©ã ã察話ããåå¥ã«åäœããããã»ã¹ã§ã¯ãããŸããã SQLiteã¯ãããã°ã©ã ããªã³ã¯ãããã©ã€ãã©ãªã§ããããããšã³ãžã³ã¯ããã°ã©ã ã®äžå¯æ¬ ãªéšåã«ãªããŸãã ã€ãŸããããã°ã©ã ããééããããã¹ãŠã®ããŒã¿ãéåžžã®ãã¡ã€ã«ã«ä¿åããããšã«ãããšæ³åããŠãã ããã ããæŽããæ¥ãããŒã¿ããã¡ã€ã«ã«ä¿åããããšã«ããŸããããããªã¬ãŒã·ã§ãã«ãã®èŠ³ç¹ããæŽçããŸããã ãã®åŸãæ°ãããã¡ã€ã«æ§é ããç¹å¥ãªæ¹æ³ã§èªèãããå¿ èŠãããããšã«æ°ä»ããŸããã ãã®ããšãããå°ãªããšãããã®ããŒã¿ãã¡ã€ã«ãšã¢ããªã±ãŒã·ã§ã³éã®ãªã³ã¯ãæäŸããAPIãæäŸããå¿ èŠããããŸãã äžè¬ã«ãäžèšã®ã·ããªãªã®è«çã¹ããŒãã¡ã³ãã«åŸã£ãŠãããŒã¿ããŒã¹ãµãŒããŒãšå®éã«ã¯ã¯ã©ã€ã¢ã³ããå¿ èŠãšããªãããŒã¿ããŒã¹ã·ã¹ãã ãäœæããŸãã ãã¯ã©ã€ã¢ã³ããµãŒããŒãããŒã¿ããŒã¹ã·ã¹ãã ãšæ¯èŒããŠéåžžã«é«éã§ããããšãå€æããããã°ã©ã èªäœãç°¡çŽ åãããŠããŸãã
ç§ã¯Qtãšå奜çãªé¢ä¿ã«ãããæè¿ããã®DBæ©èœãå¿ èŠã«ãªããŸããã ãŸããMySQLãšã¯å奜çãªé¢ä¿ã«ããããã®ãšãã«éçºããŠããããã°ã©ã ã§QtãMySQLã§äœ¿çšããããšããŸããã MySQLãQtã«ãæ¥ç¶ãããããã®æéãšç¥çµã足ããªãã®ã§ãSQLtã䜿çšããããšã«ããŸããã QtSqlã¢ãžã¥ãŒã«ãæ¥ç¶ããã«ããèªã¿åããã¢ãžã¥ãŒã«ããµããŒãããŠçµã¿ç«ãŠãããŸãïŒã ããã§ããå¥ã®ã³ã³ãã¥ãŒã¿ãŒã«ããã°ã©ã ãã€ã³ã¹ããŒã«ããå¿ èŠãããå ŽåãMySQLãµãŒããŒãªã©ã®ã€ã³ã¹ããŒã«ãã匷å¶ããããããšã¯ãããŸããã ïŒç©è°ãéžããããã¯-ç§ã¯ç¥ã£ãŠããŸãïŒã
ãã¡ã€
çŸæç¹ã§ã¯ã SQLiteManagerããã°ã©ã ã䜿çšããŠããŒã¿ããŒã¹ãããŒãã«ãªã©ãäœæããŠããŸããæè¿äœ¿çšããŸããããããã«ããã°ã©ã ãæ°ã«å ¥ããŸããã ç§ã®ãäž»å補åãã«ã¯ïŒaïŒïŒ Qt Windows SDKãã€ã³ã¹ããŒã«ãããŠããã QtCreatorã䜿çšããŠããŸããããã«ãããèŒããŠãããšèšããŸãïŒ ç§èŠã§ã¯ãªããæ¬åœã«çŽ æŽãããIDEã§ã ïŒã
ãããŠãQtãšããŒã¿ããŒã¹
äžèšã§ãã§ã«æé»çã«èšåããããã«ãQtã«ã¯ãããŒã¿ããŒã¹ã䜿çšããããã®äŸ¿å©ãªããµãŒãã¹ããæäŸããå¥ã®ã¢ãžã¥ãŒã«-QtSqlããããŸãã Qtã®çµéšãããå Žåã¯ã.proãã¡ã€ã«ã«ã€ããŠç¥ã£ãŠããŸããããã§ãªããã°ã ç¥ãåãã«ãªããŸãã .proãã¡ã€ã«ã«æ¬¡ã®è¡ãè¿œå ããå¿ èŠãããããšãå¿ããªãã§ãã ããã
QT += sql
ããã¯QtSqlã¢ãžã¥ãŒã«ã䜿çšãããã®ã¯ã©ã¹ãæäœããããã«ãåãã¿ã€ãã«ãå«ããå¿ èŠããããŸãã
#include <QtSql>
Qtããã¯ã§ã¯ãQtSqlã¢ãžã¥ãŒã«ã®3ã€ã®ã¬ãã«ã«ã€ããŠèª¬æããŠããŸãã
- ãã©ã€ããŒã¬ãã«
- ããã°ã©ã ã¬ãã«
- ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã¬ãã«
ãã©ã€ããŒã¬ãã«
ãã©ã€ãã¬ãã«ã«ã¯ã次ã®ãããªç©çã¬ãã«ã§ããŒã¿ãåä¿¡ããããã®ã¯ã©ã¹ãå«ãŸããŸãã
- QSqlDriver
- QSqlDriverCreator <T *>
- QSqlDriverCreatorBaseã
- QSqlDriverPlugin
- QSqlResult
QSqlDriverCreatorã¯ãç¹å®ã®çš®é¡ã®ãã©ã€ããŒã«SQLãã©ã€ããŒãã¡ã¯ããªãŒãæäŸãããã³ãã¬ãŒãã¯ã©ã¹ã§ãã ãã³ãã¬ãŒããã©ã¡ãŒã¿ãŒã¯QSqlDriverã®ãµãã¯ã©ã¹ã§ããå¿ èŠããããŸãã
QSqlCreatorBaseã¯ãSQLãã©ã€ããŒãã¡ã¯ããªãŒã®åºæ¬ã¯ã©ã¹ã§ãããæäŸããQSqlDriverã¯ã©ã¹ã®ç¹å®ã®ãµãã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãè¿ãã«ã¯ã createObjectïŒïŒã¡ãœããããèšãæãããå¿ èŠããããŸãã
QSqlDatabaseã¯ãããŒã¿ããŒã¹ãã©ã€ããŒãã©ã°ã€ã³ã®èªã¿èŸŒã¿ãšç®¡çãæ åœããŸãã ããŒã¿ããŒã¹ãè¿œå ããããšïŒããã¯QSqlDatabase :: addDatabaseïŒïŒé¢æ°ã«ãã£ãŠè¡ãããŸãïŒãå¿ èŠãªãã©ã€ããŒãã©ã°ã€ã³ãïŒ QSqlDriverPluginã䜿çšããŠïŒããŒããããŸãã QSqlDriverPluginã¯ãã«ã¹ã¿ã QSqlDriverãã©ã°ã€ã³ã®æœè±¡åºæ¬ã¯ã©ã¹ãæäŸããŸãã
QSqlResultèªäœã¯ïŒãã¹ãŠã®Qtã¯ã©ã¹ã®ããã«ïŒããèªäœã«ã€ããŠèªãããã®ã¯ã©ã¹ã¯ç¹å®ã®ããŒã¿ããŒã¹ã®ããŒã¿ã«ã¢ã¯ã»ã¹ããããã®æœè±¡ã€ã³ã¿ãŒãã§ãŒã¹ãæäŸããŸãã QSqlQueryã¯QSqlResultã® DBåºæã®å®è£ ã®ã©ãããŒïŒãäžè¬åãïŒãæäŸãããããå®çšçãªèŠ³ç¹ããã QSqlResultã®ä»£ããã«QSqlQueryã䜿çšããŸãã
ãããã£ãŠããã©ã€ããŒã®ã¬ãã«ã¯ãç¬èªã®ãã©ã€ããŒãäœæãããšãã«äœ¿çšããããšãéèŠã§ããããããã©ã€ããŒã®ãã¬ãŒã ã¯ãŒã¯ãšããŠäœ¿çšã§ããïŒæãé¢å¿ã®ããïŒã³ãŒãã®äŸã瀺ããŸãã
class XyzResult : public QSqlResult { public: XyzResult(const QSqlDriver *driver) : QSqlResult(driver) {} ~XyzResult() {} protected: QVariant data(int /* index */) { return QVariant(); } bool isNull(int /* index */) { return false; } bool reset(const QString & /* query */) { return false; } bool fetch(int /* index */) { return false; } bool fetchFirst() { return false; } bool fetchLast() { return false; } int size() { return 0; } int numRowsAffected() { return 0; } QSqlRecord record() const { return QSqlRecord(); } }; class XyzDriver : public QSqlDriver { public: XyzDriver() {} ~XyzDriver() {} bool hasFeature(DriverFeature /* feature */) const { return false; } bool open(const QString & /* db */, const QString & /* user */, const QString & /* password */, const QString & /* host */, int /* port */, const QString & /* options */) { return false; } void close() {} QSqlResult *createResult() const { return new XyzResult(this); } };
ããã°ã©ã ã¬ãã«
ããŒã¿ããŒã¹ã«æ¥ç¶ããã«ã¯ããŸãéçã¡ãœããQSqlDatabase :: addDatabaseïŒïŒã䜿çšããŠãã©ã€ããŒãã¢ã¯ãã£ãã«ããå¿ èŠããããŸãã ã¡ãœããã¯ãDBMSãã©ã€ãã®èå¥åã瀺ãæååãåŒæ°ãšããŠåãåããŸãã QSQLITEãå¿ èŠã«ãªããŸãã
QSqlDatabase sdb = QSqlDatabase::addDatabase("QSQLITE"); sdb.setDatabaseName("db_name.sqlite"); if (!sdb.open()) { //.... }
addDatabaseéçé¢æ°ã«ã¯ããã©ã€ããŒåã§ã¯ãªããã©ã€ããŒèªäœïŒ QSqlDriver *ïŒãåãåããªãŒããŒããŒãããããå åŒãããããŸãã
æ¥ç¶ã¯openïŒïŒã¡ãœããã䜿çšããŠè¡ãããŸãã QSqlDatabaseã¯ã©ã¹ã¯ãããŒã¿ããŒã¹æ¥ç¶ãè¡šããŸãã æ¥ç¶ã¯ããµããŒããããŠããããŒã¿ããŒã¹ãã©ã€ããŒãä»ããããŒã¿ããŒã¹ãžã®ã¢ã¯ã»ã¹ãæäŸããŸãã åãããŒã¿ããŒã¹ã«è€æ°ã®æ¥ç¶ã確ç«ã§ããããšãéèŠã§ãã
æ¥ç¶äžã«ãšã©ãŒãçºçããå ŽåïŒ openïŒïŒã¡ãœããïŒ ããšã©ãŒã«é¢ããæ å ±ã¯QSqlDatabase :: lastErrorïŒïŒã¡ãœããããååŸã§ããŸãïŒ QSqlErrorãè¿ããŸãïŒã
if (!sdb.open()) { qDebug() << sdb.lastError().text(); }
Qtã䜿çšããŠSQLã³ãã³ããå®è¡ããæ¹æ³ãæ€èšããŠãã ããã QSqlQueryã¯ã©ã¹ã䜿çšããŠãããè¡ãããšãã§ããŸãã ãã®ã¯ã©ã¹ã¯ã SELECT ã INSERT ã UPDATE ã DELETEãªã©ã®DMLïŒããŒã¿æäœèšèªïŒåŒã®å®è¡ã ãã§ãªãã CREATE TABLEãªã©ã®DDLïŒããŒã¿å®çŸ©èšèªïŒåŒã®å®è¡ã«ã䜿çšã§ããŸãã SQLæšæºã§ã¯ãªãDBåºæã®ã³ãã³ããå®è¡ã§ããããšã«æ³šæããŠãã ããïŒããšãã°ãPSQLã®å Žå-ãSET DATESTYLE = ISOãïŒã
æ£åžžã«å®è¡ããããªã¯ãšã¹ãã¯ãªã¯ãšã¹ãã®ã¹ããŒã¿ã¹ããã¢ã¯ãã£ããã«èšå®ããããã isActiveïŒïŒã¯ true ãè¿ããŸã ãããã§ãªãå Žåãç¶æ ã¯éã¢ã¯ãã£ãã«èšå®ãããŸãã ã¯ãšãªã¯éåžžã®æååã®åœ¢åŒã§çºè¡ãããã³ã³ã¹ãã©ã¯ã¿ãŒãŸãã¯QSqlQuery :: execïŒïŒã¡ãœããã«æž¡ãããŸãã æåã®ã±ãŒã¹ã§ã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒã«æž¡ããšãã«ãã³ãã³ããèªåçã«èµ·åãããŸãïŒãªããžã§ã¯ãã®æ§ç¯æïŒã
éåžžã«èå³æ·±ãã®ã¯ã QSqlQueryãæäŸããããã²ãŒã·ã§ã³æ©èœã§ã ã ããšãã°ã SELECTã¯ãšãªã®åŸã nextïŒïŒãpreviousïŒïŒãfirstïŒïŒãlastïŒïŒãããã³seekïŒïŒã¡ãœããã䜿çšããŠãåéãããããŒã¿ãããã²ãŒãã§ããŸãã
QSqlQuery query("SELECT country FROM artist"); while (query.next()) { QString country = query.value(0).toString(); do_something(country); }
nextïŒïŒã¡ãœããã䜿çšãããšãããŒã¿ã®æ¬¡ã®è¡ã«ç§»åããåã®è¡ã«ããããpreviousïŒïŒãåŒã³åºãããšãã§ããŸãã firstïŒïŒãlastïŒïŒã¯ãããããçµæããæåã®ã¬ã³ãŒããååŸããŸãã seekïŒïŒã¯æŽæ°ã€ã³ããã¯ã¹ãååŸããåä¿¡ããã€ã³ããã¯ã¹ã®çµæããã¬ã³ãŒããååŸããæœåºãããã¬ã³ãŒãã«ãã¯ãšãªãé 眮ãããŸãã ãµã€ãºïŒïŒã¡ãœããã䜿çšããŠããµã€ãºããŸãã¯ããŒã¿ã®è¡æ°ïŒçµæïŒã確èªã§ããŸãã æåã®ã¬ã³ãŒããäœçœ®0ã«ãããã¯ãšãªãã¢ã¯ãã£ããªç¶æ ã§ããå¿ èŠãããã isSelect ïŒïŒãtrue ïŒæåŸã®ã¯ãšãªãSELECTã®å Žåã«çºçïŒãè¿ããŠããseekïŒïŒã¡ãœãããåŒã³åºãããšã«æ³šæããŠãã ããã å ¬åŒããã¥ã¡ã³ãã® seek ïŒïŒã¡ãœããã«ã€ããŠè©³ããèªãããšããå§ãããŸãã
ã¯ãšãªæååãQSqlQueryã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ã«æž¡ããšããªããžã§ã¯ãã®äœææã«-æ§ç¯äžã«ã¯ãšãªãå®è¡ãããããšãäžã§è¿°ã¹ãŸããã exec ïŒïŒã¡ãœããã䜿çšãããšãããã°ããªã¯ãšã¹ãã®å®è¡æéãç£èŠã§ããŸãã 建èšæ¥
QSqlQuery query("SELECT country FROM artist");
次ã®ããã«è¡šãããšãã§ããŸãã
QSqlQuery query; query.exec("SELECT country FROM artist");
ãã®ããã exec ïŒïŒã¯èŠæ±ãQStringãšããŠåãåããŸãã ãªã¯ãšã¹ããæºãããããšãæåããå Žåããã®ã¡ãœããã¯trueãè¿ããç¶æ
ãã¢ã¯ãã£ãã«èšå®ããŸãããã以å€ã®å Žåããã¹ãŠã¯ç€ºãããæäœãšãå察ãã«ãªããŸãã ãã¡ãããã¯ãšãªæååã¯ãèŠæ±ãããããŒã¿ããŒã¹ïŒç¹ã«SQLæšæºïŒã®æ§æèŠåã«åŸãå¿
èŠãããããšãèŠããŠããå¿
èŠããããŸãã
èå³æ·±ãã®ã¯ãå®è¡åŸãèŠæ±ãç¡å¹ãªïŒuyïŒïŒã¬ã³ãŒãã«é 眮ãããããšã§ããã€ãŸããçµæãé©åã«äœ¿çšããã«ã¯ãããšãã°next ïŒïŒã¡ãœããã䜿çšããå¿ èŠããããŸãã
exec ïŒïŒã¡ãœããã«ã¯ãåŒæ°ãåãåããªããªãŒããŒããŒãããã代æ¿ããããŸãã ãã®ããªã¢ã³ãexec ïŒïŒã®åŒã³åºãã¯ããã®åã«æºåãããèŠæ±ãå®è¡ããŸãã 泚æããŠãã ãã-ãæºåæžã¿ãã ãããè¡ãã«ã¯ãèŠæ±ã®æºåãæåããå Žåã«trueãè¿ãprepare ïŒïŒã¡ãœããã䜿çšããŸãã
ã¡ãœããã®éèŠæ§ããŸãã¯èšããããšã¯ã bindValue ïŒïŒã䜿çšããŠå€ããã€ã³ãããããã®ããã¬ãŒã¹ãã«ããŒãããªã¯ãšã¹ãã«å«ããããšãã§ããããšã§ãã
QSqlQuery my_query; my_query.prepare("INSERT INTO my_table (number, address, age)" "VALUES (:number, :address, :age);"); my_query.bindValue(":number", "14"); my_query.bindValue(":address", "hello world str."); my_query.bindValue(":age", "37");
å¿åãã©ã¡ãŒã¿ãŒã®ãªãã·ã§ã³ã䜿çšããããšãã§ããŸãã
QSqlQuery my_query; my_query.prepare("INSERT INTO my_table (number, address, age)" "VALUES (?, ?, ?);"); my_query.bindValue("14"); my_query.bindValue("hello world str."); my_query.bindValue("37");
æåŸã«ãQStringãæäŸããã€ã³ã©ã€ã³åŒæ°ãåçŽã«äœ¿çšã§ããŸãã
QSqlQuery my_query; my_query.prepare( QString("INSERT INTO my_table (number, address, age) VALUES (%1, '%2', %3);") .arg("14").arg("hello world str.").arg("37") );
ã³ã³ãã€ã«æžã¿ïŒã³ããŒããŠè²Œãä»ããŠèªåã®ã¢ã€ãã¢ã«ïŒââã®äŸïŒ
#include <QtGui/QApplication> #include <QtSql> int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); QSqlDatabase dbase = QSqlDatabase::addDatabase("QSQLITE"); dbase.setDatabaseName("my_db.sqlite"); if (!dbase.open()) { qDebug() << "- !"; return -1; } QSqlQuery a_query; // DDL query QString str = "CREATE TABLE my_table (" "number integer PRIMARY KEY NOT NULL, " "address VARCHAR(255), " "age integer" ");"; bool b = a_query.exec(str); if (!b) { qDebug() << " , !"; } // DML QString str_insert = "INSERT INTO my_table(number, address, age) " "VALUES (%1, '%2', %3);"; str = str_insert.arg("14") .arg("hello world str.") .arg("37"); b = a_query.exec(str); if (!b) { qDebug() << " , , ?"; } //..... if (!a_query.exec("SELECT * FROM my_table")) { qDebug() << " , ."; return -2; } QSqlRecord rec = a_query.record(); int number = 0, age = 0; QString address = ""; while (a_query.next()) { number = a_query.value(rec.indexOf("number")).toInt(); age = a_query.value(rec.indexOf("age")).toInt(); address = a_query.value(rec.indexOf("address")).toString(); qDebug() << "number is " << number << ". age is " << age << ". address" << address; } return app.exec(); }
ã¯ãšãªçµæãååŸããã«ã¯ã QSqlQuery :: valueïŒïŒã¡ãœãããåŒã³åºãå¿ èŠããããŸãããã®ã¡ãœããã§ã¯ãäŸã§record ïŒïŒã¡ãœããã䜿çšãããåçªå·ãæž¡ãå¿ èŠããããŸãã ãã®ã¡ãœããã¯ã SELECTã¯ãšãªã«é¢é£ããæ å ±ãå«ãQSqlRecordã¯ã©ã¹ã®ãªããžã§ã¯ããè¿ããŸãã QSqlRecord :: indexOfïŒïŒãåŒã³åºãããšã«ãããåã€ã³ããã¯ã¹ãååŸããŸãã
valueïŒïŒã¡ãœããã¯QVariantåïŒãªããžã§ã¯ãã«ç°ãªãåã®å€ãå«ããããšãã§ããã¯ã©ã¹ïŒã®å€ãè¿ããããã¡ãœããQVariant :: toIntïŒïŒããã³QVariant :: toStringïŒïŒã䜿çšããŠçµæã®å€ãå€æããŸããã
ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã¬ãã«
QtSqlã¢ãžã¥ãŒã«ã¯ããã¬ãŒã³ããŒã·ã§ã³ã§äœ¿çšããããã®å€æ°ã®ã¢ãã«ãæäŸããããšã«ãããã€ã³ã¿ãã¥ãŒã®æŠå¿µããµããŒãããŠããŸãã ãã®æŠå¿µã«æ £ããã«ã¯ã ãã¡ããã芧ãã ãã ã
äŸãšããŠã QSqlTableModelã¯ã©ã¹ã䜿çšãããšãããŒã¿ã衚圢åŒããã³é局圢åŒã§è¡šç€ºã§ããŸãã æç®ã«ãããšãã€ã³ã¿ãã¥ãŒã¯è¡šããŒã¿ã衚瀺ããæãç°¡åãªæ¹æ³ã§ãããããã§ã¯è¡šã®è¡ã調ã¹ããµã€ã¯ã«ã¯å¿ èŠãããŸããã 以äžã«å°ããªäŸã瀺ããŸãã
#include <QtGui/QApplication> #include <QtSql> #include <QTableView> int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); QSqlDatabase dbase = QSqlDatabase::addDatabase("QSQLITE"); dbase.setDatabaseName("my_db.sqlite"); if (!dbase.open()) { qDebug() << "- !"; return -1; } QTableView view; QSqlTableModel model; model.setTable("my_table"); model.select(); model.setEditStrategy(QSqlTableModel::OnFieldChange); view.setModel(&model); view.show(); return app.exec(); }
æ¥ç¶åŸã QTableViewããŒãã«ãã¥ãŒãªããžã§ã¯ããšQSqlTableModelããŒãã«ã¢ãã«ãªããžã§ã¯ããäœæãããŸãã setTable ïŒïŒã¡ãœããã¯ã¢ãã«ã®çŸåšã®ããŒã¹ãèšå®ãã select ïŒïŒåŒã³åºãã¯ããŒã¿ã§æºããããŸãã
QSqlTableModelã¯ã©ã¹ã¯ã次ã®ç·šéæŠç¥ãæäŸããŸãïŒ setEditStrategy ïŒïŒã䜿çšããŠèšå®ïŒïŒ
- OnRowChange-ãŠãŒã¶ãŒãããŒãã«ã®å¥ã®è¡ã«ç§»åãããšããã«ããŒã¿ãèšé²ããŸãã
- OnFieldChange-ãŠãŒã¶ãŒãããŒãã«å ã®å¥ã®ã»ã«ã«ç§»åããåŸã«èšé²ããŸãã
- OnManualSubmit - submitAll ïŒïŒã¹ããããžã®åŒã³åºãã§ããŒã¿ãèšé²ããŸãã revertAll ïŒïŒã¹ããããåŒã³åºããããš ãããŒã¿ã¯å ã®ç¶æ ã«æ»ããŸãã
æçš¿ã¯ããšããã«è¿ã¥ãããšæããŸãã誰ãã圌ãæ¢ããŠãããã®ãããã§èŠã€ãã誰ãããåŸã§ãæ å ±ãå¿ èŠãšããããšãæã¿ãŸããã