Андроид все пользовательские данные

Android с нуля: как хранить данные приложения локально

Russian (Pусский) translation by Ellen Nelson (you can also view the original English article)

Когда доходит до сохранения данных приложений локально, разработчики Android определённо избалованы выбором. Помимо прямого доступа к внутренним и внешним областям хранения Android-устройства, платформа Android предлагает базы данных SQLite для хранения реляционных данных и специальные файлы для хранения пар ключ-значение. Более того, приложения для Android также могут использовать сторонние базы данных, которые предлагают поддержку NoSQL.

В этом уроке я покажу вам, как использовать все эти параметры хранения в приложениях для Android. Я также помогу вам понять, как выбрать наиболее подходящий вариант хранения данных.

Вам проще учиться по видео? Почему бы не посмотреть наш курс:

1. Хранение пар ключ-значение

Если вы ищете быстрый способ хранения нескольких строк или номеров, вам следует рассмотреть возможность использования файла настроек (preferences). Активити и службы Android могут использовать метод getDefaultSharedPreferences() класса PreferenceManager , чтобы ссылаться на объект SharedPreferences , который может быть использован и для чтения, и для записи в файл настроек по умолчанию.

Чтобы начать запись в файл настроек, вы должны вызвать метод edit() объекта SharedPreferences , который возвращает объект SharedPreferences.Editor .

Объект SharedPreferences.Editor имеет несколько интуитивных методов, которые можно использовать для хранения новых пар ключ-значение в файле настроек. Например, вы можете использовать метод putString() , чтобы поместить пару ключ-значение со значением типа String . Аналогично, вы можете использовать метод putFloat() , чтобы поместить пару ключ-значение, чьё значение типа float . Следующий пример кода создаёт три пары ключ-значение:

После того, как вы добавили все пары, вы должны вызвать метод commit() объекта SharedPreferences.Editor , чтобы сохранить их.

Чтение из объекта SharedPreferences гораздо проще. Всё, что вам нужно сделать, так это вызвать соответствующий метод get*() . Например, чтобы получить пару ключ-значение, чьё значение является String , вы должны вызывать метод getString() . Вот фрагмент кода, который извлекает все значения, которые мы добавили ранее:

Как вы видите из кода выше, второй параметр всех методов get*() ожидает значение по-умолчанию, которое является значением, которое должно быть возвращено, если ключ не существует и файле настроек.

Обратите внимание, что файлы настроек ограничены только строками и примитивными типами данных. Если вы хотите сохранить более сложные типы данных или двоичные данные, вы должны выбрать другой вариант хранения.

2. Использование базы данных SQLite

Каждое приложение для Android может создавать и использовать базы данных SQLite для хранения больших объемов структурированных данных. Как вы уже знаете, SQLite не только лёгкая, но и очень быстрая. Если у вас есть опыт работы с системами управления реляционными базами данных и вы знакомы как с SQL, что является сокращением для Structured Query Language, и JDBC, что является сокращением для Java Database Connectivity, это может быть предпочтительным вариантом хранения.

Чтобы создать новую базу данных SQLite или открыть уже существующую, вы можете использовать метод openOrCreateDatabase() внутри своей активити или службы. В качестве аргументов вы должны передать имя своей базы данных и режим, в котором вы хотите её открыть. Наиболее часто используемый режим MODE_PRIVATE , который гарантирует, что база данных доступна только для вашего приложения. Например, вот как вы можете открыть или создать базу данных с именем my.db:

После создания базы данных вы можете использовать метод execSQL() для запуска SQL-инструкций. В следующем коде показано, как использовать оператор SQL CREATE TABLE для создания таблицы названной user, которая имеет три столбца:

Хотя можно вставить новые строки в таблицу с помощью метода execSQL() , лучше использовать метод insert() . Метод insert() ожидает объект ContentValues , содержащий значения для каждого столбца таблицы. Объект ContentValues очень похож на объект Map и содержит пары ключ-значение.

Читайте также:  Вконтакте андроид не работают уведомления

