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

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

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

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

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

Ответы [ 4 ]

27 голосов
/ 12 апреля 2011

Я решил эту проблему следующим образом:

  1. добавив file.db в папку проекта / ресурсов;

  2. написав следующий класс:

    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;
        }
    }
    
14 голосов
/ 12 апреля 2011

Хорошая статья в блоге ReignDesign под названием Использование собственной базы данных SQLite в приложениях Android .В основном вы создаете базу данных, помещаете ее в каталог ресурсов в вашем apk и при первом использовании копируете в каталог "/ data / data / YOUR_PACKAGE / database /".

10 голосов
/ 12 апреля 2011

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

5 голосов
/ 27 апреля 2015

В комментарии к этому ответу 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().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...