簡體   English   中英

將巨大的JSON數據插入到android中的SQLite DB中的方法是什么?

[英]What is the way to insert a huge JSON data into a SQLite DB in android

我有一個大的json請求,也就是說,它有大約50k行,有15列,我必須插入到具有相同結構的SQLite DB中。 這是,我必須將postgres db中分配的相同數據復制到我的應用程序中的sqlite數據庫中。 有沒有一種有效的方法呢? 是否有一些api或某些東西可以幫助工作?

我必須告訴我,我可以使用不大的JSON數據來處理OMRLite,但是當我嘗試使用更大的數據時,我的應用程序崩潰並出現內存不足錯誤

如果你有一些我可以遵循的想法或一些例子,我將非常感激! 提前致謝!

您還可以使用Google的官方Gson流媒體庫。

Gson Streaming: Gson Streaming

JsonReader在使用Streaming庫解析json方面起着非常重要的作用。

因為JSON太大,所以無法將其完全加載到內存中。 即使使用標准JSONObject也會導致許多設備的內存不足。

我在類似的情況下所做的是使用傑克遜解析它。 傑克遜可以從流中做到這一點,因此內存使用根本不是問題。 缺點是API與普通選項相比並非直接使用。

這是我發現的一個例子: Jackson Streaming

GSON流為我工作Gson - 流媒體,但我不得不說它花了他的時間,大約4分鍾,68K行,例如10列。 但無論如何解決了我的問題。 所以我有這個JSON響應:

- preciosArtPK: {
                   codLista: 1,
                   codArticulo: 11348,
                   cansiVenta: 1,
                   fecVigencia: 1435781252000
},
  siglaVenta: "UN",
  precioVenta: 0,
  margenPct: 100,
  codUsuario: 1,
  vigente: "S",
  nomModulo: "MIGRACION"

JSON之上是數組響應的一部分,但我將這些“preciosArtPK”包含在與gson的序列化中。 我怎么能這樣做? 我有處理序列化的類:

@DatabaseTable(tableName = "preciosart")
public class PreciosArt {

public static final String PRECIOS_COD_LISTA = "_id";
public static final String PRECIOS_COD_ARTICULO = "cod_articulo";
public static final String PRECIOS_CANSI_VENTA = "cansi_venta";
public static final String PRECIOS_FEC_VIGENCIA = "fec_vigencia";
public static final String PRECIOS_SIGLA_VENTA = "sigla_venta";
public static final String PRECIOS_PRECIO_VENTA = "precio_venta";
public static final String PRECIOS_MARGEN_PCT = "margen_pct";
public static final String PRECIOS_COD_USUARIO = "cod_usuario";
public static final String PRECIOS_VIGENTE = "vigente";
public static final String PRECIOS_NOM_MODULO = "nom_modulo";


@DatabaseField(id = true, unique = true, columnName = PRECIOS_COD_LISTA)    
private Integer codLista;

@DatabaseField(unique = true, columnName = PRECIOS_COD_ARTICULO)
@SerializedName("codArticulo") // probar
private Integer codArticulo;

@DatabaseField(unique = true, columnName = PRECIOS_CANSI_VENTA)
private Integer cansiVenta;

@DatabaseField(unique = true, columnName = PRECIOS_FEC_VIGENCIA)
private Long fecVigencia;

@DatabaseField(columnName = PRECIOS_SIGLA_VENTA)
@SerializedName("siglaVenta")
private String siglaVenta;

@DatabaseField(columnName = PRECIOS_PRECIO_VENTA)
@SerializedName("precioVenta")
private Double precioVenta;

@DatabaseField(columnName = PRECIOS_MARGEN_PCT)
@SerializedName("margenPct")
private Float margenPct;

@DatabaseField(columnName = PRECIOS_COD_USUARIO)
@SerializedName("codUsuario")
private Integer codUsuario;

@DatabaseField(columnName = PRECIOS_VIGENTE)
@SerializedName("vigente")
private String vigente;

@DatabaseField(columnName = PRECIOS_NOM_MODULO)
@SerializedName("nomModulo")
private String nomModulo;

但這並不適合那些領域(codArticulo,cansiVenta和fecVigencia)。 我讀到要反序列化這些json格式,制作另一類,所以我做了同樣的事情:

@SerializedName("codLista")
private Integer codLista;

@SerializedName("codArticulo")
private Integer codArticulo;

@SerializedName("cansiVenta")
private Integer cansiVenta;

@SerializedName("fecVigencia")
private Long fecVigencia;

問題是:如何用反序列化的json填充這些字段? 我使用OMRLite來完成這項工作,這個課程就是為了這個目的:

public long updatePreciosart(PreciosArt preciosArt){
    long resultUpdate = -1;
    try {
        getHelper().getPreciosartDao().createOrUpdate(preciosArt);
        resultUpdate = 0;
    } catch (SQLException e) {
        e.printStackTrace();
        resultUpdate = -1;
    }
    return resultUpdate;
}

希望您了解問題所在並希望您幫助我! 再次感謝!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM