Android save data json

Android Tutorial to Save Data from JSON File to Firebase

From the Firebase console, you can import the JSON file and save data into the Firebase database. But there is also another way to save data with JSON file to the Firebase database with push method using Android. Additionally with this method by using push, you can have a unique key for each record instead of having keys with numbers by using the import method in Firebase console. So, let’s discuss the Firebase Database Android Tutorial to Save Data from JSON File.

Additionally, in this tutorial, we fetch a JSON file from Back4App with data to save in the Firebase database. If you are not aware of how to download a file using Back4App you can follow our previous tutorial for downloading the JSON file from Back4App.

Note: We assume that you have already initialized Firebase to your Android Project.

Table of Contents

JSON File

The JSON file has a list of customer details like firstName, lastName, compayName, address, phone, email and web address. We will host this file in Back4App in column Customer_File.

customer.json

Create Application Class

1. Initially, we create an application class for this project with Back4App credentials and Firebase singleton class object for the Firebase Database.

AppApplication.java

Access Read and Write Permissions for Files

2. Since we are downloading and saving the file, later we need to read the same file we need to have access to read and write permissions for files in the Android App. We need to give static permissions in the manifestation file.

AndroidManifest.xml

Additionally to the static permissions, we also need to give dynamic permissions in the MainActivity class.

MainActivity.java

Download JSON File from Back4App

3. Further, for the app, we create a layout that has a button to download the JSON file from Back4App and store it locally in the app. Further, the file’s path is shown in the app. Also, there is an Upload button to save the data to Firebase.

activity_main.xml

4. After creating the layout to Download File and Textview for showing the path of the file, we create a Model Java class to parse the downloaded JSON file from Back4App.

UserData.java

5. In the activity class, we write code to download the file from Back4App. From the app Get File button is used to download the file.

MainActivity.java

Save the Data to Firebase Database

6. Finally after downloading the file from Back4App, we need to convert it to Customer List using the Customer model class.

Customer.java

7. Later after creating a model class for the Customer, we will convert the existing downloaded JSON file to the customer list with the Gson library and save the data to Firebase Customers table.

Источник

The new way of storing data in Android — Jetpack DataStore

In mobile applications some data has to be persisted to make the application startup faster, reduce network traffic or handle data completely offline. In this article, I would like to demonstrate the opportunities of how to store data in your Android application, especially with Jetpack DataStore. To introduce this I am going to give a walkthrough about the four mainly used approaches. The solutions that will be covered in the article are:

  • SharedPreferences
  • Preferences DataStore
  • Room
  • Proto DataStore

Besides the summary of current storage solutions, I will focus on the differences between SharedPrefrences, Room and DataStore. Regarding the DataStore, I added the implementation steps for both Preferences DataStore, and Proto DataStore.

SharedPreferences

If you have to store key-value pairs in your app, e.g.: user’s settings, IDs, the simplest way to implement this solution is the SharedPreferences API. A SharedPreferences object points to a file containing key-value pairs and provides simple methods to read and write them. Each SharedPreferences file is managed by the framework and can be private or shared across applications.

Implementation

Add required gradle dependency:

Saving user information to SharedPreferences:

Retrieving user information from SharedPreferences:

In the case of my application, which demonstrates a simple user data saving with the usage of Kotlin coroutines, this solution is not easy to use with Flow.

Unfortunately, SharedPreferences runs its read/write operations, except apply() function, on the main thread. Due to this disadvantage, and the lack of Kotlin Flow, and LiveData support, I would like to recommend a more sophisticated option, the Preferences DataStore.

Preferences DataStore

Preferences DataStore aims to replace SharedPreferences. The concept behind Preference DataStore is quite similar to SharedPreferences. It uses key-value pairs to store data and also does not provide type safeness. If you’re currently using SharedPreferences to store data, consider migrating to DataStore instead.

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

Why should you use Preferences DataStore instead of SharedPreferences?

  • DataStore is safe to call on the UI thread because it uses Dispatchers.IO under the hood
  • You do not have to use apply() or commit() functions to save the changes
  • Handles data updates transactionally
  • Exposes a Flow representing the current state of data

Implementation

