0

私はから移入するスピナーを持っています

SELECT * FROM sqlite_master WHERE type = 'table'

そのスピナーを使用して、他のデータベース アクションをフィードします。私のテーブルの一部は使用できますが、試行されたアクションに応じて、次の例外で失敗するものもあります。

android.database.sqlite.SQLiteException: そのようなテーブルはありません: main.labs: 、コンパイル中: INSERT OR REPLACE INTO methods(name) VALUES(?);

11-16 06:32:01.927: E/Database(25403): 'DROP TABLE equipment_types' の準備中に 0x1d6e48 で障害 1 (そのようなテーブルはありません: main.labs)。11-16 06:32:01.927: E/AssistantData(25403): テーブルのドロップが例外で失敗しました: android.database.sqlite.SQLiteException: そのようなテーブルはありません: main.labs: DROP TABLE equipment_types

テーブルのさまざまな特性と相関する成功/失敗のパターンを探しましたが、パターンはないようです。

これは、機能しているテーブルの作成ステートメントです。

db.execSQL("
CREATE TABLE IF NOT EXISTS oel_sources 
(_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 
name TEXT NOT NULL, UNIQUE (name))");

機能していないもの:

db.execSQL("
CREATE TABLE IF NOT EXISTS methods 
(_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
 name TEXT NOT NULL, UNIQUE (name))");

これらの各テーブルには、_id への外部キー ポイントを持つ別のテーブルが 1 つあります。

でデータベースを削除しました

context.deleteDatabase(DB_NAME));

また、アプリケーション マネージャーで削​​除し、完全にアンインストールしてから、もう一度試しました。動作中と動作していないことは、削除/再作成全体で一貫しているようです。

そして最後に、私は完全に途方に暮れています。どんなアイデアでも大歓迎です!

4

1 に答える 1

0

今日さらに調べたところ、機能していないすべてのテーブルが単一のテーブルからの外部キーによって参照されていることがわかりました。エラーメッセージが私に伝えようとしていたため、そのテーブルは「labs」という名前の存在しないテーブルも参照していました。そのテーブルを作成するつもりだったことさえ忘れていたので、「ラボ」という名前は電球を点灯しませんでした. めっちゃ遅かった…

教訓: 存在しないテーブルへの外部キー参照を保持するテーブルを使用してデータベースを作成できます。無効な参照を使用してテーブルの操作を完了することもできます。ただし、無効な参照を持つテーブルの他の親テーブルでアクションを実行すると、最終的にエラーが発生しました。

親テーブルにデータが追加され、子テーブルが実際にそれらを指すまで、親テーブルが受動的にそこに座っていると予想していたので、奇妙に思えますが、これには私の理解を超えた理由があると思います。

于 2012-11-16T19:05:46.587 に答える