代码之家  ›  专栏  ›  技术社区  ›  narancs

无法在sqlite中插入,错误代码:19

  •  9
  • narancs  · 技术社区  · 14 年前

    当我尝试运行以下程序时:

      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);";
    
    4 回复  |  直到 11 年前
        1
  •  11
  •   Pentium10    14 年前

    约束失败

    似乎您的主键已存在于表中

        2
  •  4
  •   Opy    14 年前

    我也有同样的问题,奔腾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
  •  2
  •   cyber-monk    14 年前

    您可以在这里看到所有SQLite错误代码的列表 http://www.sqlite.org/c3ref/c_abort.html . 错误代码19表示在操作(insert等)期间违反了表约束(非空、唯一等)。从表创建逻辑来看,许多字段都设置为不为空,但您只尝试插入一列。如果创建的表的值不能为空,则在插入期间必须包含非空值,否则将看到错误代码19。如果不需要约束,也可以从数据库表中删除它。

    作为补充说明,还有其他插入方法允许处理约束冲突,例如

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

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

        4
  •  2
  •   lethalMango    14 年前

    您可以删除 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" + ");"