更改项目的包名后,数据库出现问题

时间:2014-11-04 20:23:49

标签: java android sqlite exception

在我更改项目的包名后,数据库出现问题,应用程序运行,除了在logcat中,我看到多个在包名更改之前没有发生的DeadObjectExceptions。这是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 个答案:

答案 0 :(得分:1)

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