2011-12-28 9 views
0

今私は奇妙な問題があります。私はあらゆる種類のテストを行いました。SQLITE3テーブルでカラムが作成されていない

私はSQLiteOpenHelperで3つのテーブルを作成:3つのテーブルが従うためのCREATE文

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

これはIRFeedsFeedHash列をリストしません。しかし、実行すると

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]文字 '' 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/detail?id = 1732)。私が見ているものが関連しているかどうかは分かりませんが、それでも役立ちます。 –

+0

一発!確かに非常に奇妙です。手動で 'irfeedsを落とす'と 'テーブル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)); 

そしてvoila!正気が回復しました。私を殴る。私は(だっ列、)SQLiteの予約語

私はこのSO質問で終わったを使用していた私の場合は

1

SQLにエラーはありません。私はテストし、すべてが適切に作成されました。また、SQLクエリではno such columnエラーが発生しませんでした。したがって、context.deleteDatabase(databaseName);でデータベースを削除してから、もう一度試してください。

+0

DDMSを使用してデータベースを複数回削除しました。私は今完全に再起動させてください。ご協力いただきありがとうございます。 –

+0

再起動と「ユーザーデータの消去」は役に立ちませんでした。私はエミュレータで動作しています。何が間違っているのだろうかと思います。 –

0

は、ので、多分それは `、

関連する問題