将巨大的 JSON 数据插入 android 中的 SQLite 数据库的方法是什么
What is the way to insert a huge JSON data into a SQLite DB in android
我有一个很大的 json 请求,也就是说,它有大约 50k 行和 15 列,我必须将它们插入到具有相同结构的 SQLite 数据库中。也就是说,我必须将在 postgres 数据库中分配的相同数据复制到我的应用程序中的 sqlite 数据库中。有什么有效的方法吗?有什么 api 之类的东西可以帮助工作吗?
我必须告诉我,我可以使用 OMRLite 处理 JSON 数据,但当我尝试处理更大的数据时,我的应用程序崩溃了,并且有 内存不足错误.
如果你有一些想法或一些我可以遵循的例子,我将不胜感激!提前致谢!
因为 JSON 太大了,你不能把它完全加载到内存中。即使使用标准 JSON对象也会导致许多设备内存不足。
我在类似情况下所做的是使用 Jackson 来解析它。杰克逊可以从流中做到这一点,所以内存使用根本不是问题。缺点是 API 与普通选项相比,使用起来并不那么直接。
这是我找到的一个例子:Jackson Streaming
您也可以使用 Google 的官方 Gson 流媒体库。
Gson 流式传输:Gson Streaming
JsonReader
对使用 Streaming 库解析 json 起着非常重要的作用。
GSON 流对我有用 Gson - streaming 但我不得不说这需要他的时间,例如 68K 行和 10 列大约需要 4 分钟。但无论如何解决了我的问题。所以我有这个 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 的序列化中。我怎么能那样做?我有 class 处理我的序列化:
@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 格式制作另一个 class,所以我做了同样的事情:
@SerializedName("codLista")
private Integer codLista;
@SerializedName("codArticulo")
private Integer codArticulo;
@SerializedName("cansiVenta")
private Integer cansiVenta;
@SerializedName("fecVigencia")
private Long fecVigencia;
问题是:如何用反序列化的 json 填充这些字段?我使用 OMRLite 来完成这项工作,这个 class 就是为了这个目的:
public long updatePreciosart(PreciosArt preciosArt){
long resultUpdate = -1;
try {
getHelper().getPreciosartDao().createOrUpdate(preciosArt);
resultUpdate = 0;
} catch (SQLException e) {
e.printStackTrace();
resultUpdate = -1;
}
return resultUpdate;
}
希望你明白问题出在哪里,希望你能帮助我!再次感谢!
我有一个很大的 json 请求,也就是说,它有大约 50k 行和 15 列,我必须将它们插入到具有相同结构的 SQLite 数据库中。也就是说,我必须将在 postgres 数据库中分配的相同数据复制到我的应用程序中的 sqlite 数据库中。有什么有效的方法吗?有什么 api 之类的东西可以帮助工作吗?
我必须告诉我,我可以使用 OMRLite 处理 JSON 数据,但当我尝试处理更大的数据时,我的应用程序崩溃了,并且有 内存不足错误.
如果你有一些想法或一些我可以遵循的例子,我将不胜感激!提前致谢!
因为 JSON 太大了,你不能把它完全加载到内存中。即使使用标准 JSON对象也会导致许多设备内存不足。
我在类似情况下所做的是使用 Jackson 来解析它。杰克逊可以从流中做到这一点,所以内存使用根本不是问题。缺点是 API 与普通选项相比,使用起来并不那么直接。
这是我找到的一个例子:Jackson Streaming
您也可以使用 Google 的官方 Gson 流媒体库。
Gson 流式传输:Gson Streaming
JsonReader
对使用 Streaming 库解析 json 起着非常重要的作用。
GSON 流对我有用 Gson - streaming 但我不得不说这需要他的时间,例如 68K 行和 10 列大约需要 4 分钟。但无论如何解决了我的问题。所以我有这个 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 的序列化中。我怎么能那样做?我有 class 处理我的序列化:
@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 格式制作另一个 class,所以我做了同样的事情:
@SerializedName("codLista")
private Integer codLista;
@SerializedName("codArticulo")
private Integer codArticulo;
@SerializedName("cansiVenta")
private Integer cansiVenta;
@SerializedName("fecVigencia")
private Long fecVigencia;
问题是:如何用反序列化的 json 填充这些字段?我使用 OMRLite 来完成这项工作,这个 class 就是为了这个目的:
public long updatePreciosart(PreciosArt preciosArt){
long resultUpdate = -1;
try {
getHelper().getPreciosartDao().createOrUpdate(preciosArt);
resultUpdate = 0;
} catch (SQLException e) {
e.printStackTrace();
resultUpdate = -1;
}
return resultUpdate;
}
希望你明白问题出在哪里,希望你能帮助我!再次感谢!