Java 在android中,如何将大量JSON数据插入SQLite数据库
我有一个很大的json请求,也就是说,它有大约50k行和15列,我必须将它们插入到具有相同结构的SQLite数据库中。也就是说,我必须将postgres数据库中分配的相同数据复制到我的应用程序中的sqlite数据库中。有什么有效的方法吗?是否有一些api或其他可以帮助工作的东西 我必须告诉大家,我可以使用JSON数据量不大的OMRLite,但当我尝试使用更大的数据量时,我的应用程序崩溃,出现内存不足错误Java 在android中,如何将大量JSON数据插入SQLite数据库,java,android,sqlite,ormlite,Java,Android,Sqlite,Ormlite,我有一个很大的json请求,也就是说,它有大约50k行和15列,我必须将它们插入到具有相同结构的SQLite数据库中。也就是说,我必须将postgres数据库中分配的相同数据复制到我的应用程序中的sqlite数据库中。有什么有效的方法吗?是否有一些api或其他可以帮助工作的东西 我必须告诉大家,我可以使用JSON数据量不大的OMRLite,但当我尝试使用更大的数据量时,我的应用程序崩溃,出现内存不足错误 请如果你有一些想法或一些例子,我可以遵循我会非常感激!提前谢谢 因为JSON太大了,你无法将
请如果你有一些想法或一些例子,我可以遵循我会非常感激!提前谢谢 因为JSON太大了,你无法将它完全加载到内存中。即使使用标准JSONObject,也会导致许多设备内存不足 在类似的情况下,我所做的是使用Jackson解析它。Jackson可以从流中执行,因此内存使用根本不是问题。缺点是API与普通选项相比,使用起来不那么直接
我发现了一个例子:你也可以使用谷歌官方的Gson流媒体库 Gson流媒体:
JsonReader
在使用流媒体库解析json时扮演着非常重要的角色。GSON-stream对我来说很有用,但我不得不说这需要他的时间,例如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的序列化中。我怎么能这么做?我拥有处理序列化的类:
@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和Fectigencia)。我阅读了关于反序列化这些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;
}
希望你了解问题所在,并希望你能帮我解决!再次感谢 我会说,使用预编译的insert语句查询和Asynctask的事务管理,并用适当的消息通知用户。参考本文,尝试使用Gson将Json解析为Java对象,然后使用这些对象写入sqlite,sqlite有很多ORM库,只有googleormandroid,您会发现我看到的结果。因此,我从servlet发出JSON请求,然后用GSON解析这些数据,并使用ORMLite管理SQLite。但正如我所说,问题是当我有一个大的json请求时。谢谢你的回答,你对gson了解多少?我使用gson来解析java对象,你认为gson是在使用手机内存来完成这项工作吗?可能是的,因为错误。你推荐jackson@Azertii?据我所知,是的,它将立即解析整个JSON。在开始解析时,您还可以查看Android Studio中的内存使用情况。如果记忆力提高很多,你就有答案了。我没有在我的任何项目中使用它来轻松测试,但我在过去用Jackson Streaming API解决了同样的问题。好的,非常感谢!我现在就去试试!如果这能解决问题,我会发帖的。谢谢你的回答@Durgesh!现在我就在上面。我先试试,因为我已经用gson解析数据了。@AndresMelgarejoLedesma你试过了吗?你的问题解决了吗?嗨!是的,它解决了问题,谢谢您的支持@如果这解决了你的问题,那么请接受这个答案:)我快速浏览了一下。我怀疑每个insert都会按列名搜索列索引。也许这就是表现缓慢的部分原因。