2016-08-25 3 views
0

6つのテーブルを持つデータベースがあります。これらのテーブルは、コンテンツプロバイダとデータベースヘルパーの助けを借りて作成されます。私はこれらの6つのテーブルでアプリケーションを実行すると、アプリケーションが動作し、すべてのテーブルが作成され、テーブルを照会してデータを正しく挿入できます。テーブル作成ステートメントより前に実行されたcreateステートメントの表示

ただし、データベースヘルパーのonCreateメソッドにsqliteビューを追加しようとすると、アプリケーションがクラッシュします。

私が理解できることから、ビューのonCreateメソッドは、ViewのJoinで使用されているテーブルのonCreateメソッドの前に呼び出される理由が何であれのためです。

私が知る必要があるのは、データベースのテーブルを最初に作成してからビューを作成する方法です。

質問の性質上(「ビュー」という言葉は他のものを参照するために使用されています)、私は解決策を見つけるのに苦労しています。

これは、ビューを作成するためのコードです:

public static final String TABLE_NAME = "recent_listens"; 

public static final String TIMESTAMP_ID = timestampTable.TIMESTAMP_ID; 
public static final String TRACK_NAME = trackTable.TRACK_NAME; 
public static final String TRACK_MBID = trackTable.TRACK_MBID; 
public static final String ALBUM_NAME = albumTable.ALBUM_NAME; 
public static final String ALBUM_MBID = albumTable.ALBUM_MBID; 
public static final String ARTIST_NAME = artistTable.ARTIST_NAME; 
public static final String ARTIST_MBID = artistTable.ARTIST_MBID; 
public static final String TIMESTAMP_VALUE = timestampTable.TIMESTAMP_VALUE; 
public static final String IMAGE_ID = albumTable.ALBUM_IMG_ID; 

private static final String LISTEN_VIEW_CREATE = "" 
     + "CREATE VIEW " + TABLE_NAME + " AS " 
     + "SELECT " 
      + timestampTable.TABLE_TIMESTAMP + "." + timestampTable.TIMESTAMP_ID + " AS " + TIMESTAMP_ID + ", " 
      + trackTable.TRACK_NAME + " AS " + TRACK_NAME + ", " 
      + trackTable.TRACK_MBID + " AS " + TRACK_MBID + ", " 
      + albumTable.ALBUM_NAME + " AS " + ALBUM_NAME + ", " 
      + albumTable.ALBUM_MBID + " AS " + ALBUM_MBID + ", " 
      + artistTable.ARTIST_NAME + " AS " + ARTIST_NAME + ", " 
      + artistTable.ARTIST_MBID + " AS " + ARTIST_MBID + ", " 
      + timestampTable.TIMESTAMP_VALUE + " AS " + TIMESTAMP_VALUE + ", " 
      + albumTable.ALBUM_IMG_ID + " AS " + IMAGE_ID 
     + " FROM " 
      + timestampTable.TABLE_TIMESTAMP 
       + " INNER JOIN " + trackTable.TABLE_TRACK + " ON " 
        + timestampTable.TABLE_TIMESTAMP + "." + timestampTable.TIMESTAMP_CON_TRACK_ID + " = " 
        + trackTable.TABLE_TRACK + "." + trackTable.TRACK_ID 
       + " INNER JOIN " + albumTable.TABLE_ALBUM + " ON " 
        + timestampTable.TABLE_TIMESTAMP + "." + timestampTable.TIMESTAMP_CON_ALBUM_ID + " = " 
        + albumTable.TABLE_ALBUM + "." + albumTable.ALBUM_ID; 

public static synchronized void onCreate(SQLiteDatabase database) { 
    database.execSQL(LISTEN_VIEW_CREATE); 

そして、これは私が取得エラーです:android.database.sqlite.SQLiteException:によって引き起こさ

をなし、そのようなコラム:ARTIST_NAME(コード1):コンパイル中に、CREATE VIEW recent_listens AS SELECT timestamps_table._id AS _id、track_name AS track_name、track_mbid AS track_mbid、album_name AS album_name、album_mbid AS album_mbid、artist_name AS artist_name、artist_mbid AS artist_mbid、timestamp ASタイムスタンプ、album_img_id AS album_img_id FROM timestamps_table INNER JOINはON timestamps_tを追跡しますable.track_id = tracks._id INNERはここtimestamps_table.album_id = albums._id

ONのアルバムに参加、私のdatabaseHelperクラスです:

public class databaseHelper extends SQLiteOpenHelper { 

private static final String DATABASE_NAME = "userData.db"; 
private static final int DATABASE_VERSION = 10; 

public databaseHelper(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
} 

@Override 
public void onCreate(SQLiteDatabase database) { 
    artistTable.onCreate(database); 
    albumTable.onCreate(database); 
    trackTable.onCreate(database); 
    tagTable.onCreate(database); 
    similarTable.onCreate(database); 
    timestampTable.onCreate(database); 
    listenView.onCreate(database); 
} 

@Override 
public void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion) { 
    artistTable.onUpgrade(database, oldVersion, newVersion); 
    albumTable.onUpgrade(database, oldVersion, newVersion); 
    trackTable.onUpgrade(database, oldVersion, newVersion); 
    tagTable.onUpgrade(database, oldVersion, newVersion); 
    similarTable.onUpgrade(database, oldVersion, newVersion); 
    timestampTable.onUpgrade(database, oldVersion, newVersion); 
    listenView.onUpgrade(database, oldVersion, newVersion); 
} 

}

