Как использовать предварительно загруженную базу данных SQLite в Android из ресурсов - PullRequest
6 голосов
/ 26 ноября 2011

Я хочу использовать preloaded database в своем приложении, значит, попытаться получить базу данных во время установки apk, чтобы можно было использовать данные, уже сохраненные в ней. Я копирую "ингридиенты.db" файл в папке активов. И используйте следующий код но это выдает ошибку «Проблема копирования базы данных из файла ресурсов»

Как я могу решить эту проблему? пожалуйста, предложите мне возможные пути

Класс My Database Helper такой же

class IngredientHelper extends SQLiteOpenHelper {
        private static final String DATABASE_PATH = "/data/data/com.example.preloadeddatabase/databases/";
        private static final String DATABASE_NAME = "ingredients.db";

        private static final String TABLE_NAME = "Ingredients";
        private static final String COLUMN_ID = "_id";
        private static final String COLUMN_TITLE = "ingredient_name";

        private static final int SCHEMA_VERSION = 1;

        public SQLiteDatabase dbSqlite;
        private final Context myContext;

        public IngredientHelper(Context context) {
            super(context, DATABASE_NAME, null, SCHEMA_VERSION);
            this.myContext = context;

        }

        @Override
        public void onCreate(SQLiteDatabase db) {

        }

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

        }

        public void createDatabase() {

            createDB();
        }

        public void createDB() {

            boolean dbExist = DbExists();

            if (!dbExist) {
                this.getReadableDatabase();
                copyDataBase();

            }
        }

        private boolean DbExists() {
            SQLiteDatabase db = null;
            try {
                String databasePath = DATABASE_PATH + DATABASE_NAME;
                db = SQLiteDatabase.openDatabase(databasePath, null,
                        SQLiteDatabase.OPEN_READWRITE);

                db.setLocale(Locale.getDefault());
                db.setLockingEnabled(true);
                db.setVersion(1);

            }

            catch (SQLiteException e) {
                Log.e("SqlHelper", "Database Not Found");
            }

            if (db != null) {
                db.close();
            }

            return db != null ? true : false;
        }

        private void copyDataBase() {
            InputStream iStream = null;
            OutputStream oStream = null;
            String outFilePath = DATABASE_PATH + DATABASE_NAME;
            try {
                iStream = myContext.getAssets().open(DATABASE_NAME);
                oStream = new FileOutputStream(outFilePath);
                byte[] buffer = new byte[2048];
                int length;
                while ((length = iStream.read(buffer)) > 0) {
                    oStream.write(buffer, 0, length);
                }
                oStream.flush();
                oStream.close();
                iStream.close();
            }

            catch (IOException e) {
                throw new Error("Problem Copying Database From Resource File");
            }
        }

        public void openDatabase() throws SQLException {

            String myPath = DATABASE_PATH + DATABASE_NAME;
            dbSqlite = SQLiteDatabase.openDatabase(myPath, null,
                    SQLiteDatabase.OPEN_READWRITE);
        }

        @Override
        public synchronized void close() {

            if (dbSqlite != null) {
                dbSqlite.close();
            }
            super.close();

        }

        public Cursor getCursor() {
            SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
            queryBuilder.setTables(TABLE_NAME);
            String[] asColumnsToReturn = new String[] { COLUMN_ID, COLUMN_TITLE };

            Cursor mCursor = queryBuilder.query(dbSqlite, asColumnsToReturn,
                    null, null, null, null, "ingredient_name ASC");

            return mCursor;
        }

        public String getName(Cursor c) {
            return (c.getString(1));
        }

Ответы [ 3 ]

2 голосов
/ 26 ноября 2011

Не открывайте читаемую базу данных, пока не скопируете файл ресурса в каталог базы данных.Вполне вероятно, что вы получаете исключение, поскольку вы пытаетесь записать в файл, который у вас уже открыт (так как он открывается при вызове getReadableDatabase ()).

1 голос
/ 20 декабря 2012

Вот простое решение вашей проблемы, но в этом методе есть ошибка. Когда вы используете метод this.getReadableDatabase () ;, тогда база данных открыта, т.е. она должна быть закрыта this.close (); Эта ошибка особенно важна для устройств HTC Desire

Используйте это решение , там решите проблему открытия БД.

0 голосов
/ 26 ноября 2011

файл базы данных должен иметь расширение ".sqlite" вместо ".db"

...