2011-11-04 88 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