Управление большой базой данных SQLite в Android

SQLite
Источником материала для этой статьи послужил вольный перевод вот ЭТОГО
Добавление файла базы данных размер, которого превышает 1 мегабайт в apk сопряжено с использованием различных трюков и хитростей. На множестве форумов и в блогах можно найти различные советы как это сделать.

  1. Переименование DB файла во что-нибудь имеющее расширение JPG, PNG, MP3.
    Недостатки метода: размер вашего APK будет слишком большим. Люди призадумаются, качать ваше приложение или нет. Это отъест драгоценную внутреннюю память.
  2. Не привязывать ваш файл базы данных к APK файлу и вместо этого загрузить его с сервера.
    Проблемы: у вас может не быть возможности/желания поддерживать вебсервер.
  3. Разделить файл базы данных на части размером менее 1 мегабайта.
    Проблемы: это не уменьшит размер APK, вам нужно будет соединять эти части
  4. Zip и Unzip метод. В этом методе файл перед построением APK архивируется в zip и разархивируется на SD карту, когда приложение будет запущено в первый раз.

Проследим шаг за шагом как это делается:
Шаги

  1. Поместите файл базы данных в zip-архив и переместите его в /res/raw
  2. В методе OnCreate проверить запускается ли приложение первый раз
  3. Распаковать БД и переместить её на SD карту
  4. Установить соединение с базой

Проверка существует ли файл БД, если не существует, то нужно его развернуть из файла.
Метод нужно вызывать в OnCreate.

    public void createDataBase() throws IOException{
     //получаем путь к SD-карте. Путь будет выглядеть примерно таким образом: /sdcard/Android/data/[packagename]/cache/
     File DB_PATH = myContext.getExternalCacheDir();
     //создаём каталог для нашей базы данных
     DB_PATH.mkdirs();
     //проверяем есть ли уже файл БД на карте
     File db = new File(DB_PATH, DB_NAME);
     if(!db.exists()) {
      //если файла нет, то попытаемся его создать
      db.createNewFile();
      try {
          copyFromZipFile();
      } catch (IOException e) {
          throw new Error("Error copying database",e);
         }
     }

Этот метод копирует файл БД из /res/raw на SD-карту

private void copyFromZipFile() throws IOException{
 InputStream is = myContext.getResources().openRawResource(R.raw.materia_medica);
     File outFile = new File(DB_PATH ,DB_NAME);
     OutputStream myOutput = new FileOutputStream(outFile.getAbsolutePath());
     ZipInputStream zis = new ZipInputStream(new BufferedInputStream(is));
      try {
          ZipEntry ze;
          while ((ze = zis.getNextEntry()) != null) {
              ByteArrayOutputStream baos = new ByteArrayOutputStream();
              byte[] buffer = new byte[1024];
              int count;
              while ((count = zis.read(buffer)) != -1) {
                  baos.write(buffer, 0, count);
              }
              baos.writeTo(myOutput);
          }
      } finally {
          zis.close();
          myOutput.flush();
          myOutput.close();
          is.close();
      }
    }

И последнее — устанавливаем соединение с БД. Тут всё просто

public SQLiteDatabase openDataBase() throws SQLException{
     File DB_PATH = myContext.getExternalCacheDir();
        File dbFile = new File (DB_PATH,DB_NAME);
     myDataBase = SQLiteDatabase.openDatabase(dbFile.getAbsolutePath(), null, SQLiteDatabase.OPEN_READWRITE);
     return myDataBase;
}
Bookmark the permalink.

One Response to Управление большой базой данных SQLite в Android

  1. Max87 says:

    спасибо, кое-что прояснил)
    вот еще в тему http://www.enterra.ru/blog/android_issues_with_sqlite/
    кое-какие моменты тоже неплохо изложены

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *