【问题标题】:Unable to INSERT in SQLite, Error code:19无法在 SQLite 中插入,错误代码:19
【发布时间】:2011-03-25 20:11:52
【问题描述】:

当我尝试运行以下命令时:

  ContentValues cv = new ContentValues();
  cv.put(table_LocalSettings_Unit, input);
  mDb.insert(table_LocalSettings, "", cv);

我收到以下错误:

错误插入单位 = 0;
SqliteConstraintException:错误代码 19 约束失败。

应该是什么问题? 表sql代码为:

 "create table if not exists " + table_LocalSettings + "( " + table_LocalSettings_ID
     + " INTEGER PRIMARY KEY NOT NULL , " + table_LocalSettings_MapType
     + " INTEGER NOT NULL , " + table_LocalSettings_Visib + " BIT NOT NULL , "
     + table_LocalSettings_Unit + " INTEGER DEFAULT 0 NOT NULL , "
     + table_LocalSettings_SpeedUnit + " INTEGER NOT NULL , "
     + table_LocalSettings_Alert + " BIT NOT NULL ," + table_LocalSettings_UserID
     + " INTEGER DEFAULT -1 , " + table_LocalSettings_Username + " VARCHAR , "
     + table_LocalSettings_PowerSave + " VARCHAR , " + table_LocalSettings_PremiumUser
     + " INTEGER NOT NULL DEFAULT 0);";

【问题讨论】:

    标签: android sqlite insert


    【解决方案1】:

    约束失败

    听起来你的主键已经存在于表中

    【讨论】:

    • 我已经更新了第一个问题。你看到我的 sql 有什么问题吗?我不能!
    • 听起来您没有附加到主键的 contentvalues 值。这是失败的,因为表创建缺少自动增量指令,它会是这样的:'_id' integer PRIMARY KEY AUTOINCREMENT NOT NULL
    • 但这适用于另一列,table_LocalSettings_Unit。我没有看到您为 table_LocalSettings_ID 列插入值。将该自动增量指令添加到您的表创建中,并且可能会开始工作。 Megertteted hogy miert tortenik igy?
    • 不幸的是不起作用。官方的 sqlite 文档说:“INTEGER PRIMARY KEY”还包括 AUTOINCREMENT 关键字。所以,我不需要添加它:(
    • 把桌子从设备上取下来,在 SQLite 引擎中测试,看看是否有效。我仍然相信您的自动增量内容已损坏。
    【解决方案2】:

    我遇到了同样的问题,Pentium 10 的回答让我朝着正确的方向前进。在验证波纹管代码错误然后更正它之后,我在模拟器中从该应用程序中清除了数据,并重新创建了数据库,现在可以正常工作了。

         "create table if not exists " + DATABASE_TABLE + " (" + _ID + " integer primary key autoincrement," +
         " ItemName text not null, ItemID text not null, Image text not null, ImageDate text not null);";
    

    我认为我的一个问题是我有一个额外的专栏。我之前删除了其中一列,并没有从上面的行中删除它。

    主要是三重检查代码的错误和拼写,如果使用模拟器清除数据。

    【讨论】:

      【解决方案3】:

      您可以从表中删除not null,它会正常工作。像这样:
      对:

      String callTable = "CREATE TABLE IF NOT EXISTS '%s'" + "(userid VARCHAR, callwith VARCHAR, calltype VARCHAR, callstart time, callend time, callmedia VARCHAR" + ");"
      

      错误:

      String callTable = "CREATE TABLE IF NOT EXISTS '%s'" + "(userid VARCHAR not Null , callwith VARCHAR not null, calltype VARCHAR, callstart time, callend time, callmedia VARCHAR" + ");"
      

      【讨论】:

      • 没有使用wrongNOT NULL。它声明一个值不允许为空。
      【解决方案4】:

      您可以在此处http://www.sqlite.org/c3ref/c_abort.html 看到所有 SQLite 错误代码的列表。错误代码 19 表示在操作(INSERT 等)期间违反了表约束(NOT NULL、UNIQUE 等)。通过查看您的表创建逻辑,您的许多字段都设置为 NOT NULL,但您只是尝试插入单个列。如果创建表时值不能为空,则必须在 INSERT 期间包含非空值,否则您将看到错误代码 19。如果不需要,您还可以从数据库表中删除约束.

      附带说明一下,还有其他插入方法可以处理违反约束的情况,例如

      db.insertWithOnConflict(..., ..., ..., INTEGER);
      

      其中 INTEGER 是 SQLiteDatabase 类中的静态冲突解决变量之一(但我认为它们中的任何一个都不允许违反 NOT NULL )。您还可以在此处阅读有关 SQLite 冲突解决选项的更多信息:http://www.sqlite.org/conflict.html

      【讨论】:

        【解决方案5】:

        我最近遇到了同样的问题,但我确信我插入了正确的数据。结果是我定义了一些触发器,但我在更改表时忘记更改它们。就我而言,这是错误的字段类型,而不是“唯一”或“非空”约束。

        因此,如果您遇到此问题并且没有看到任何违反约束的情况,请检查您的触发器(如果有的话)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-04
          • 1970-01-01
          • 1970-01-01
          • 2021-05-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多