【问题标题】:Column not created in SQLITE3 tableSQLITE3 表中未创建列
【发布时间】:2012-03-29 16:44:32
【问题描述】:

现在我有一个奇怪的问题,我做了各种测试,我相信我看到了一些奇怪的东西。

我在 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));

问题显然是IRFeeds 中的列FeedHash 没有创建,而其他列是。我正在查看 sqlite3 命令提示符中的输出;

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

这确实列出了IRFeeds 中的FeedHash 列。但是,当我执行时

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 语句时,以上没有错误。

【问题讨论】:

  • 有趣的是,QUESTOID SQLLite Manager (jaxenter.com/manage-sqlite-for-android-11339.html) 在我尝试打开数据库时出现以下错误:Could not create the view: [line 1:58] no viable alternative at character ' ' CREATE TABLE IRFeeds (FeedId INTEGER PRIMARY KEY, FeedHash TEXT NOT NULL, FeedTitle TEXT NOT NULL, FeedDescription TEXT, FeedLink TEXT)
  • 找到这个话题 (code.google.com/p/android/issues/detail?id=1732)。不确定我看到的是否相关,但仍然有帮助。
  • 叹息!确实很奇怪。如果我手动 drop irfeedscreate table irfeeds (...) 然后执行我的代码,一切都会按预期工作。想知道这是否与我在 SQLiteOpenHelper.onCreate 中创建多个表的事实有关。
  • 找到了一个较新的线程stackoverflow.com/questions/8663717/…,它似乎有类似的问题。还是没有运气!

标签: android sqlite


【解决方案1】:

您的 SQL 没有错误。我进行了测试,一切都已正确创建。此外,您的 SQL 查询也没有导致 no such column 错误。所以尝试用context.deleteDatabase(databaseName);删除数据库,然后重试。

【讨论】:

  • 我已经使用 DDMS 多次删除了数据库。现在让我完全重启。感谢您的帮助。
  • 不。重新启动和“擦除用户数据”没有帮助。我在模拟器中运行。想知道可能出了什么问题。
【解决方案2】:

经过一整天的挣扎,我设法找出问题触发的原因。仍然不知道为什么,但它确实解决了问题。出现问题的原因是下表在其他两个表上有外键:

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

瞧!理智恢复了。打败我。

【讨论】:

    【解决方案3】:

    在我的例子中,我使用的是 SQLite 保留字(列)

    我最终遇到了这个 SO 问题,所以也许它可以帮助我遇到这种情况的其他人

    【讨论】:

      猜你喜欢
      • 2011-06-01
      • 2016-12-05
      • 2012-11-29
      • 2014-03-17
      • 1970-01-01
      • 1970-01-01
      • 2014-05-15
      • 1970-01-01
      • 2020-03-04
      相关资源
      最近更新 更多