2012-03-30 22 views
0

とありがとうございます! 外部キーを持つテーブルに挿入しようとすると、エラーが発生することがあります。値は存在し、同じタイプであり、ヌルではありません...そして、より面白いのは、初めて失敗し、最初のものだけです!他のインサートは完全に機能します! insertとrepeatを削除しようとしましたが、エラーは再びスローされません...初めての場合のみ! 私はAndroid 2.2(Froyo)でこれを試しています。以前は2.1で外部キーを使用していませんでした。SQLiteエラーandroid:データベース上のInsertでの外部キーの不一致

申し訳ありませんが、大きな「メッセージ」がありますが、私は迷っています!

エラー:


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)参照Productos(idProducto)、 'CREATE TABLE [Productos]' ?? – GAMA

+0

問題が見つかりました。申し訳ありませんが遅すぎます!私は新しい答えでそれを怒らせた。 – user675319

+0

あなた自身の答えを受け入れなさい... – GAMA

答えて

1

あなたのデータベースを削除し、再度アプリケーションを実行する必要があります。エミュレータを開いた状態でデータベースを削除し、タブファイルエクスプローラを開き、銀行があるフォルダまで移動します。私はブラジル人です。

+0

私は問題を見つけました、あまりにも遅くなることは申し訳ありません!私は新しい答えでそれを怒らせた – user675319

1

ご迷惑をおかけします。私はテーブル "unidades"を修正するこの問題を解決して、1つの主キーを用意しました。 "productoslista"からの外部キーがテーブル "unidades"の複合PKの一部を参照していたためにエラーが発生しました。コンポジットプライマリキーであるため、ソリューションは単一のプライマリキーを持ち、コンポジットを避けることです。

このPKの最後の種類はデザインの悪い原因です(私は多くのことを読んでいます)。そうすれば、単一のPKを持つようにテーブルを再設計した方が良いでしょう。柔軟で読みやすい。ところで皆に感謝!

関連する問題