1. Need to add this line into app-level build.gradle file’s dependencies

2. Create the DataStore instance

To create a Preferences DataStore, we can use the preferencesDataStore delegate. The delegate will ensure that we have a single instance of DataStore with that name in our application.

3. Create keys for the key part of the key-value pairs ( preferencesKeys )

4. To save data into DataStore

The edit() function is a suspend function, so it needs to be called from CoroutineContext .

Inside the lambda we have access to MutablePreferences , so we can change the value under the specified key.

Migration from SharedPreferences

With the usage of SharedPreferencesMigration we have the opportunity to migrate the “old fashioned” SharedPrefrences data to DataStore. Related/suggested article in this topic: Working with Preferences DataStore — Codelabs step by step guide — Step 7

SharedPreferences vs DataStore

  • It is built on Kotlin Coroutines and Flow. It exposes the preference values using Flow.
  • You don’t need to manually switch to a background thread
  • DataStore is safe from runtime exceptions and has error handling support. SharedPreferences throws parsing errors as runtime exceptions.
  • In both implementations, DataStore saves the preferences in a file and performs all data operations on Dispatchers.IO unless specified otherwise.

In my opinion, the following table is the best way to highlight the differences between the two key-value pair based storage approaches, and the Proto DataStore:

Room is designed to store and handle non-trivial amounts of structured data locally. Under the hood Room is a persistence library, which provides an abstraction layer over SQLite. The three major components of the library are:

The following diagram illustrates the connection between these major components:

Why use Room?

  • Part of Jetpack
  • Verifying SQL queries at compile time
  • It can be integrated with LiveData , RxJava , and Coroutine Flow easily
  • Reduces the amount of boilerplate code

Implementation

Add required Gradle dependencies:

Create the DAO with the Room SQL queries:

Room row insertion:

When should you use DataStore instead of Room?

If you use Room to save only one user’s data, you need to create a database with a table, and also need to implement the query and insert functions. It sounds really inconvenient, so in this case, the Proto DataStore can be the corresponding approach.

Proto Datastore

The aim of Proto DataStore is really similar to Preferences DataStore, but the previous one is able to store objects with custom data types. Unlike the Preferences DataStore it does not use key-value pairs, just returns the generated object in a Flow . The generated file’s type and structure depend on the schema of the .protoc file.

Key features:

  • Provides type safety out of the box
  • Able to define list inside protoc schema with repeated marked fields
  • Requires to learn a new serialization mechanism, which depends on Protobuf, but it is worth the effort
  • Protobuf is faster than XML and JSON serialization formats

Implementation

1. Add the following gradle dependencies to your app-level build.gradle file

If you need to use only Proto DataStore with typed objects you do not need to add the preferences version of the datastore dependency (androidx.datastore:datastore-preferences:1.0.0-beta01) .

2. Add protobuf to plugins in build.gradle

3. Add protobuf configuration to build.gradle

4. Add your proto file to project

In my case, I need to define the schema, which contains the user’s first name, last name, and birthday. So I need to add two string fields, and one 64-bit integer field ( int64 ). Birthday is stored in Long format, and that was the reason for using a 64-bit integer field.

You need to place your .proto file under app/src/main/proto folder. I gave user_preference.proto name to my file.

If you want to be familiar with the syntax of the protocol buffers, you should check this documentation:

Language Guide (proto3) | Protocol Buffers | Google Developers

This guide describes how to use the protocol buffer language to structure your protocol buffer data, including .proto…

5. Create the DataStore Serializer

This serializer class tells DataStore how to read and write your data type. Kotlin Serialization supports multiple formats including JSON and Protocol buffers.

As I mentioned before you have an option to use JSON instead of Protocol buffers. In my opinion, JSON is more readable and understandable, but the most common usage of DataStore depends on protocol buffers. Related, and recommended article, if you want to start a JSON based DataStore:

Using DataStore With Kotlin Serialization

Up till now we’ve shared how to use DataStore with Protos or Preferences. Under the hood both DataStore versions use…

6. Create the DataStore

7. To save data into DataStore

Default value

