0

我有一个微调器,其中填充

SELECT * FROM sqlite_master WHERE type = 'table'

我使用该微调器来提供其他数据库操作。我的一些表可以使用,其他表失败,但有以下例外,具体取决于尝试的操作:

android.database.sqlite.SQLiteException: no such table: main.labs: , while compile: 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): drop table failed with exception: android.database.sqlite.SQLiteException: no such table: 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。

我已经删除了数据库

context.deleteDatabase(DB_NAME));

我还通过应用程序管理器将其删除,完全卸载,然后重试。工作与不工作似乎在删除/重新创建时是一致的。

最后,我完全不知所措。任何想法将不胜感激!

4

1 回答 1

0

今天进一步查看后,我发现所有不工作的表都是由单个表中的外键引用的。该表还引用了一个名为“labs”的不存在的表,因为错误消息试图告诉我。我忘记了我什至打算创建那张桌子,所以“实验室”这个名字并没有点亮任何灯泡。这么晚了……

经验教训:您可以使用包含对不存在的表的外键引用的表来创建数据库。您甚至可以使用无效引用完成对表的操作。但是,对具有无效引用的表的其他父表执行操作是最终导致错误的原因。

看起来很奇怪,因为我本以为父表只是被动地坐在那里,直到将一些数据添加到它们中,然后子表实际上指向它们,但我想这是我无法理解的原因。

于 2012-11-16T19:05:46.587 回答