Подтвердить что ты не робот

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

Я думаю, что у меня есть основная проблема понимания, поэтому, возможно, кто-то может помочь: -)

Я разрабатываю приложение для Android с использованием Eclipse, и это приложение будет использовать базу данных (только чтение из базы данных будет реализовано). База данных содержит около 4000 записей, т.е. Создание и заполнение базы данных через исходный код не является вариантом. Таким образом, я создал базу данных заранее со всеми ее записями.

Но как я могу "внедрить" этот файл базы данных в свое приложение, а затем получить к нему доступ? Размер файла будет около 500 кбайт. Загрузка с удаленного сервера не является вариантом, поскольку это не разрешено.

Спасибо, Роберт

4b9b3361

Ответ 1

Я решил эту проблему:

  • добавление file.db в папку project/assets;

  • запись следующего класса:

    public class LinnaeusDatabase extends SQLiteOpenHelper{
    
        private static String DATABASE_NAME = "Dragonfly.db";
        public final static String DATABASE_PATH = "/data/data/com.kan.linnaeus/databases/";
        private static final int DATABASE_VERSION = 1;
    
        private SQLiteDatabase dataBase;
        private final Context dbContext;
    
        public LinnaeusDatabase(Context context) {
            super(context, DBActivity.DatabaseName, null, DATABASE_VERSION);
            this.dbContext = context;
            DATABASE_NAME = DBActivity.DatabaseName;
            // checking database and open it if exists
            if (checkDataBase()) {
                openDataBase();
            } else
            {
                try {
                    this.getReadableDatabase();
                    copyDataBase();
                    this.close();
                    openDataBase();
    
                } catch (IOException e) {
                    throw new Error("Error copying database");
                }
                Toast.makeText(context, "Initial database is created", Toast.LENGTH_LONG).show();
            }
        }
    
        private void copyDataBase() throws IOException{
            InputStream myInput = dbContext.getAssets().open(DATABASE_NAME);
            String outFileName = DATABASE_PATH + DATABASE_NAME;
            OutputStream myOutput = new FileOutputStream(outFileName);
    
            byte[] buffer = new byte[1024];
            int length;
            while ((length = myInput.read(buffer))>0){
                myOutput.write(buffer, 0, length);
            }
    
            myOutput.flush();
            myOutput.close();
            myInput.close();
        }
    
        public void openDataBase() throws SQLException {
            String dbPath = DATABASE_PATH + DATABASE_NAME;
            dataBase = SQLiteDatabase.openDatabase(dbPath, null, SQLiteDatabase.OPEN_READWRITE);
        }
    
        private boolean checkDataBase() {
            SQLiteDatabase checkDB = null;
            boolean exist = false;
            try {
                String dbPath = DATABASE_PATH + DATABASE_NAME;
                checkDB = SQLiteDatabase.openDatabase(dbPath, null,
                SQLiteDatabase.OPEN_READONLY);
            } catch (SQLiteException e) {
                Log.v("db log", "database does't exist");
            }
    
            if (checkDB != null) {
                exist = true;
                checkDB.close();
            }
            return exist;
        }
    }
    

Ответ 3

Я делал это в прошлом, сохраняя файл JSON в приложении в ресурсах res/raw, а затем загружая файл при первой загрузке. Оттуда вы можете использовать режим массовой вставки для пакетного импорта записей. См. мой загрузчик базы данных для Units в качестве примера этой методики. Одно из преимуществ стиля res/raw заключается в том, что вы можете использовать систему выбора ресурсов Android для локализации данных в разных регионах, поэтому у вас может быть другая база данных (или ее часть) для разных языков или регионов.

Вы также можете поместить исходный SQL-дамп в аналогичный файл и загрузить его при первой загрузке. Вы можете получить файл из ресурсов, используя openRawResource (int). Я бы рекомендовал это вместо хранения предварительно созданного файла базы данных sqlite, чтобы повысить совместимость между версиями sqlite, а также упростить ведение базы данных (из POV жизненного цикла приложения).

При загрузке вещей навалом обязательно используйте транзакции, так как это ускорит процесс и сделает загрузку более надежной.

Ответ 4

В комментарии к этому ответу CommonsWare рекомендует использовать тот же метод, предложенный здесь @evilone (т.е. самостоятельно копировать базу данных из активов). Вместо этого вы должны использовать проверенный и проверенный SQLiteAssetHelper. Я использовал его в Android Studio, и он работает хорошо.

направления довольно ясны. Вот несколько ключевых выдержек:

Если вы используете систему сборки Gradle, просто добавьте следующее зависимостей в вашем файле build.gradle:

dependencies {
    compile 'com.readystatesoftware.sqliteasset:sqliteassethelper:+'
}

Расширьте SQLiteAssetHelper, как обычно, SQLiteOpenHelper, предоставляя конструктору имя базы данных и номер версии:

public class MyDatabase extends SQLiteAssetHelper {

    private static final String DATABASE_NAME = "northwind.db";
    private static final int DATABASE_VERSION = 1;

    public MyDatabase(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }
}

Поместите свою базу данных в assets/databases/northwind.db (используя любое имеющееся имя базы данных).

База данных доступна для использования в первый раз getReadableDatabase() или getWritableDatabase().