无法复制表格数据

时间:2018-01-31 23:19:51

标签: android android-sqlite

我试图复制我的表格(它没有任何约束,只有INT带有自动增量的主键)。我写了一个如下方法:

public void copyTable(String srcTableName, String dstTableName,
                      String[] srcColumns, String[] dstColumns) {
    String srcColumnsStr = TextUtils.join(", ", srcColumns);
    String dstColumnsStr = TextUtils.join(", ", dstColumns);
    String sql = String.format("INSERT INTO %s (%s) SELECT %s FROM %s",
            dstTableName, dstColumnsStr, srcColumnsStr, srcTableName);

    db.execSQL(sql);
}

在调试器中,我要下一个sql-request:

INSERT INTO timetables (auto_complete, break_duration, color, first_lesson_time, first_week_date, id, lesson_duration, symbol, title, weeks) SELECT _auto_complete, _break_duration, _color, _first_lesson_time, _first_week_date, _id, _lesson_duration, _symbol, _title, _weeks FROM tmptimetables

在这张表中,我有一行,但在此请求之后,该行未被复制到新表中。什么错了?

TABLES

CREATE TABLE tmptimetables (_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,_title NVARCHAR(256) NOT NULL,_weeks INTEGER NOT NULL,_first_week_date INTEGER NOT NULL,_auto_complete INTEGER NOT NULL,_first_lesson_time INTEGER NOT NULL,_lesson_duration INTEGER NOT NULL,_break_duration INTEGER NOT NULL,_color INTEGER NOT NULL,_symbol NCHAR(1) NOT NULL);
CREATE TABLE timetables (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,title NVARCHAR(256) NOT NULL,weeks INTEGER NOT NULL,first_week_date INTEGER NOT NULL,auto_complete INTEGER NOT NULL,first_lesson_time INTEGER NOT NULL,lesson_duration INTEGER NOT NULL,break_duration INTEGER NOT NULL,color INTEGER NOT NULL,symbol NCHAR(1) NOT NULL);

1 个答案:

答案 0 :(得分:1)

你的表确实有约束。 NOT NULL是一种约束。它等于如果此列为NULL,则不插入此表。但是,我不相信这是问题所在。

  

NOT NULL约束 (突出显示已添加)只能附加到列定义,而不是   指定为表约束。毫不奇怪,一个NOT NULL   约束规定关联列可能不包含NULL   值。插入新项时尝试将列值设置为NULL   行或更新现有的行会导致约束违规。   CREATE TABLE - SQL Data Constraints

相反,问题可能是;按照: -

  

在这张表中,我有一行,但在此请求之后,行没有   复制到新表中。什么错了?

您正尝试将 tmptimetables 表格中的(插入)复制到时间表表格中。 tmptimetables 虽然你可能真的想要从时间表表复制到tmptimetables(如果不是,那么可能性就是时间表表已经有一行你想要插入的id。)

如果是,那么而不是: -

String sql = String.format("INSERT INTO %s (%s) SELECT %s FROM %s",
        dstTableName, dstColumnsStr, srcColumnsStr, srcTableName);

使用

String sql = String.format("INSERT INTO %s (%s) SELECT %s FROM %s",
  srcTableName, srcColumnsStr, dstColumnsStr, dstTableName);

或者在调用copyTable方法时可能更正确地更改参数,以便: -

  • 第一个参数是时间表表的名称,
  • 第二个参数是 tmptimetables 表的名称,
  • 第三个参数是时间表表和
  • 列的字符串数组
  • 第四个参数是 tmptimetables 列的字符串数组。

  • 简而言之,插入成为: -

    INSERT INTO tmptimetables ( _auto_complete, _break_duration, _color, _first_lesson_time, _first_week_date, _id, _lesson_duration, _symbol, _title, _weeks ) SELECT auto_complete, break_duration, color, first_lesson_time, first_week_date, id, lesson_duration, symbol, title, weeks FROM timetables

注意如果以上不是问题,我建议您编辑问题并包含两个表中的实际数据。猜测你试图使用特定的id插入并且该id已经存在,这将违反INTEGER PRIMARY KEY约束

  • PS NOT NULL是隐含的,因此无需编码NOT NULL
  • 此外,您可能希望阅读SQLite Autoincrement ,因为{em}很可能会因为而对{em}产生额外的CPU,内存,磁盘空间和磁盘I / O开销,如果不是严格需要,应该避免。通常不需要它。