Столбец не создан в таблице SQLITE3 - PullRequest
0 голосов
/ 28 декабря 2011

Теперь у меня странная проблема, я провел все виды тестов и, кажется, вижу что-то странное.

Я создаю три таблицы в 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 не создан, в то время как другие создаются.Я смотрю на вывод в командной строке 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);

Это перечисляет столбец 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 для других столбцов.

Ответы [ 3 ]

1 голос
/ 29 декабря 2011

После целого дня борьбы мне удалось определить причину возникновения проблемы.Все еще не знаю почему, но это решает проблему.Проблема возникает из-за того, что в следующей таблице, содержащей внешние ключи в двух других таблицах:

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

И вуаля!Здравомыслие было восстановлено.Бьет меня.

1 голос
/ 28 декабря 2011

В вашем SQL нет ошибки.Я проверил, и все было создано правильно.Также ваш SQL-запрос не вызвал ошибку no such column.Поэтому попробуйте удалить базу данных с помощью context.deleteDatabase(databaseName); и повторите попытку.

0 голосов
/ 29 марта 2012

В моем случае я использовал зарезервированное слово SQLite (это был столбец)

Я оказался в этом вопросе SO, поэтому, возможно, это поможет другим в моей ситуации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...