2011-12-28 2 views
0

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

создать три таблицы в 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 заявление для других столбцов Нет ошибок.

+0

Интересно, что 'QUESTOID SQLLite Manager' (http://jaxenter.com/manage-sqlite-for-android-11339.html) дает следующую ошибку при попытке открыть мою базу данных: 'Не удалось создать представление: [строка 1:58] нет жизнеспособной альтернативы в character '' CREATE TABLE IRFeeds (FeedId INTEGER PRIMARY KEY, FeedHash TEXT NOT NULL, FeedTitle TEXT NOT NULL, FeedDescription TEXT, FeedLink TEXT) ' –

+0

Обнаружил эту тему (http://code.google.com/p/android/issues/деталь? ID = 1732). Не уверен, что то, что я вижу, связано, но все же помогает. –

+0

Вздох! Очень странно. Если я вручную 'drop irfeeds' и' create table irfeeds (...) ', тогда выполните мой код, все будет работать так, как ожидалось. Удивительно, если это имеет какое-то отношение к тому, что я создаю несколько таблиц в SQLiteOpenHelper.onCreate. –

ответ

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

И вуаля! Благополучие восстановлено. Ударь меня.

1

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

+0

Я удалил базу данных несколько раз, используя DDMS. Позвольте мне теперь выполнить полную перезагрузку. Спасибо за вашу помощь. –

+0

Нет. Перезагрузка и «Очистка данных пользователя» не помогли. Я бегу в эмуляторе. Интересно, что может быть неправильно. –

0

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

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

Смежные вопросы