Вот два объекта ContentValues , которые вы можете использовать с таблицей user :

Как вы могли догадаться, ключи, которые вы передаете методу put() , должны соответствовать именам столбцов в таблице.

Когда объекты ContentValues готовы, вы можете передать их методу insert() вместе с именем таблицы.

Чтобы отправить запрос в базу данных, вы можете использовать метод rawQuery() , который возвращает объект Cursor , содержащий результаты запроса.

Объект Cursor может содержать ноль или несколько строк. Самый простой способ перебрать все его строки, так это вызвать метод moveToNext() внутри цикла while .

Чтобы получить значение отдельного столбца, вы должны использовать такие методы, как getString() и getInt() , которые ожидают индекс столбца. Например, вот как вы получите все значения, вставленные в таблице user :

После того, как вы получите все результаты вашего запроса, убедитесь, что вы вызвали метод close() для объекта Cursor , чтобы освободить все ресурсы, которые он хранит.

Аналогичным образом, когда вы закончили все операции с базой данных, не забудьте вызвать метод close() для объекта SQLiteDatabase .

3. Использование внутреннего хранилища

Каждое приложение Android имеет свой собственный внутренний каталог хранения, взаимодействующий с ним, в котором приложение может хранить текстовые и двоичные файлы. Файлы внутри этого каталога недоступны для пользователя или других приложений, установленных на устройстве пользователя. Они также автоматически удаляются, когда пользователь удаляет приложение.

Прежде чем вы сможете использовать внутренний каталог хранилища, вы должны определить его местоположение. Для этого вы можете вызвать метод getFilesDir() , который доступен как для активити, так и для служб.

Чтобы получить ссылку на файл внутри каталога, вы можете передать имя файла вместе с указанным вами расположением. Например, вот как вы получите ссылку на файл alice.csv:

С этого момента вы можете использовать свои знания о классах и методах I/O (ввода/вывода) Java для чтения или записи в файл. В следующем фрагменте кода показано, как использовать объект FileOutputStream и метод write() для записи в файл:

4 . Использование внешнего хранилища

Поскольку внутреннее хранилище устройств Android обычно фиксировано и часто довольно ограничено, некоторые устройства Android поддерживают внешние носители данных, такие как съемные микро SD-карты. Я рекомендую использовать этот вариант хранения для больших файлов, таких как фотографии и видео.

В отличие от внутреннего хранилища, внешнее хранилище может не всегда быть доступно. Поэтому, перед его использованием, вы должны всегда проверять, смонтировано ли оно. Для этого используйте метод getExternalStorageState() класса Environment .

Как только вы убедитесь, что внешнее хранилище доступно, вы можете получить путь к файлу внешнего хранилища для своего приложения, вызвав метод getExternalFilesDir() и передав null в качестве аргумента. Затем вы можете использовать путь для ссылки на файлы внутри каталога. Например, вот как вы можете ссылаться на файл с именем bob.jpg в каталоге внешнего хранилища приложения:

Попросив пользователя предоставить вам разрешение WRITE_EXTERNAL_STORAGE , вы можете получить доступ для чтения/записи ко всей файловой системе во внешнем хранилище. Затем вы можете использовать известные общедоступные каталоги для хранения ваших фотографий, фильмов и других мультимедийных файлов. Класс Environment предлагает метод getExternalStoragePublicDirectory() для определения путей этих общих каталогов.

Например, передав этому методу значение Environment.DIRECTORY_PICTURES , вы можете определить путь к общедоступному каталогу, в котором вы можете хранить фотографии. Аналогично, если вы передадите этому методу значение Environment.DIRECTORY_MOVIES , вы получите путь к общедоступному каталогу, в котором могут быть сохранены фильмы.

Вот как вы можете ссылаться на файл bob.jpg в каталоге общих изображений:

Когда у вас есть объект File , вы можете снова использовать классы FileInputStream и FileOutputStream для чтения или записи на него.

Заключение

