Как мне кажется, прям вот защитить не получится совсем, в ваших силах все только сильно усложнить. Мне в голову пришел жесткий вариант усложнения, который, кстати, может вообще отпугнуть пользователей:
В самом приложении базы нет. При установке на каждом клиенте генерится какой-то ID клиента, более менее уникальный (или на сервере генерится, это пофигу). Программа при первом запуске запрашивает у сервера базу и сообщает свой ID. Сервер записывает у себя соответствие: ID-клиента — закрытый_ключ — открытый_ключ. При помощи открытого ключа сервер шифрует базу и отдает клиенту. А далее программа при каждом запуске лезет на сервер и по своему ID получает закрытый ключ, который хранится в памяти пока она запущена и которым можно расшифровать базу.
Но, сами понимаете, для этого нужен интернет при запуске. Или, если андроид позволяет, какое-то shared хранилище в памяти куда можно положить свои данные пока программа выгружена из памяти и забрать их оттуда. Ведь телефоны выключают достаточно редко и такая штука может жить без интернета долго. Ну и все гонять по https, чтобы сложнее было распознать схему.