SQLite错误一个android:数据库上插入的外键不匹配

时间:2012-03-30 17:13:06

标签: android sqlite

并提前致谢! 当我试图插入具有外键的表时,我会发生错误。值存在,是相同的类型,并且不是null ...而且更有趣的是第一次失败,只有第一次!其他插件工作完美! 我试图删除插入和重复,并且错误不再被抛出......只是第一次! 我正在Android 2.2(Froyo)上尝试它,之前在2.1中没有外键。

对不起那条重大的“信息”,但我迷路了!

错误:


03-30 16:59:56.333: E/AndroidRuntime(28007): android.database.sqlite.SQLiteException: foreign key mismatch: , while compiling: INSERT INTO productoslista(idProducto, idUnidad, comprado, idLista, comentario, cantidad) VALUES(?, ?, ?, ?, ?, ?);
03-30 16:59:56.333: E/AndroidRuntime(28007):    at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method)
03-30 16:59:56.333: E/AndroidRuntime(28007):    at android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:91)
03-30 16:59:56.333: E/AndroidRuntime(28007):    at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:64)
03-30 16:59:56.333: E/AndroidRuntime(28007):    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:80)
03-30 16:59:56.333: E/AndroidRuntime(28007):    at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:36)
03-30 16:59:56.333: E/AndroidRuntime(28007):    at android.database.sqlite.SQLiteDatabase.compileStatement(SQLiteDatabase.java:1145)
03-30 16:59:56.333: E/AndroidRuntime(28007):    at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1536)
03-30 16:59:56.333: E/AndroidRuntime(28007):    at android.database.sqlite.SQLiteDatabase.insertOrThrow(SQLiteDatabase.java:1432)

表:


CREATE TABLE [ProductosLista] (
[idLista] INTEGER  NOT NULL,
[idProducto] INTEGER  NOT NULL,
[cantidad] INTEGER  NOT NULL,
[idUnidad] INTEGER  NOT NULL,
[comprado] INTEGER  NOT NULL,
[comentario] TEXT,
PRIMARY KEY ([idLista],[idProducto],[comentario]),
FOREIGN KEY (idLista) REFERENCES Listas(idLista),
FOREIGN KEY (idProducto) REFERENCES Productos(idProducto),
FOREIGN KEY (idUnidad) REFERENCES Unidades(idUnidad)



CREATE TABLE [Listas] (
[idLista] INTEGER  PRIMARY KEY AUTOINCREMENT NOT NULL,
[descripcion] TEXT  UNIQUE NOT NULL,
[fechaCreacion] INTEGER  NOT NULL,
[visible] TEXT  NOT NULL,
[estadoCompra] INTEGER NOT NULL
);

CREATE TABLE [Unidades] (
[idUnidad] INTEGER  NOT NULL,
[idIdioma] INTEGER  NOT NULL,
[abreviatura] TEXT  NOT NULL,
[descripcion] TEXT  NOT NULL,
--PRIMARY KEY ([idUnidad],[idIdioma]),
FOREIGN KEY (idIdioma) REFERENCES Idiomas(idIdioma)
);

CREATE TABLE [Productos] (
[idProducto] INTEGER  PRIMARY KEY AUTOINCREMENT NOT NULL,
[idPadre] INTEGER  NOT NULL,
[idCategoria] INTEGER  NOT NULL,
[idTipoAlimentacion] INTEGER NOT NULL,
[eliminado] INTEGER NOT NULL,
[imagen] INTEGER,
FOREIGN KEY (idPadre) REFERENCES Productos(idProducto),
FOREIGN KEY (idCategoria) REFERENCES Categorias(idCategoria)
);

2 个答案:

答案 0 :(得分:1)

您必须删除数据库并再次运行该应用程序。您将在打开模拟器的情况下删除数据库,然后打开选项卡文件资源管理器并转到银行所在的文件夹。对不起英语错误我是巴西人。

答案 1 :(得分:1)

抱歉太迟了。我解决了这个问题,修改表“unidades”只有一个主键,而不是一个复合词。因此,在“productoslista”中插入错误是因为“productoslista”中的外键引用了表“unidades”的复合PK的一部分

问题是sqlite不喜欢从复合主键引用单个字段,因此解决方案是使用单个主键并避免使用复合。

这最后一种PK是导致设计不良的原因(我对此进行了很多考虑)因此最好重新设计表格以获得单个PK,如果设计更加灵活,则不需要更多表格并且可读。顺便感谢大家!