Теперь вы знаете, как максимально использовать возможности локального хранилища, предоставляемые Android SDK. Независимо от выбранного вами варианта хранения операции чтения/записи могут потребовать много времени, если задействованы большие объемы данных. Поэтому, чтобы убедиться, что основной поток пользовательского интерфейса всегда остается отзывчивым, вы должны рассмотреть возможность запуска операций в другом потоке.

Читайте также:  Андроид не открывается панель уведомлений

Чтобы узнать больше о сохранении данных приложения локально, обратитесь к официальному руководству API хранения данных.

Источник

Резервирование пользовательских данных в Android

Нижеизложенный материал не претендует на оригинальность или новизну решаемой проблемы, но может быть крайне полезен новичкам и тем, кто как и я, заботится о сохранности своих данных на устройствах под управлением Android. Далее в статье я ставлю перед собой задачи по обеспечению надежного резервирования данных при помощи облачных сервисов хранения данных и решаю их. Все еще интересно? Тогда добро пожаловать под хабркат.

Прежде чем начать скажу о том что я не отношусь к той категории сограждан которые маниакально заботятся о приватности своих данных. Это вовсе не значит что у меня сеанс работы в ОС без авторизации, кругом открытые шары, стандартные пароли на учетные записи или открытые беспроводные сети дома и на работе. Это лишь значит что я не шифрую свои файлы, пользуюсь публичной почтой и сервисами облачного хранения данных и сплю крепким и здоровым сном не думая о том что работники датацентра или владельцы сервисов могут, если захотят, смотреть мои данные. Лично я считаю что приватность, как таковая — давно умерла, но это тема выходит за рамки этого поста.

Зато я, надеюсь как и многих из вас, забочусь о безопасности данных со стороны резервирования. Уважаемый %username% спросит — Так при чем же тут Android? А Android тут при том что за последние несколько лет эта ОС плотно поселилась в моей повседневной жизни, полностью вытеснив от туда iOS и WM. В добавок к этому в последнее время, как грибов после дождя, развилось много сервисов предоставляющих, как бесплатно так и за дензнаки, энное количество гигабайт на “надежных” серверах где то там в глобальной сети. Я считаю что эти “надежные” сервисы — всяко надежнее моего домашнего ПК, флешек и дисков, и уж в разы удобнее в плане доступности. Грех не воспользоваться этим аттракционом неслыханной щедрости.

В последнее время у меня накопилось большое количество разного рода информации, потерять которую было бы крайне неприятно. Я говорю в первую очередь о фотографиях своего ребенка и жены, фотографий любимого котэ, каких то моих проектах по работе, и разного рода приятной мелочи на вроде прогресса в играх.

Я заставлял себя делать бекапы на своих устройствах. Составил даже что то вроде календарного плана. Делать это регулярно получилось с разным успехом, на это банально не хватало времени. В результате в голове зрела мысль о том как весь этот процесс автоматизировать.

И вот как то выдался выходной и я решил «прошерстить» Google Play на наличие приложений которые бы могли помочь мне сохранить свои данные, сесть и все настроить.

И так, для того, что бы я был спокоен, мне надо:

  • Резервирование по расписанию с минимальным моим участием а лучше вообще без меня.
  • Резервирование в облако (предпочтительно в несколько)
  • Реплицирование резервных копий данных на hdd домашней рабочей станции и на hdd ноутбуков (вдруг «немцы нападут» и интернет выключат) и все тоже без моего участия
  • Синхронизация из любого места где есть доступ к интернет.

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

В Android как бы есть выстроенный механизм резервирования, но он не работает. Точнее сказать — я не смог его «приготовить» так, что бы он выполнил требования, описанные выше. Контакты и все что связано а Gmail резервируются штатно как и положено, их не трогаем.

У меня (как у многих из вас) есть учетные записи в нескольких облачных сервисах, в которых при условии бесплатного использования доступно разное количество «халявных» гигабайт. Мне этих “халявных” гигабайт будет более чем достаточно, если вдруг не хватит — прикуплю еще.

