2014-11-04 47 views
0

在更改项目的包名称后,数据库出现问题,该应用程序运行并且在logcat中运行,但是在包名更改之前看到多个未发生的DeadObjectException。这里是db类在更改项目的包名后出现数据库问题

package com.posks.lernedeutsch.dieartikel.db; 

    import java.io.FileOutputStream; 
    import java.io.IOException; 
    import java.io.InputStream; 
    import java.io.OutputStream; 
    import java.util.ArrayList; 
    import java.util.List; 

    import android.content.Context; 
    import android.database.Cursor; 
    import android.database.SQLException; 
    import android.database.sqlite.SQLiteDatabase; 
    import android.database.sqlite.SQLiteException; 
    import android.database.sqlite.SQLiteOpenHelper; 

    import com.posks.lernedeutsch.dieartikel.quiz.Question; 


    public class DBHelper extends SQLiteOpenHelper{ 

     //The Android's default system path of your application database. 
     private static String DB_PATH = "/data/data/com.posks.lernedeutsch.dieartikel/databases/"; 
     private static String DB_NAME = "questionsDb"; 
     private SQLiteDatabase myDataBase; 
     private final Context myContext; 

     /** 
     * Constructor 
     * Takes and keeps a reference of the passed context in order to access to the application assets and resources. 
     * @param context 
     */ 
     public DBHelper(Context context) { 
      super(context, DB_NAME, null, 1); 
      this.myContext = context; 
     } 

     /** 
     * Creates a empty database on the system and rewrites it with your own database. 
     * */ 
     public void createDataBase() throws IOException{ 

      boolean dbExist = checkDataBase(); 
      if(!dbExist) 
      { 
       //By calling this method and empty database will be created into the default system path 
       //of your application so we are gonna be able to overwrite that database with our database. 
       this.getReadableDatabase(); 

       try { 
        copyDataBase(); 
       } catch (IOException e) { 
        throw new Error("Fehler beim Kopieren der Datenbank"); 
       } 
      } 
     } 

     /** 
     * Check if the database already exist to avoid re-copying the file each time you open the application. 
     * @return true if it exists, false if it doesn't 
     */ 
     private boolean checkDataBase(){ 
      SQLiteDatabase checkDB = null; 
      try{ 
       String myPath = DB_PATH + DB_NAME; 
       checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 
      }catch(SQLiteException e){ 
       //database does't exist yet. 
      } 
      if(checkDB != null){ 
       checkDB.close(); 
      } 

      return checkDB != null ? true : false; 
     } 

     /** 
     * Copies your database from your local assets-folder to the just created empty database in the 
     * system folder, from where it can be accessed and handled. 
     * This is done by transfering bytestream. 
     * */ 
     private void copyDataBase() throws IOException{ 

      //Open your local db as the input stream 
      InputStream myInput = myContext.getAssets().open(DB_NAME); 

      // Path to the just created empty db 
      String outFileName = DB_PATH + DB_NAME; 

      //Open the empty db as the output stream 
      OutputStream myOutput = new FileOutputStream(outFileName); 

      //transfer bytes from the inputfile to the outputfile 
      byte[] buffer = new byte[1024]; 
      int length; 
      while ((length = myInput.read(buffer))>0){ 
       myOutput.write(buffer, 0, length); 
      } 

      //Close the streams 
      myOutput.flush(); 
      myOutput.close(); 
      myInput.close(); 

     } 

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

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

     @Override 
     public void onCreate(SQLiteDatabase db) { 
     } 

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

     // Add your public helper methods to access and get content from the database. 
     // You could return cursors by doing "return myDataBase.query(....)" so it'd be easy 
     // to you to create adapters for your views. 




     public List<Question> getQuestionSet(int difficulty, int numQ){ 
      List<Question> questionSet = new ArrayList<Question>(); 
      Cursor c = myDataBase.rawQuery("SELECT * FROM QUESTIONS WHERE DIFFICULTY=" + difficulty + 
        " ORDER BY RANDOM() LIMIT " + numQ, null); 
      while (c.moveToNext()){ 
       //Log.d("QUESTION", "Question Found in DB: " + c.getString(1)); 
       Question q = new Question(); 
       q.setQuestion(c.getString(1)); 
       q.setAnswer(c.getString(2)); 
       q.setOption1(c.getString(3)); 
       q.setOption2(c.getString(4)); 
       q.setOption3(c.getString(5)); 
       q.setRating(difficulty); 
       questionSet.a`enter code here`dd(q); 
      } 
      return questionSet; 
     } 
    } 

回答

1

只在新安装时复制数据库。我会从测试设备/ vm中卸载应用程序,以确保它能够正确地复制。如果问题仍然存在,我会搜索您的项目以确保没有任何其他对旧包名称的引用,因为它可能并非每个引用都在重新分解时发生更改。