2011-11-04 126 views
0

具體錯誤:試圖訪問數據/數據/包/數據庫數據庫錯誤

注意當SQLite數據庫Android應用程式失敗:據我所知,很多文章都已發佈在Stackoverflow以及一些推薦的網站上,關於如何將資產文件夾中的sqlite文件複製到數據/數據/包/數據庫文件夾中。但是,我的實現只適用於仿真器而不是真正的設備。我想我錯過了一塊拼圖。

我的問題 任何人都可以找出我的代碼故障點?我真的認爲這是一個新的眼睛很快就會發現錯誤的問題之一。預先感謝您爲任何見解可以提供...

錯誤日誌(BOLD項是故障點): 11-02 20:22:17.045:INFO /過程(15318):發送信號。 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死亡:窗口{40922a70 com.game.myapp/com.game.myapp.MainActivity暫停=真}

我的代碼

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

歡迎來到Stackoverflow!如果您發現回覆有幫助,請投票。如果回覆成功回答您的問題,請點擊旁邊的綠色複選標記以接受答案。另請看看http://stackoverflow.com/questions/how-to-ask關於如何寫一個好問題的建議 –

+0

嗯,你發佈的日誌只顯示你的應用程序已經死亡,而不是它的原因。也許你可以發佈更長版本的日誌? AndroidRuntimeè所致: 沿東西線顯示java.lang.NullPointerException – kikoboar

回答

0

這裏。你可能有損壞的數據庫文件(實際上,1出的1024,你不)

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

,需指定緩衝區寫時讀的長度。你將得到的是每次寫入時的全部1024個字節。

我討厭編寫「InputStream/OutputStream」複製代碼,我在各處看到它。如果你想使用它,我創建了一個瘦身版本的apache commons庫。的東西,你從來沒有使用,但一些偉大的util的很多代碼在那裏:

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