Предварительно заполненная ошибка базы данных в Android 2.3.6 - PullRequest
1 голос
/ 05 марта 2012

Мое приложение (платформа 1.5) имеет предварительно заполненную базу данных. Файл Sqlite был больше 5 МБ, поэтому я разбил его на небольшие файлы размером менее 950 КБ и поместил их в активы.

Когда я впервые устанавливаю приложение, оно копирует все эти файлы в один файл базы данных. Это хорошо работает в моем собственном телефоне (Samsung GalaxyS 2.2). Тем не менее, я попробовал это в samsung gt-s5830i 2.3.6, и пока он загружает базу данных, он падает.

Я не знаю, почему это не работает. Пожалуйста, помогите мне.

Вот мой код:

открытый класс SQLiteDBHelper расширяет SQLiteOpenHelper {

    private static final String DB_PATH = "/data/data/com.android.appname/databases/";
    private static final String DB_NAME = "db.sqlite";
    private static final String ASSETS_DB_FOLDER = "db";

    private SQLiteDatabase myDataBase;

    private final Context myContext;


    public SQLiteDBHelper(Context context) {
        super(context, DB_NAME, null, 1);
        this.myContext = context;
    }


    /**
     * Creates a empty database on the system and overwrite it with your own
     * database.
     **/
    public void createDatabase() throws IOException {
        boolean dbExist = checkDatabase();
        if (!dbExist) {
            super.getReadableDatabase();
            try {
                copyDatabase();
            }
            catch (IOException e) {
                throw new Error("Error copying database");
            }
        }
    }

    /**
     * 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|SQLiteDatabase.NO_LOCALIZED_COLLATORS);
        }
        catch (SQLiteException e) {
            // database does't exist yet.
        }

        if (checkDB != null) {
            checkDB.close();
        }
        return checkDB != null ? true : false;
    }

    private void copyDatabase() throws IOException {
        String[] dbFiles = myContext.getAssets().list(ASSETS_DB_FOLDER);
        String outFileName = DB_PATH + DB_NAME;
        OutputStream myOutput = new FileOutputStream(outFileName);
        for(int i =0; i < dbFiles.length; i++) {
            InputStream myInput = myContext.getAssets().open(ASSETS_DB_FOLDER+"/"+dbFiles[i]);
            byte[] buffer = new byte[1024];
            int length;
            while ((length = myInput.read(buffer)) > 0) {
                myOutput.write(buffer, 0, length);
            }
            myInput.close();
        }
        myOutput.flush();
        myOutput.close();
    }

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

    @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) { }

    @Override
    public synchronized SQLiteDatabase getReadableDatabase (){
        try {
            createDatabase();
            openDatabase();
        }
        catch (SQLException e) {
            myDataBase = null;
            e.printStackTrace();
        }
        catch (IOException e) {
            myDataBase = null;
            e.printStackTrace();
        }
        return myDataBase;
    }
}
...