2011-07-17 4 views
1

미리 채워진 데이터베이스가있는 안드로이드 애플리케이션을 구축하는 데 정말로 문제가 있습니다.미리 채워진 데이터베이스 - 안드로이드 애플리케이션

source code 전체를 살펴보십시오.

sqlitebrowser를 사용하여 데이터베이스를 만들고 안드로이드 응용 프로그램의 "assets"디렉토리에 복사했습니다.

나는 데이터베이스가 자산 디렉토리에서 데이터베이스를 복사해야합니다 존재하지 않는, 그래서 내가 createDatabase 함수를 호출 MainActivity.java에서 자바 클래스 DBAdapter.java

자산 디렉토리에서 데이터베이스를 복사하는 코드를 추가했습니다. 데이터베이스를 생성 한 후 getAllContacts 함수를 호출하고이를 페이지에 표시합니다.

프로젝트를 실행할 때마다 디버그 할 수없는 오류가 발생합니다.

아무도 나를 해결할 수 없습니까?

UPDATE :

로그 캣 다음 예외이다. 자산의 "contacts"테이블/MyDB.db는 복사/생성되지 않았지만 확실하지 않습니다.

E/AndroidRuntime( 672): java.lang.RuntimeException: Unable to start activity ComponentInfo{org.me.mydb/org.me.mydb.MainActivity}: android.database.sqlite.SQLiteException: no such table: contacts: , while compiling: SELECT _id, name, email FROM contacts 
E/AndroidRuntime( 672):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 
E/AndroidRuntime( 672):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
E/AndroidRuntime( 672):  at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
E/AndroidRuntime( 672):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
E/AndroidRuntime( 672):  at android.os.Handler.dispatchMessage(Handler.java:99) 
E/AndroidRuntime( 672):  at android.os.Looper.loop(Looper.java:123) 
E/AndroidRuntime( 672):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
+0

가 로그 캣 이것에 대해 말했다 무엇을 ...? – Necronet

+0

어디에서 로그를 볼 수 있습니까? 죄송합니다. 안드로이드의 초보자입니다. – Peter

+0

콘솔에서 수동으로 확인해야합니다 .http : //developer.android.com/guide/developing/tools/logcat.html ADT를 사용하는 경우 로그를 보려면 Logcat보기가 함께 제공됩니다. – Necronet

답변

0

잘 DataHelper에는 데이터베이스를 만들 수있는 onCreate 메서드가 있습니다.

데이터베이스가 처음으로 생성 될 때 호출

Official Android documentation

. 여기서 테이블을 만들고 테이블의 초기 채우기는 이되어야합니다.

사실 당신은 내가에서 onCreate 이벤트 처리 및 (라인 - 라인으로 간단한 루프에서 실행) * .SQL 스크립트의 세트를 사용하는 방법

@Override 
     public void onCreate(SQLiteDatabase db) 
     { 

     } 
+0

Yeaaaah 나는 onCreate 함수를 사용하여 데이터베이스를 생성하는 것이 가능하다는 것을 알고 있습니다 ... 그러나 이미 생성 된 수백/수천 개의 행이 있다면 어떻게 될까요? 데이터베이스 파일에 ?? 안드로이드 예제 및 튜토리얼의 대부분은 웹상에서 런타임에 데이터베이스를 생성하고 채 웁니다. 안드로이드 애플리케이션과 독립적 인 미리로드 된 데이터베이스가 될 수있는 예제/튜토리얼을 찾고 있습니다. 내 코드의 문제점을 알려주십시오. – Peter

0

에게 우선 준거에 비하면.

데이터베이스 업데이트 루틴을 작성해야 할 때 유용합니다. 데이터베이스의 각 오래된 버전에 대해 새 (최신) 데이터베이스 및 SQL 스크립트 집합을 초기화하는 하나의 SQL 스크립트가 있습니다.

새 데이터베이스를 초기화해야 할 때마다 "create"SQL 스크립트가 호출되거나 사용자가 데이터베이스를 버전에서 업데이트해야 할 때마다 "v1-update-to-v2"및 "v2-update-to-v3"스크립트가 호출됩니다. 1부터 3까지입니다. 이것은 "v1-update-to-v3"및 "v2-update-to-v3"과 같은 버전마다 단일 업데이트 스크립트보다 느리지 만 새로운 버전을 추가하면이 "chain"을 유지 관리하기가 더 쉽습니다. (이전 스크립트에서 아무 것도 변경할 필요가 없습니다.)

+0

소스 코드를 공유 할 수 있습니까? – Peter

2

시작하기에 좋은 link입니다.

기본적으로 아이디어는 SQLiteOpenHelper 클래스를 사용하고 데이터베이스가없는 경우 바이트로 미리 시드 된 데이터베이스 바이트를 올바른 위치에 복사합니다.나는 약간 수정 광산의 프로젝트를 가지고 있지만 작동

+0

이 구현을 사용하고 권장합니다. 그러나 때로는 약간 변덕스럽고 전체 데이터베이스를 제대로 복사하지 않으므로 앱에서 복사 된 부분을 확인하십시오. –

+0

@ Paul.s 나는 링크에서 주어진 동일한 절차를 따랐다. 그러나 그것은 잘되지 않았다. 내 코드를 디버그하여 문제가있는 곳을 알려 주시면 좋을 것입니다. – Peter

+0

@Espiandev 작업 코드/프로젝트를 보내 주시겠습니까? – Peter

0

다음 코드로 copyDBFromResource();를 말한다 라인 교체 잘 작동 보인다 -이 필요 생각

 SQLiteDatabase readDB = null; 
     readDB = this.getReadableDatabase(); 
     readDB.close(); 
     readDB = null; 
     copyDBFromResource(); 

를 코드 자체 수 없기 때문에 데이터 폴더에 파일을 만들고, getReadableDatabase()을 호출하면 db 파일이 생성됩니다. 그리고 안드로이드 2.2 이후에는 핸들을 얻은 후에 데이터베이스를 닫아야합니다. 그렇지 않으면 복사본이 성공하지 못합니다.

편집 :

가 여전히 작동하지 않으면, 다음과 같이 쓰기 외부 저장 권한을 부여하려고 -

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
+0

고마워요.하지만 제대로 작동하지 않습니다. ( – Peter

+0

위의 편집에서 설명한 것처럼 WRITE_EXTERNAL_STORAGE 권한 (매니페스트의 응용 프로그램 노드 바로 뒤에있는 권한)을 부여 하시겠습니까? –

+0

@Abinav 를 어디에 추가해야합니까? 쇼 uld AndroidManifest.xml에 추가합니까? – Peter

관련 문제