First of all, if you want to read an empty DataStore, which contains only standard field types (e.g.: string, int32, enum ), it will return the protobuf’s generated object with pre-initialized default values. In this case, your integers will be zero, and the strings will be empty strings.

If you import google/protobuf/wrappers.proto into your protobuf file, which depends on proto3 syntax you will be able to add fields with nullable types, e.g.: google.protobuf.StringValue first_name = 1;

Room vs DataStore

If you have a need for partial updates, referential integrity, or large/complex datasets, you should consider using Room instead of DataStore. DataStore is ideal for small or simple datasets and does not support partial updates or referential integrity.

Читайте также:  Год выпуска первого андроида

Suppose that your data structure is not large/complex, and need to store only one/few rows in a table, e.g: one user’s data. In this scenario, the usage of the Room can be a little bit of overkill. So if you have to store only a small bunch of data in your database, you have only one or few tables, and you don’t want to use the benefits of Room, you should choose DataStore.

The most crucial disadvantage of DataStore against Room is that, it does not support partial updates: if any field is modified, the whole object will be serialized and persisted to disk. If you want partial updates, consider the Room API (SQLite).

Wrapping up

In summary, DataStore is ideal to use with Kotlin, and especially with coroutines. Don’t worry if you already have an application, which contains only the standard SharedPreferences solution. The migration is provided by the DataStore API.

Because of the fact that DataStore handles data migration, guarantees data consistency, and handles data corruption, it is worth changing from SharedPreferences to DataStore.

The examples of the article were implemented originally in my POC application, which aims to demonstrate the implementation of these four ways of storage. If you are interested in the deeper technical/coding part of the topic, feel free to check the application on Github:

Источник

Учебник по JSON для Android: создание и анализ данных JSON

В этом руководстве описывается, как использовать JSON с Android . JSON расшифровывается как (Java Script Object Notation). Это простой и легкий формат обмена данными, который может быть легко прочитан людьми и машинами. JSON — это текстовый формат, не зависящий от языка. Он представляет данные в текстовом формате, чтобы их можно было легко проанализировать.

Введение в JSON

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

  • Коллекция пары имя / значение
  • массив

Первую структуру можно использовать для моделирования объекта, поскольку объект представляет собой набор атрибутов, которые содержат некоторые значения. Массив может использоваться для моделирования списка, массива объектов и так далее. Таким образом, используя эти две структуры, мы можем передавать данные между двумя машинами простым и эффективным способом. В последнее время JSON пользуется большим успехом, и большинство доступных API поддерживает формат JSON. Давайте посмотрим, как мы можем представлять данные в формате JSON.

Объект в JSON моделируется с помощью , а его атрибуты можно моделировать с помощью name: value pair.Value, в свою очередь, может быть объектом, массивом или «простым» значением, например, примитивным значением (int, Строка, логическое значение и т. Д.).

Так что если у нас есть, например, класс Java, как:

Источник

Android: парсим JSON правильно

Любой Android-разработчик рано или поздно сталкивается с форматом представления данных типа JSON. Наиболее часто он используется для передачи/получения данных с какого-либо сервера. Формат предельно прост, подробнее о нём можно почитать в Википедии:

«JSON (JavaScript Object Notation, обычно произносится как /ˈdʒeɪsən/ JAY-sən) — текстовый формат обмена данными, основанный на JavaScript. Как и многие другие текстовые форматы, JSON легко читается людьми. Несмотря на происхождение от JavaScript, формат считается независимым от языка и может использоваться практически с любым языком программирования. Для многих языков существует готовый код для создания и обработки данных в формате JSON».

Любой класс в Java или Kotlin можно представить в виде структуры JSON, где есть поля, атрибуты, фигурные скобки обозначают объект, квадратные скобки — массив.

Следующий пример показывает JSON-представление данных об объекте, описывающем человека. В данных присутствуют строковые поля имени и фамилии, информация об адресе и массив, содержащий список телефонов. Как видно из примера, значение может представлять собой вложенную структуру:

Наиболее популярный среди разработчиков способ трансформировать данные в JSON и обратно — это библиотека GSON от самих разработчиков Google. Она очень проста в использовании, мало весит и интегрирована во многие библиотеки.

