Источником материала для этой статьи послужил вольный перевод вот ЭТОГО
Добавление файла базы данных размер, которого превышает 1 мегабайт в apk сопряжено с использованием различных трюков и хитростей. На множестве форумов и в блогах можно найти различные советы как это сделать.
- Переименование DB файла во что-нибудь имеющее расширение JPG, PNG, MP3.
Недостатки метода: размер вашего APK будет слишком большим. Люди призадумаются, качать ваше приложение или нет. Это отъест драгоценную внутреннюю память. - Не привязывать ваш файл базы данных к APK файлу и вместо этого загрузить его с сервера.
Проблемы: у вас может не быть возможности/желания поддерживать вебсервер. - Разделить файл базы данных на части размером менее 1 мегабайта.
Проблемы: это не уменьшит размер APK, вам нужно будет соединять эти части - Zip и Unzip метод. В этом методе файл перед построением APK архивируется в zip и разархивируется на SD карту, когда приложение будет запущено в первый раз.
Проследим шаг за шагом как это делается:
Шаги
- Поместите файл базы данных в zip-архив и переместите его в /res/raw
- В методе OnCreate проверить запускается ли приложение первый раз
- Распаковать БД и переместить её на SD карту
- Установить соединение с базой
Проверка существует ли файл БД, если не существует, то нужно его развернуть из файла.
Метод нужно вызывать в 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; }
спасибо, кое-что прояснил)
вот еще в тему http://www.enterra.ru/blog/android_issues_with_sqlite/
кое-какие моменты тоже неплохо изложены