Читайте также:  Взлом киви кошелька андроид

Dropbox в основном используется для работы и обмена информации с друзьями.

  • SkyDrive достался в нагрузку с учеткой от outlook.com и новой windows 8, не используется. Google Drive — родной для Android сервис, храню в нем разного рода документы по привычке после Google Docs, нравится.
  • BOX, с халявными 50 гигабайтами до последнего времени вообще не использовался.
  • Еще есть всякого рода Ubuntu One, Sugarsync и пара-тройка других менее популярных их аналогов которые я рассматривал чисто в ознакомительных целях.

По запросу «Data Sync» Google Play вывалил на «меня вагон и маленькую тележку» разного качества приложений, которые вместе с «раем на земле» обещали мне обеспечить и сохранность моих данных. Какие то делали это за деньги, а какие то совершенно безвозмездно. Какие давно не обновлялись, другие имели мягко говоря — спартанский интерфейс. В результате я купил пару полных версий приложений и занялся их полевыми испытаниями.

Мне бы не хотелось делать сравнительный обзор этих приложений. Скажу лишь что для своих нужд я приспособил приложение с говорящим названием «FolderSync» (есть платная и бесплатная версия). Ниже несколько скриншотов интерфейса, как говорится, один раз настроил и забыл.

Логика работы приложения строится на создании пары папок (Folderpairs), локальной и удаленной. Локальная папка это ЛЮБАЯ локальная папка на вашем устройстве, включая, если надо, вложенные папки. Удаленная папка, как следует из названия, это папка на одном из сервисов облачного хранения данных или вашем ftp, smb или webdav сервере. В настройках каждой folderpairs можно указать направление синхронизации, задать расписание, способ разрешения конфликтов, правила использования беспроводных сетей и кучу других параметров. На скриншотах ниже настройка той самой folderpair.

Я не о особо бережно забочусь о резервировании установленных приложений, всех их данных или прошивки (для себя не вижу смысла). Но эта задача также легко решается путем создания folderpair для папки, в которой хранят свои бекапы TitaniumBackup (который как бы и сам умеет закачивать в облако, только не в любое) или ROM Manager. К слову говоря, DataSync умеет бекапить и приложения, если у вас есть root.

Мне кажется, что настройка списков синхронизации удобнее сделана в DataSync Beta, правда она еще довольно сырая, но быстро развивается. В этой версии приложения можно задать несколько папок в рамках одного списка. Очень удобно (есть стабильные версии Data Sync, но мне они не подошли, Beta имеет более широкий функционал, будем за ней наблюдать).

После того как мы настроили должным образом нужные нам folderpair все что нам остается это оставить телефон или планшет на ночь заряжаться или, придя на работу, подключить его к компьютеру. Понятное дело, что надо не забыть включить wifi. Это может сделать вручную, а можно использовать такие утилиты, как Llama.

Программа синхронизации подключится через беспроводную сеть к интернет и проведет синхронизацию. Первый раз это займет время, которое напрямую зависит от объема данных и ширины канала доступа в интернет. Зато последующие синхронизации занимают считанные секунды. FolderSync помнит о датах изменения файлов их количестве в папке и контрольные суммы. В общем все по-взрослому. Синхронизацию любой folderpair можно запустить принудительно вручную в любое время.

В дальнейшем, ваши файлы синхронизируются согласно представленной выше схеме. Попадая в облако файл реплицируется на рабочий ПК, который как правило не выключается, с помощью шатного клиента для облачного сервиса. Затем они локально синхронизируются между папками, которые находятся на разных hdd при помощи стандартного и бесплатного SyncToy от Microsoft или rsync (как вам удобнее), или аналогичной утилиты. В течении дня, по мере подключения к интернет, резервируемые данные реплицируются на домашний компьютер и ноутбуки с помощью тех же родных клиентов облачных сервисов.

В сухом остатке имеем физически разнесенные и высокодоступные копии данных и крепкий, здоровый сон. Всего вам доброго.

Источник

Оцените статью