На данный момент все, за редким исключением, Android-разработчики используют Kotlin, а GSON (как и другие подобные библиотеки типа Jackson или Moshi) написана на Java. Это не страшно, потому что Kotlin и Java полностью взаимозаменяемы, но есть небольшие нюансы, которые могут привести к совершенно неожиданным результатам.

Давайте создадим класс User и посмотрим на эти нюансы на практике. В этом классе у нас будут обычные поля и поля со значениями по умолчанию. Как вы знаете, в Java нельзя присваивать переменным значения по умолчанию, а в Kotlin можно:

И теперь представим, что с какого-то сервера пришли данные о пользователе в формате JSON:

Теперь нам нужно распарсить этот JSON и превратить его в обычный класс Kotlin с помощью библиотеки GSON. Добавим зависимость GSON в наш проект в файл Gradle

и сразу напишем тест:

Тест прекрасно выполняется без единой ошибки, то есть код работает. Но обратите внимание, что возраст пользователя у нас == 0, а его роль не определена, хотя в самом классе у нас прописаны значения по умолчанию для этих переменных. Если эти параметры не определены в JSON, должны подставляться значения по умолчанию: возраст == 13, а роль == Viewer, но они не подставляются, а код всё равно работает. Вот так неожиданность! Не такого поведения мы ожидали!

Давайте разбираться. Дело в том, что, как мы писали выше, библиотека GSON написана на Java, а это значит, что значения по умолчанию для несуществующих полей такие: для примитива int — это 0, для отсутствующего объекта — это null. Простая трансформация JSON в класс на Kotlin может легко сломать null-safety, на который так рассчитывают все разработчики, и может привести к падению приложения там, где оно падать не должно.

И тут нам на помощь приходит котлиновская библиотека по сериализации объектов.

Сериализация от Kotlin

Это небольшая вспомогательная библиотечка от разработчиков языка, которая работает с помощью аннотации @Serializable. С ней у вас не будет проблем при использовании полей по умолчанию. Чтобы подключить библиотеку к своему проекту, нужно прописать в файле Gradle плагин и несколько зависимостей. В файле проекта build.gradle(Project):

Читайте также:  Телевизор филипс андроид или нет

В файле проекта build.gradle(Module:app):

Теперь трансформация JSON (сериализация) будет проходить корректно. Напишем наш класс и добавим аннотацию:

Тест пройден успешно! Теперь класс сериализуется у нас со значениями по умолчанию, если таковые прописаны в классе.

Сериализация от Kotlin + Retrofit

Если вы хоть раз отправляли запрос на сервер или получали с сервера какой-то ответ, то наверняка вы знакомы с библиотекой Retrofit. В этой библиотеке нет поддержки сериализации от Kotlin, но у вас есть возможность добавить вспомогательную библиотеку от Джека Вортона в качестве зависимости Gradle:

Теперь при использовании Retrofit сериализация будет происходить автоматически:

Дополнительно, но не обязательно вы можете использовать JsonConfiguration для выключения StrictMode. StrictMode включен по умолчанию и запрещает использование неизвестных ключей в JSON и нечисловые значения в числах с плавающей точкой. Хорошая практика — включать StrictMode в «дебажной» версии приложения и выключать его в «релизной».

Читайте больше полезных статей для начинающих Android-разработчиков:

А если затянет — приходите на факультет Android-разработки. В время учебы вы разработаете Android-приложение и выложите его в Google Play, даже если никогда не программировали. А также своите языки Java и Kotlin, командную разработку, Material Design и принципы тестирования.

Любой Android-разработчик рано или поздно сталкивается с форматом представления данных типа JSON. Наиболее часто он используется для передачи/получения данных с какого-либо сервера. Формат предельно прост, подробнее о нём можно почитать в Википедии:

«JSON (JavaScript Object Notation, обычно произносится как /ˈdʒeɪsən/ JAY-sən) — текстовый формат обмена данными, основанный на JavaScript. Как и многие другие текстовые форматы, JSON легко читается людьми. Несмотря на происхождение от JavaScript, формат считается независимым от языка и может использоваться практически с любым языком программирования. Для многих языков существует готовый код для создания и обработки данных в формате JSON».

