2011-11-05 5 views
3

내 프로그램이있는 벽에이 프로그램을 실행했습니다. 이 문제에 대한 해결책을 찾기 위해 인터넷에서 검색을했는데 여기를 찾을 수 없었습니다.SQLiteDatabaseCorruptException : 데이터베이스 디스크 이미지의 형식이 잘못되었습니다.

원격 서버에서 SQLite 데이터베이스를 다운로드하려고합니다. 다운로드가 잘된 것 같습니다. 전화에서 파일을 가져 와서 볼 수 있습니다. 괜찮아 보인다.

android.database.sqlite.SQLiteDatabaseCorruptException: database disk image is malformed 

그래서 내가 서버의 DB를 삭제하고 휴대 전화에서 DB 및 I 데이터베이스를 작성하고 제출하도록되어 활동으로 건너 : 내 프로그램이 데이터베이스를 읽으려고 할 때, 나는 얻을 그것은 서버에. 이제 데이터베이스가 전화와 서버에서 다시 만들어졌습니다. 나는 그들을 열 수있어 그들은 잘 보인다.

프로그램을 다시 시작하면 제 회 전자가 데이터로 채워지지 않고 동일한 오류가 발생합니다.

여기에 스피너를 채우는 코드가 있습니다.

private void fillSpinner(){ 
    mDbHelper = new myDbAdapter(this); 
    mDbHelper.open(); 
    Cursor c = mDbHelper.fetchColumns(new String[] {"_id","name"}); 

    if (! c.moveToFirst()){ 

     mDbHelper.createRow("Create Name"); 
     c = mDbHelper.fetchColumns(new String[] {"_id","name"}); 

    } 


    // create an array to specify which fields we want to display 
    String[] from = new String[]{"name"}; 
    // create an array of the display item we want to bind our data to 
    int[] to = new int[]{android.R.id.text1}; 
    // create simple cursor adapter 
    SimpleCursorAdapter adapter = 
     new SimpleCursorAdapter(this, android.R.layout.simple_spinner_item, c, from, to); 
    mDbHelper.close(); 

    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    // get reference to our spinner 
    c.close(); 
    s.setAdapter(adapter); 

} 

데이터베이스의 데이터를 액세스하고 액세스하는 데 사용되므로 참조 용 fetchColumns 메소드입니다.

public Cursor fetchColumns(String[] colnames) { 
    Cursor mCursor = database.query(DATABASE_TABLE, colnames, null, 
      null, null, null, null); 
    if (mCursor != null) { 
     mCursor.moveToFirst(); 
    } 
    return mCursor; 
} 

Logcat이 나를이 방법으로 안내합니다. 위의 오류는 getWritableDatabase()가 범인임을 나타냅니다. db가 null이 아니므로 sqlite 데이터베이스 브라우저로 내용을 볼 수 있습니다.

public SQLiteDatabase open() throws SQLException { 
    dbHelper = new myDbHelper(context); 
    database = dbHelper.getWritableDatabase(); 

    return database; 
} 

다음은 db를 다운로드하는 방법입니다.

public void downloadFile(String file_name) throws IOException { 

    URL url = new URL(file_url + file_name); 
    URLConnection connection = url.openConnection(); 
    InputStream response = connection.getInputStream(); 

    FileOutputStream fos = new FileOutputStream(local_file_path + file_name); 
    byte data[] = new byte[1024]; 
    fos.write(data); 
    fos.close(); 
    response.close(); 
} 

누구든지 문제의 원인에 대한 아이디어가 있습니까? 디버깅 및 스택 추적 및 모든 open() 메서드에서 오는 것으로 보인다. 여기에 스택 추적입니다

