Вставьте вложенный массив JSON в SQLite после анализа с помощью Gson - PullRequest
0 голосов
/ 07 ноября 2019

После анализа вложенного массива JSON с Gson мне нужно вставить результат в SQLite. Я попытался вставить как сделано, когда не разбирал с Gson, но это не сработало. Я искал способы сделать это, но не мог найти решение.

Разбор JSON:

Gson gson = new Gson();
Type listType = new TypeToken<List<Country>>(){}.getType();
List<Country> countriesList = gson.fromJson(jsonString, listType);
for(Country country : countriesList) {
    ContentValues insertValues;
}

Если бы я не использовал Gson, я бынаписали строку:

JSONObject countryObject = countriesList.getJSONObject(country);

РЕДАКТИРОВАТЬ

Один из объектов из JSON

[ 
   { 
      "name":"Afghanistan",
      "topLevelDomain":[ 
         ".af"
      ],
      "callingCodes":[ 
         "93"
      ],
      "capital":"Kabul",
      "region":"Asia",
      "subregion":"Southern Asia",
      "population":27657145,
      "latlng":[ 
         33.0,
         65.0
      ],
      "demonym":"Afghan",
      "area":652230.0,
      "gini":27.8,
      "timezones":[ 
         "UTC+04:30"
      ],
      "nativeName":"افغانستان",
      "numericCode":"004",
      "currencies":[ 
         { 
            "name":"Afghan afghani",
            "symbol":"؋"
         }
      ],
      "languages":[ 
         { 
            "name":"Pashto",
            "nativeName":"پښتو"
         },
         { 
            "name":"Uzbek",
            "nativeName":"Oʻzbek"
         },
         { 
            "name":"Turkmen",
            "nativeName":"Türkmen"
         }
      ],
      "translations":{ 
         "de":"Afghanistan",
      },
      "flag":"https://restcountries.eu/data/afg.svg",
      "cioc":"AFG"
   },

Классы моделей, которые я написал, предназначены только для необходимых мне переменных объектов и массивов.

Класс модели Country.Java

public class Country implements Parcelable {

    private String name;
    private String capital;
    private String region;
    private String subregion;
    private int population;
    private List<Double> latlng = new ArrayList<Double>();
    private double area;
    private double gini;
    private List<String> timezones = new ArrayList<String>();
    private List<Currency> currencies = new ArrayList<Currency>();
    private List<Language> languages = new ArrayList<Language>();
    private String flag;

    public Country() {}

//getters, setters, toString() and Parcelable methods
}

Класс модели Currency. Java

public class Currency implements Parcelable {

    private String name;
    private String symbol;

//getters, setters, toString() and Parcelable methods
}

Модель класса Language.Java

public class Language implements Parcelable {

    private String name;
    private String nativeName;

//getters, setters, toString() and Parcelable methods
}

Ответы [ 2 ]

0 голосов
/ 08 ноября 2019

Сначала получите свойство Country, затем поместите его в значения содержимого и вставьте.

List<Country> countries = gson.fromJson(jsonString, new TypeToken<List<Country>>(){}.getType());

for(Country country : countries) {  

    String name = country.getName();
    String capital = country.getCapital();
    String region = country.getRegion();
    String currencies = gson.toJson(country.getCurrencies());
    ...

    ContentValues insertValues = new ContentValues();  
    insertValues.put("name", name)
    insertValues.put("capital", capital);
    insertValues.put("region", region); 
    insertValues.put("currencies", currencies); 
    ...

    long res = db.insert(TABLE_NAME, null, insertValues); 

}
0 голосов
/ 08 ноября 2019

Трудно понять, где твоя проблема, без дополнительного кода. Вы выполняете две разные операции:

  1. , чтобы удалить json
  2. постоянных данных в SQLite.

Unmarshalling JSON с Gson

Внутри цикла for вы можете войти в каждую страну, чтобы увидеть, что вы получаете действительный объект со всеми установленными полями? Очень возможно, что вам нужно создать фабрику самостоятельно. Есть ли у страны подтип, который необходимо зарегистрировать через RuntimeTypeAdapterFactory? Может быть, что-то вроде

final RuntimeTypeAdapterFactory<City> typeFactory = RuntimeTypeAdapterFactory
  of(City.class, "MyCity")
  .registerSubtype(S...,...)

Сохранить в SQLite

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

public static ContentValues getContentValues(Country country) {
    ContentValues values = new ContentValues();
    values.put(COLUMN_ID, country.getId());
    values.put(COLUMN_NAME, country.getName());
    ...
    return values;
}

И затем, если это все еще не работает, вам нужно будет взглянуть на свою схему SQLite.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...