2011-11-04 3 views
0

특정 오류 : 나는 많은 기사가있는 것을 알고 : 데이터/데이터/패키지/데이터베이스데이터베이스 오류

주에 액세스하려고 할 때 SQLite는 데이터베이스와 안드로이드 응용 프로그램이 실패 Stackoverflow뿐만 아니라 Assets 폴더의 sqlite 파일을 data/data/package/databases 폴더에 복사하는 방법과 관련된 많은 권장 사이트가 게시되었습니다. 그러나 필자의 구현은 실제 장치가 아닌 에뮬레이터에서만 작동합니다. 나는 퍼즐 조각을 놓치고 있다고 생각한다.

내 질문 누구든지 내 코드에서 오류 지점을 식별 할 수 있습니까? 나는 이것이 참으로 새로운 쌍의 눈이 빨리 오류를 발견 할 수있는 문제 중 하나라고 생각합니다. 11-02 20 : 22 : 17.045 : INFO/프로세스 (15318) : 신호를 보내는 중 ... 당신이 제공 할 수있는 통찰력 사전에

오류 로그 (BOLD 항목은 장애 지점됩니다) 감사합니다. PID : 15318 SIG : 9 11-02 20 : 22 : 17.055 : INFO/ActivityManager (2697) : 프로세스 com.game.myapp (pid 15318)가 종료되었습니다. 11-02 20 : 22 : 17.055 : INFO/창 관리자 (2697)을 WIN DEATH : 창 {40922a70 com.game.myapp은 /는 com.game.myapp.MainActivity = TRUE 일시}

내 코드

public class DatabaseHelper extends SQLiteOpenHelper { 

private static final int DATABASE_VERSION = 1; 
private static final String DATABASE_NAME = "ttg.db"; 
public static String DATABASE_PATH = "/data/data/com.game.myapp/databases/"; 

private SQLiteDatabase ttgDatabase; 
private Context myContext = null; 

DatabaseHelper(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    this.myContext = context; 
} 



    public void createDataBase() throws IOException{ 
      boolean dbExist = checkDataBase(); 
       if(dbExist){ 
     //do nothing 
      }else{ 

     this.getReadableDatabase(); 

      try { 
       copyDataBase(); 

        } catch (IOException e) { 
        throw new Error("Error copying database"); 
       } 
      } 
      } 


       private boolean checkDataBase(){ 
         SQLiteDatabase checkDB = null; 

         try{ 
        String myPath = DATABASE_PATH + DATABASE_NAME; 
       checkDB = SQLiteDatabase.openDatabase(myPath, null,   SQLiteDatabase.OPEN_READONLY); 

     }catch(SQLiteException e){ 

     } 

     if(checkDB != null){ 
      checkDB.close(); 
     } 

       return checkDB != null ? true : false; 
     } 


      private void copyDataBase() throws IOException{ 
        File fileTest = myContext.getFileStreamPath(DATABASE_NAME); 
          boolean exists = fileTest.exists(); 
        if (!exists) { 

      OutputStream databaseOutputStream = new FileOutputStream(DATABASE_PATH + DATABASE_NAME); 
      InputStream databaseInputStream; 

      databaseInputStream = myContext.getAssets().open(DATABASE_NAME); 
        byte[] buffer = new byte[1024]; 
      int length; 
       while ((length = databaseInputStream.read(buffer)) > 0) { 
       databaseOutputStream.write(buffer); 
      } 
       // Close the streams 
       databaseInputStream.close(); 
       databaseOutputStream.flush(); 
        databaseOutputStream.close(); 
       } 
       } 

       public void openDataBase() throws SQLException{ 
         //Open the database 
        String myPath = DATABASE_PATH + DATABASE_NAME; 
        ttgDatabase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 
        } 

         @Override 
       public synchronized void close() { 
         if(ttgDatabase != null) 
          ttgDatabase.close(); 
       super.close(); 
     } 


@Override 
public void onCreate(SQLiteDatabase db) { 

} 


@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

} 
+1

이런 쓰레기를 당신의 들여 쓰기가 어떻게 되었습니까? 나는 무엇이 어디 있는지 말할 수 없다 .. – Izkata

+0

Welcome to Stackoverflow! 답변이 도움이된다면 투표하십시오. 응답으로 질문에 성공적으로 답변 한 경우 옆에있는 녹색 확인 표시를 클릭하여 대답을 수락하십시오. 또한 좋은 질문을 작성하는 방법에 대한 조언은 http://stackoverflow.com/questions/how-to-ask를 참조하십시오. –

+0

흠, 게시 한 로그는 앱이 사망했음을 나타 냈지만 원인은 밝히지 않았습니다. 아마도 더 긴 버전의 로그를 게시 할 수 있습니까? SQLHelper를 사용할 때 경로 (/data/data/com.game.myapp/databases)를 사용할 필요가 없습니다 java.lang.NullPointerException이 – kikoboar

답변

0

여기에 있습니다. 데이터베이스 파일이 손상되었을 가능성이 있습니다 (실제로 1024 개 중에 1 개)

while ((length = databaseInputStream.read(buffer)) > 0) { 
    databaseOutputStream.write(buffer); 
} 

쓰기시 읽을 버퍼의 길이를 지정해야합니다. 여러분이 얻을 수있는 것은 각 쓰기에서 전체 1024 바이트입니다.

"InputStream/OutputStream"복사 코드를 쓰는 것이 싫고 나는 모든 곳에서 그것을 봅니다. 그것을 사용하고 싶다면 아파치 공유 라이브러리의 슬림화 된 버전을 만들었습니다. 거기에 당신이 사용하지 않을 것 물건,하지만 멋진 폴더의 유틸리티 코드의 많은 : 그렇지 않으면

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

대신 당신이 지금 사용중인이 방법을 사용하십시오

http://download.oracle.com/javase/1.4.2/docs/api/java/io/OutputStream.html#write(byte[], int, int)

+0

모든 귀하의 블로그 링크가 404 있습니다. – Flexo