现在我有一个奇怪的问题,我做过各种测试,我相信我看到了一些奇怪的东西。
我在SQLiteOpenHelper中创建了三个表:
public void onCreate(SQLiteDatabase db) {
try {
db.execSQL(TABLE_CHANNELS_CREATE);
db.execSQL(TABLE_FEEDS_CREATE);
db.execSQL(TABLE_FEEDMAP_CREATE);
}
catch (SQLiteException e){
Toast.makeText(mContext, e.getMessage(), Toast.LENGTH_LONG).show();
}
}
三个表的CREATE语句如下:
CREATE TABLE IF NOT EXISTS IRChannels (
ChannelId INTEGER PRIMARY KEY,
ChannelHash TEXT NOT NULL,
ChannelTitle TEXT NOT NULL,
ChannelDesc TEXT, ChannelLink TEXT);
CREATE TABLE IF NOT EXISTS IRFeeds (
FeedId INTEGER PRIMARY KEY,
FeedHash TEXT NOT NULL,
FeedTitle TEXT NOT NULL,
FeedDescription TEXT,
FeedLink TEXT);
CREATE TABLE IF NOT EXISTS IRFeedMap (
ChannelHash_FK TEXT NOT NULL,
FeedHash_FK TEXT NOT NULL,
FOREIGN KEY (ChannelHash_FK) REFERENCES IRChannels (ChannelHash),
FOREIGN KEY (FeedHash_FK) REFERENCES IRFeeds (FeedHash));
问题显然是FeedHash
中的IRFeeds
列未创建,而其他列则是sqlite> .schema
CREATE TABLE IRChannels (
ChannelId INTEGER PRIMARY KEY,
ChannelHash TEXT NOT NULL,
ChannelTitle TEXT NOT NULL,
ChannelDesc TEXT,
ChannelLink TEXT);
CREATE TABLE IRFeedMap (
ChannelHash_FK TEXT NOT NULL,
FeedHash_FK TEXT NOT NULL,
FOREIGN KEY (ChannelHash_FK) REFERENCES IRChannels (ChannelHash),
FOREIGN KEY (FeedHash_FK) REFERENCES IRFeeds (FeedHash));
CREATE TABLE IRFeeds (
FeedId INTEGER PRIMARY KEY,
FeedHash TEXT NOT NULL,
FeedTitle TEXT NOT NULL,
FeedDescription TEXT,
FeedLink TEXT);
。我在sqlite3命令提示符下查看输出;
FeedHash
这会列出IRFeeds
中的sqlite> select * from IRFeeds where FeedHash='';
SQL error: no such column: FeedHash
列。但是,当我执行
sqlite> select * from IRFeeds where FeedID=1;
sqlite> select * from IRFeeds where FeedTitle='';
sqlite> select * from IRFeeds where FeedDescription='';
sqlite> select * from IRFeeds where FeedLink='';
所有其他列都不会出现此类错误。这种情况导致我的代码意外失败。我能错过什么?
select
当我为其他列执行{{1}}语句时,没有错误。
答案 0 :(得分:1)
SQL中没有错误。我测试了一切都是正确的。您的SQL查询也不会导致no such column
错误。因此,请尝试使用context.deleteDatabase(databaseName);
删除数据库,然后重试。
答案 1 :(得分:1)
经过一整天的奋斗,我设法找出问题触发的原因。仍然不知道为什么,但它确实解决了这个问题。出现问题是因为下表在其他两个表上有外键:
CREATE TABLE IRFeedMap (
ChannelHash_FK TEXT NOT NULL,
FeedHash_FK TEXT NOT NULL,
FOREIGN KEY (ChannelHash_FK) REFERENCES IRChannels (ChannelHash),
FOREIGN KEY (FeedHash_FK) REFERENCES IRFeeds (FeedHash));
将外键列的列名更改为与它们引用的列相同可以解决问题。我将上面的陈述改为:
CREATE TABLE IRFeedMap (
ChannelHash TEXT NOT NULL,
FeedHash TEXT NOT NULL,
FOREIGN KEY (ChannelHash) REFERENCES IRChannels (ChannelHash),
FOREIGN KEY (FeedHash) REFERENCES IRFeeds (FeedHash));
瞧!恢复了理智。打败我。
答案 2 :(得分:0)
在我的情况下,我使用的是SQLite保留字(列,那是)
我在这个问题中结束了,所以也许在我的情况下帮助其他人