2011-02-07 5 views
1

의 지침에 따라 Android 데이터베이스에 기존 SQLite 데이터베이스를 도입했습니다.SQLite 테이블이 존재하지 않습니다. 기존 SQLite 데이터베이스 (및 테이블)의 예외입니다.

"android_metadata"테이블을 쿼리 할 때 괜찮습니다. 하지만 내 자신의 테이블 "단어"(기본 정수 키에 대한 _id가 있음)에 비슷한 쿼리를 실행하면 테이블이 예외가 발생하지 않고 응용 프로그램이 중단됩니다.

왜 그럴까요?

코드 :

Cursor c = myDatabase.query("android_metadata", null, null, null, null, null, null, null); 

작동하지만

Cursor c = myDatabase.query("words", null, null, null, null, null, null, null); 

테이블은 예외가 존재하지 않습니다 반환합니다.

나는 데이터베이스 (경로 및 파일 이름에 대한 참조가 올바른지) 만드는거야 방법이 있습니다 :

private void copyDatabase() throws IOException 
{ 
    //Open local db as the input stream 
    InputStream myInput = mContext.getAssets().open(DB_NAME); 

    //Path to the just created empty db 
    String outFileName = DB_PATH + DB_NAME; 

    //Open the empty db as the output stream 
    OutputStream myOutput = new FileOutputStream(outFileName); 

    //Transfer bytes from the inputfile to the outputfile 
    byte[] buffer = new byte[1024]; 
    int length = 0; 
    while ((length = myInput.read(buffer))>0){ 
     myOutput.write(buffer, 0, length); 
    } 

    //Close the streams 
    myOutput.flush(); 
    myOutput.close(); 
    myInput.close(); 
} 

(참고 :. 내 눈을, 테이블은 내가 그것을 바로 찾고있다 내 SQLite 브라우저에서)

+0

아무도 거 몇 가지 코드없이 대답 할 수 없다 ... – tobyodavies

+0

을 그렇지 않은 코딩 문제 - 하나의 테이블을 찾을 수 있고 다른 테이블을 찾을 수 없다면 sqlite 데이터베이스가 안드로이드에 맞게 편집 된 방법과 관련된 문제입니다. 나는 누군가가 이것을보아야 만했음을 확신합니다 ... – SK9

+0

더 많은 코드는 "여기"링크를 참조하십시오. 그것은 꽤 표준 SQLiteDatabase 헬퍼 물건입니다. – SK9

답변

3

붉은 청어를 따라 다니고 있습니다. android_metadata 테이블은 상관없이 모든 안드로이드 데이터베이스에서 생성됩니다.

문제를 확인하는 실제 메커니즘은 에뮬레이터에서 앱을 실행하고 데이터베이스를 체크 아웃하는 것입니다. 에뮬레이터가 실행하고 응용 프로그램이 데이터베이스를 설정되어있는 경우, 실행이 예상 데이터베이스 이름이 표시

adb shell 
cd /data/data/your.application.package/databases 
ls 

ls 경우, 실행 .schema

다음 sqlite3를 프롬프트 실행에

sqlite3 <your db file> 

그러면 데이터베이스의 테이블이 인쇄됩니다. 내 생각 엔 안드로이드가 실제로 외부 위치에서 데이터베이스를 읽지 않기 때문에 메타 데이터 테이블 만 찾을 수 있습니다. 그게 사실이라면, 다시 의견을 말하면 그 과정을 통해 당신을 도울 수 있습니다.

+0

아마도 이것은 '당신이'(참고 : 내 눈에는 테이블이 있습니다. 바로 SQLite 브라우저에서 볼 수 있습니다.) '라고 말했을 때의 의미입니다. 그렇다면이 대답을 제거 할 것입니다. 이것은 결정적인 메커니즘입니다. –

+0

당신은 강타 중입니다. 그것은 그것을 좁히는 데 도움이되었습니다. – SK9

+0

OK - 빨간 청어가 맞습니다. 기본적으로 테이블 "android_metadata"가 만들어지기 때문에 안드로이드에 맞게 내 자신의 데이터베이스에 추가했기 때문에 그것이 발견되고 있다고 생각했습니다. 결과적으로 copyDatabase가 호출되고 데이터베이스 파일이로드되었다는 잘못된 인상을 받았습니다. 대신 copyDatabase가 전혀 호출되지 않았으므로 문제가 해결되었습니다. 나는 처음부터 혼자서이 코드를 작성하는 것이 훨씬 낫았을 것입니다. - 스스로 교훈을 얻으십시오 : 공개적으로 사용 가능한 코드를 과도하게 신뢰하지 마십시오. 내 질문에 링크 된 코드를 사용하는 것이 좋습니다. – SK9

0

대신 SQLiteHelpter를 사용하여 DB를 만들 수 있습니다. 하나가 존재하는지 확인하고 추가로 노력하지 않고 생성합니다.

는 이미 다른 질문에 예를 게시했다

, 여기를 확인하십시오
Android - Sqlite database method undefined fot type

희망이 도움이 :)

+0

감사합니다. 내 데이터베이스는 읽기 전용 자산입니다. 나는 이미 데이터베이스를 새로 만들었습니다. 이것은 다른 문제입니다. – SK9