これは私のカスタムコンテンツプロバイダに呼ばれているのonCreate方法。

@Override 
public boolean onCreate() { 
    database = new databaseHelper(getContext()); 
    return false; 
} 
+0

ところで、なぜこのように一緒にあなたのクエリをパッチ:

結果の表示は、文字列を作成するには、このですか?それは本当に苦しいことではありませんか?それを一つの作品に書いてください。 –

+0

あなたが表示していないartistTableコードに問題があります。 –

+0

@ CL私は、問題には私が参加の中にartistTableを含めていないと思う。そのケースかどうかを確認しています。 – somethingRandom

答えて

0
android.database.sqlite.SQLiteException: no such column: artist_name 

これは明らかにあなたのビューが(私はtimestamps_table思う)そのテーブルに存在しない列にアクセスしようとしていることになります。ほとんどの場合、artist_nameテーブルを追加してデータベースの新しいバージョンを増やすのを忘れているので、これはonUpgrade()にある可能性があります。
修正:データベースのバージョンをアップグレードするか、アプリケーションをアンインストールして再度実行するか、設定からアプリのデータを消去してください。

+0

データベースヘルパーからCREATE VIEW文を削除すると、そのカラムは正常に作成された別のテーブルにあります。私が持っている問題は、他のテーブルの前にビューが作成されていることです。また、アプリデータを複数回クリアしても、それは役に立たない。 – somethingRandom

+0

あなたはonCreate()から詳細をお知らせください。最初にテーブルを作成する必要があるにしても、作成する最初のものはビューです。ありがとう! – Tudor

+0

質問に私のdatabaseHelperクラスを追加しました – somethingRandom

0

他の誰もが同じ問題に遭遇する場合は、

私は選択で言及された結合のテーブルを含めなかったことが分かります。

private static final String LISTEN_VIEW_CREATE = "" 
     + "CREATE VIEW " + TABLE_NAME + " AS " 
     + "SELECT " 
      + timestampTable.TABLE_TIMESTAMP + "." + timestampTable.TIMESTAMP_ID + " AS " + LISTEN_ID + ", " 
      + trackTable.TRACK_NAME + " AS " + TRACK_NAME + ", " 
      + trackTable.TRACK_MBID + " AS " + TRACK_MBID + ", " 
      + albumTable.ALBUM_NAME + " AS " + ALBUM_NAME + ", " 
      + albumTable.ALBUM_MBID + " AS " + ALBUM_MBID + ", " 
      + artistTable.ARTIST_NAME + " AS " + ARTIST_NAME + ", " 
      + artistTable.ARTIST_MBID + " AS " + ARTIST_MBID + ", " 
      + timestampTable.TIMESTAMP_VALUE + " AS " + TIMESTAMP_VALUE + ", " 
      + albumTable.ALBUM_IMG_ID + " AS " + IMAGE_ID 
     + " FROM " 
      + timestampTable.TABLE_TIMESTAMP 
       + " INNER JOIN " + trackTable.TABLE_TRACK + " ON " 
        + timestampTable.TABLE_TIMESTAMP + "." + timestampTable.TIMESTAMP_CON_TRACK_ID + " = " 
        + trackTable.TABLE_TRACK + "." + trackTable.TRACK_ID 
       + " INNER JOIN " + albumTable.TABLE_ALBUM + " ON " 
        + timestampTable.TABLE_TIMESTAMP + "." + timestampTable.TIMESTAMP_CON_ALBUM_ID + " = " 
        + albumTable.TABLE_ALBUM + "." + albumTable.ALBUM_ID 
       + " INNER JOIN " + artistTable.TABLE_ARTIST + " ON " 
        + timestampTable.TABLE_TIMESTAMP + "." + timestampTable.TIMESTAMP_CON_ARTIST_ID + " = " 
        + artistTable.TABLE_ARTIST + "." + artistTable.ARTIST_ID; 
関連する問題