11-05 19:39:32.861: INFO/Database(9084): sqlite returned: error code = 11, msg = 
      database corruption found by source line 40107 
    11-05 19:39:32.861: INFO/Database(9084): sqlite returned: error code = 11, msg =   database disk image is malformed 
    11-05 19:39:32.861: ERROR/Database(9084): CREATE TABLE android_metadata failed 
    11-05 19:39:32.881: ERROR/Database(9084): Failed to setLocale() when constructing, closing the database 
    11-05 19:39:32.881: ERROR/Database(9084): android.database.sqlite.SQLiteDatabaseCorruptException: database disk image is malformed 
    11-05 19:39:32.881: ERROR/Database(9084):  at android.database.sqlite.SQLiteDatabase.native_setLocale(Native Method) 
    11-05 19:39:32.881: ERROR/Database(9084):  at android.database.sqlite.SQLiteDatabase.setLocale(SQLiteDatabase.java:1950) 
    11-05 19:39:32.881: ERROR/Database(9084):  at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1818) 
    11-05 19:39:32.881: ERROR/Database(9084):  at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:817) 
    11-05 19:39:32.881: ERROR/Database(9084):  at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:851) 
    11-05 19:39:32.881: ERROR/Database(9084):  at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:844) 
    11-05 19:39:32.881: ERROR/Database(9084):  at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:540) 
    11-05 19:39:32.881: ERROR/Database(9084):  at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203) 
    11-05 19:39:32.881: ERROR/Database(9084):  at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98) 
    11-05 19:39:32.881: ERROR/Database(9084):  at com.project.myDbAdapter.open(myDbAdapter.java:42) 
    11-05 19:39:32.881: ERROR/Database(9084):  at com.project.Main.fillSpinner(Main.java:77) 
    11-05 19:39:32.881: ERROR/Database(9084):  at com.project.Main.onCreate(Main.java:40) 
    11-05 19:39:32.881: ERROR/Database(9084):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
    11-05 19:39:32.881: ERROR/Database(9084):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 
    11-05 19:39:32.881: ERROR/Database(9084):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
    11-05 19:39:32.881: ERROR/Database(9084):  at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
    11-05 19:39:32.881: ERROR/Database(9084):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
    11-05 19:39:32.881: ERROR/Database(9084):  at android.os.Handler.dispatchMessage(Handler.java:99) 
    11-05 19:39:32.881: ERROR/Database(9084):  at android.os.Looper.loop(Looper.java:123) 
    11-05 19:39:32.881: ERROR/Database(9084):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
    11-05 19:39:32.881: ERROR/Database(9084):  at java.lang.reflect.Method.invokeNative(Native Method) 
    11-05 19:39:32.881: ERROR/Database(9084):  at java.lang.reflect.Method.invoke(Method.java:521) 
    11-05 19:39:32.881: ERROR/Database(9084):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
    11-05 19:39:32.881: ERROR/Database(9084):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
    11-05 19:39:32.881: ERROR/Database(9084):  at dalvik.system.NativeStart.main(Native Method) 
    11-05 19:39:32.901: ERROR/Database(9084): Deleting and re-creating corrupt database /data/data/com.project/databases/names 
    11-05 19:39:32.901: ERROR/Database(9084): android.database.sqlite.SQLiteDatabaseCorruptException: database disk image is malformed 
    11-05 19:39:32.901: ERROR/Database(9084):  at android.database.sqlite.SQLiteDatabase.native_setLocale(Native Method) 
    11-05 19:39:32.901: ERROR/Database(9084):  at android.database.sqlite.SQLiteDatabase.setLocale(SQLiteDatabase.java:1950) 
    11-05 19:39:32.901: ERROR/Database(9084):  at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1818) 
    11-05 19:39:32.901: ERROR/Database(9084):  at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:817) 
    11-05 19:39:32.901: ERROR/Database(9084):  at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:851) 
    11-05 19:39:32.901: ERROR/Database(9084):  at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:844) 
    11-05 19:39:32.901: ERROR/Database(9084):  at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:540) 
    11-05 19:39:32.901: ERROR/Database(9084):  at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203) 
    11-05 19:39:32.901: ERROR/Database(9084):  at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98) 
    11-05 19:39:32.901: ERROR/Database(9084):  at com.project.myDbAdapter.open(myDbAdapter.java:42) 
    11-05 19:39:32.901: ERROR/Database(9084):  at com.project.Main.fillSpinner(SBMain.java:77) 
    11-05 19:39:32.901: ERROR/Database(9084):  at com.project.Main.onCreate(SBMain.java:40) 
    11-05 19:39:32.901: ERROR/Database(9084):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
    11-05 19:39:32.901: ERROR/Database(9084):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 
    11-05 19:39:32.901: ERROR/Database(9084):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
    11-05 19:39:32.901: ERROR/Database(9084):  at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
    11-05 19:39:32.901: ERROR/Database(9084):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
    11-05 19:39:32.901: ERROR/Database(9084):  at android.os.Handler.dispatchMessage(Handler.java:99) 
    11-05 19:39:32.901: ERROR/Database(9084):  at android.os.Looper.loop(Looper.java:123) 
    11-05 19:39:32.901: ERROR/Database(9084):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
    11-05 19:39:32.901: ERROR/Database(9084):  at java.lang.reflect.Method.invokeNative(Native Method) 
    11-05 19:39:32.901: ERROR/Database(9084):  at java.lang.reflect.Method.invoke(Method.java:521) 
    11-05 19:39:32.901: ERROR/Database(9084):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
    11-05 19:39:32.901: ERROR/Database(9084):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
    11-05 19:39:32.901: ERROR/Database(9084):  at dalvik.system.NativeStart.main(Native Method) 
    11-05 19:39:33.311: INFO/ActivityManager(66): Displayed activity com.project.Main: 552 ms (total 552 ms) 