Любой класс в Java или Kotlin можно представить в виде структуры JSON, где есть поля, атрибуты, фигурные скобки обозначают объект, квадратные скобки — массив.

Следующий пример показывает JSON-представление данных об объекте, описывающем человека. В данных присутствуют строковые поля имени и фамилии, информация об адресе и массив, содержащий список телефонов. Как видно из примера, значение может представлять собой вложенную структуру:

Наиболее популярный среди разработчиков способ трансформировать данные в JSON и обратно — это библиотека GSON от самих разработчиков Google. Она очень проста в использовании, мало весит и интегрирована во многие библиотеки.

На данный момент все, за редким исключением, Android-разработчики используют Kotlin, а GSON (как и другие подобные библиотеки типа Jackson или Moshi) написана на Java. Это не страшно, потому что Kotlin и Java полностью взаимозаменяемы, но есть небольшие нюансы, которые могут привести к совершенно неожиданным результатам.

Давайте создадим класс User и посмотрим на эти нюансы на практике. В этом классе у нас будут обычные поля и поля со значениями по умолчанию. Как вы знаете, в Java нельзя присваивать переменным значения по умолчанию, а в Kotlin можно:

И теперь представим, что с какого-то сервера пришли данные о пользователе в формате JSON:

Теперь нам нужно распарсить этот JSON и превратить его в обычный класс Kotlin с помощью библиотеки GSON. Добавим зависимость GSON в наш проект в файл Gradle

и сразу напишем тест:

Тест прекрасно выполняется без единой ошибки, то есть код работает. Но обратите внимание, что возраст пользователя у нас == 0, а его роль не определена, хотя в самом классе у нас прописаны значения по умолчанию для этих переменных. Если эти параметры не определены в JSON, должны подставляться значения по умолчанию: возраст == 13, а роль == Viewer, но они не подставляются, а код всё равно работает. Вот так неожиданность! Не такого поведения мы ожидали!

Давайте разбираться. Дело в том, что, как мы писали выше, библиотека GSON написана на Java, а это значит, что значения по умолчанию для несуществующих полей такие: для примитива int — это 0, для отсутствующего объекта — это null. Простая трансформация JSON в класс на Kotlin может легко сломать null-safety, на который так рассчитывают все разработчики, и может привести к падению приложения там, где оно падать не должно.

И тут нам на помощь приходит котлиновская библиотека по сериализации объектов.

Сериализация от Kotlin

Это небольшая вспомогательная библиотечка от разработчиков языка, которая работает с помощью аннотации @Serializable. С ней у вас не будет проблем при использовании полей по умолчанию. Чтобы подключить библиотеку к своему проекту, нужно прописать в файле Gradle плагин и несколько зависимостей. В файле проекта build.gradle(Project):

В файле проекта build.gradle(Module:app):

Теперь трансформация JSON (сериализация) будет проходить корректно. Напишем наш класс и добавим аннотацию:

Тест пройден успешно! Теперь класс сериализуется у нас со значениями по умолчанию, если таковые прописаны в классе.

Сериализация от Kotlin + Retrofit

Если вы хоть раз отправляли запрос на сервер или получали с сервера какой-то ответ, то наверняка вы знакомы с библиотекой Retrofit. В этой библиотеке нет поддержки сериализации от Kotlin, но у вас есть возможность добавить вспомогательную библиотеку от Джека Вортона в качестве зависимости Gradle:

Теперь при использовании Retrofit сериализация будет происходить автоматически:

Дополнительно, но не обязательно вы можете использовать JsonConfiguration для выключения StrictMode. StrictMode включен по умолчанию и запрещает использование неизвестных ключей в JSON и нечисловые значения в числах с плавающей точкой. Хорошая практика — включать StrictMode в «дебажной» версии приложения и выключать его в «релизной».

Читайте больше полезных статей для начинающих Android-разработчиков:

А если затянет — приходите на факультет Android-разработки. В время учебы вы разработаете Android-приложение и выложите его в Google Play, даже если никогда не программировали. А также своите языки Java и Kotlin, командную разработку, Material Design и принципы тестирования.

Источник

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