2016-08-25 1 views
0

6 개의 테이블이있는 데이터베이스가 있습니다. 이러한 테이블은 콘텐츠 공급자 및 데이터베이스 도우미의 도움으로 만들어집니다. 이 6 개의 테이블로 앱을 실행하면 앱이 작동하고 모든 테이블이 만들어지고 테이블을 쿼리하고 데이터를 잘 삽입 할 수 있습니다.테이블 작성 문 앞에 실행 된 create 문보기

그러나 내 데이터베이스 도우미의 onCreate 메서드에 sqlite 뷰를 추가하려고하면 응용 프로그램이 중단됩니다.

내가 이해할 수있는 것으로부터, 뷰의 onCreate 메소드는 View join에 사용 된 테이블 onCreate 메소드보다 먼저 호출되는 모든 이유 때문입니다.

내가 알아야 할 것은 databaseHelper가 먼저 테이블을 만든 다음보기를 만드는 방법입니다.

질문의 성격 때문에 ("보기"라는 단어는 다른 단어를 나타 내기 위해 사용됨) 솔루션을 찾으려고 힘듭니다.

뷰 생성하는 코드입니다 :

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_mbid AS album_mbid, artist_name AS artist_name, artist_mbid AS artist_mbid, timestamp AS timestamp, album_img_id AS album_img_id FROM timestamps_table INNER JOIN은 timestamps_t를 추적합니다. able.track_id = tracks._id INNER는 timestamps_table.album_id = albums._id 여기

내 databaseHelper 클래스입니다 ON 앨범 가입 : 이것은 내 사용자 지정 콘텐츠 공급자에

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

BTW 이유를 다음과 같이 함께 검색어 패치? 정말 고통스럽지 않니? 한 조각으로 작성하십시오. –

+0

표시되지 않은 아티스트 테이블 코드에 문제가 있습니다. –

+0

@CL 문제는 내가 아티스트 테이블을 가입에 포함시키지 않았다고 생각합니다.그 경우인지 확인하고 있습니다. – somethingRandom

답변

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

이는 분명보기가 테이블에하지 않는 존재하는 열을 액세스하기 위해 시도 할 수 (나는 timestamps_table 생각한다). 대부분 artist_name 테이블을 추가 했으므로 데이터베이스의 새 버전을 onUpgrade()에 추가하는 것을 잊어 버렸기 때문에이 오류가 발생할 가능성이 큽니다.
수정 : db의 버전을 업그레이드하거나 앱을 제거한 후 다시 실행하거나 설정에서 앱의 데이터를 지우십시오.

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