어떤 도움을 주시면 감사하겠습니다! 미리 감사드립니다! HERE

는 작업 CODE

 public void downloadFile(String file_name) throws IOException { 

      URL url = new URL(file_url + file_name); 
     URLConnection connection = url.openConnection(); 
     InputStream response = connection.getInputStream(); 

     FileOutputStream fos = new FileOutputStream(local_file_path + file_name); 
     byte data[] = new byte[1024]; 

     IOUtils.copy(response, fos); 
     response.close(); 
     } 

    private void fillSpinner(){ 
    mDbHelper = new myDbAdapter(this); 
    mDbHelper.open(); 
    Cursor c = mDbHelper.fetchColumns(new String[] {"_id","name"}); 

    if (! c.moveToFirst()){ 

    mDbHelper.createRow("Create Name"); 
    c = mDbHelper.fetchColumns(new String[] {"_id","name"}); 

    c.close(); 
    } 


    // create an array to specify which fields we want to display 
    String[] from = new String[]{"name"}; 
    // create an array of the display item we want to bind our data to 
    int[] to = new int[]{android.R.id.text1}; 
    // create simple cursor adapter 
    SimpleCursorAdapter adapter = 
    new SimpleCursorAdapter(this, android.R.layout.simple_spinner_item, c, from, to); 
    mDbHelper.close(); 

    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    // get reference to our spinner 
    c.close(); 
    s.setAdapter(adapter); 

    } 

I 커서를 폐쇄하지 않은 것이다.

답변

3

예. 실제로 파일을 복사하지 않습니다.

public void downloadFile(String file_name) throws IOException { 

    URL url = new URL(file_url + file_name); 
    URLConnection connection = url.openConnection(); 
    InputStream response = connection.getInputStream(); 

    FileOutputStream fos = new FileOutputStream(local_file_path + file_name); 
    byte data[] = new byte[1024]; 

    //WHERE'S THE BEEF? 

    fos.write(data); 
    fos.close(); 
    response.close(); 
} 

또한 수동으로 해당 복사 코드를 작성하는 것은 오류가 발생하기 쉽습니다.

IOUtils.copy(response, fos); 
+0

확인

http://www.touchlab.co/blog/android-mini-commons/

전화, 내가 라인을 추가하고 fos.write (데이터)를 꺼내서 : 나는 아파치 평민의 아래 손질 버전을했다. 어떤 오류도없는 것 같고 파일이 복사 중입니다. 항목을 잘 볼 수는 있지만 회 전자는 채워지지 않습니다. : – tricknology

+0

커서 어댑터가있는 회 전자를 사용하지 마십시오. 많이 도움이되지 못합니다. –

+0

끝내 주셔서 감사합니다. 도움을 주셔서 감사합니다. 작업 코드로 수정 사항을 게시하십시오. – tricknology

관련 문제