创建SQLite数据库并尝试添加记录 - 抛出错误

时间:2014-01-22 02:56:37

标签: java sqlite

我有一个webapp,我试图建立一个SQLite数据库。在这一点上,我建立一个基础非常简单。此时只有两张桌子。一个表使用外键约束指向另一个表。我遇到的问题是当我尝试插入数据时,我总是收到错误Error processing SQL: could not execute statement due to a constraint failure (19 constraint failed) -- Code: 6。显然,代码6意味着表被锁定。如果我可以成功地将值插入其中,如何锁定?困惑...

我的代码......

我用这个来设置表格:

 // Create a system table, if it doesn't exist
  db.transaction(function(tx){
    tx.executeSql('CREATE TABLE IF NOT EXISTS system(systemID TEXT PRIMARY KEY, numZones INT NULL, numHeads INT NULL)', [],nullHandler,errorHandler);
  },errorHandler, successCallBack);


  // Create a work order table, if it doesn't exist
  db.transaction(function(tx){
    tx.executeSql('CREATE TABLE IF NOT EXISTS wo(woID_id TEXT PRIMARY KEY, woType TEXT NOT NULL, systemID_fk TEXT NOT NULL, FOREIGN KEY (systemID_fk) REFERENCES system(systemID))', [],nullHandler,errorHandler);
  },errorHandler, successCallBack);

据推测,现在我将有两个表,一个有一个指向另一个表的字段。我正在引入一个JSon提要,解析它,并尝试将它放入这两个表中。这是解析的代码:

function GetSystems(){

  // First we see if there are credentials stored. If not, we don't try to retrieve the work orders.

  db.transaction(function(transaction){
    transaction.executeSql('SELECT * FROM Creds;',[], function(transaction, result) {
      // If the user hasn't entered their creds yet, we create a new record, otherwise update the current one.
      if(result.rows.length != 0){
        var row;
        db.transaction(function(transaction){
          transaction.executeSql('SELECT * FROM Creds where id=1;',[],function(transaction, result) {
            $.getJSON(baseURL + "get-wos/?callback=?", { username:result.rows.item(0).username, password:result.rows.item(0).password }, function(data) {
              $.each(data, function(i, obj) {
                db.transaction(function(transaction){
                  transaction.executeSql('INSERT INTO system(systemID, numZones, numHeads) VALUES (?, null, null)', [obj.systemID], nullHandler, errorHandler);
                  transaction.executeSql('INSERT INTO wo (woID, woType, systemID_fk) ' +
                                         'VALUES ((SELECT systemID FROM system WHERE systemID = ' + obj.systemID + '), ?, ?)',
                                         [obj.woID, obj.woType], nullHandler, errorHandler);
                })
              });
            });
          });
        });
      }
    });
  });
}

当我运行上面的代码时,systems已正确加载但wos未正确加载。我对这个问题的研究告诉我,我可能会遇到一些问题。一个建议是表中可能已有数据。我通过使用drop tables函数完全清除数据库来解决这个问题(我使用Chrome开发工具来调查数据库)。

所以真的,我不确定我做错了什么。我的语法是否因插入外键约束而不正确?

解决

我偶然发现了this线程,@ havexz提到插入中的变量并没有引用它。我看着我的,它有同样的问题。这是我编辑的插件,用于添加带外键的记录。请注意systemID='"而不是原始版systemID="。我错过了变量周围的单引号。

 db.transaction(function(transaction){
   transaction.executeSql("INSERT INTO wo (woID, woType, systemID_fk) " +
                          "VALUES (?, ?, (SELECT systemID FROM system WHERE systemID='" + obj.systemID + "'))", [obj.woID, obj.woType], nullHandler, errorHandler);
 });

1 个答案:

答案 0 :(得分:0)

INSERT wo的参数顺序是否正确?看起来您将systemID放入woID字段而不是systemID_fk有约束。应该是:

transaction.executeSql('INSERT INTO wo (woID, woType, systemID_fk) ' +
                       'VALUES (?, ?, (SELECT systemID FROM system WHERE systemID = ' + obj.systemID + '))',
                       [obj.woID, obj.woType], nullHandler, errorHandler);