2012-03-30 129 views
0

并提前致谢! 当我试图插入一个具有外键的表格时,我会发生一个错误。值存在,是相同的类型,并非非零......更有趣的是,第一次失败,只有第一次!其他插页完美地工作! 我试图删除插入并重复,并且错误不再被抛出......只有第一次! 我在Android 2.2(Froyo)上尝试它,之前是在2.1没有外键。SQLite错误android:外键不匹配插入数据库

对不起,这个大“消息”,但我迷路了!

错误:


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) 
); 
+0

为什么'FOREIGN KEY(idPadre)REFERENCES Productos(idProducto),'CREATE TABLE [Productos]'内''? – GAMA 2012-04-24 11:18:42

+0

我发现了这个问题,很抱歉为时已晚!我用新的答案编写了它。 – user675319 2012-06-21 17:45:13

+0

接受你自己的回答... – GAMA 2012-06-22 04:23:48

回答

1

你必须删除你的数据库,并再次运行应用程序。您将在打开模拟器的情况下删除数据库,然后打开标签文件浏览器并转到银行所在的文件夹。对不起,我是巴西人的英文错误。

+0

我发现了这个问题,抱歉太晚了!我用新的答案编写了它 – user675319 2012-06-21 17:50:11

1

并抱歉为时已晚。我解决了这个问题修改表“unidades”有一个单一的主键,而不是一个组合。所以在“productoslista”中插入的错误发生是因为来自“productoslista”的外键引用了表“unidades”的复合PK的一部分

问题是sqlite不喜欢你引用单个字段复合主键,所以解决方案是有单个主键并避免合成。

这最后一种PK是造成设计不好的一个原因(我收到了很多这样的结果),所以最好重新设计表以获得单个PK,而且如果设计要更多一些,则不需要占用更多的表灵活可读。顺便谢谢大家!