Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在android中,如何将大量JSON数据插入SQLite数据库_Java_Android_Sqlite_Ormlite - Fatal编程技术网

Java 在android中,如何将大量JSON数据插入SQLite数据库

Java 在android中,如何将大量JSON数据插入SQLite数据库,java,android,sqlite,ormlite,Java,Android,Sqlite,Ormlite,我有一个很大的json请求,也就是说,它有大约50k行和15列,我必须将它们插入到具有相同结构的SQLite数据库中。也就是说,我必须将postgres数据库中分配的相同数据复制到我的应用程序中的sqlite数据库中。有什么有效的方法吗?是否有一些api或其他可以帮助工作的东西 我必须告诉大家,我可以使用JSON数据量不大的OMRLite,但当我尝试使用更大的数据量时,我的应用程序崩溃,出现内存不足错误 请如果你有一些想法或一些例子,我可以遵循我会非常感激!提前谢谢 因为JSON太大了,你无法将

我有一个很大的json请求,也就是说,它有大约50k行和15列,我必须将它们插入到具有相同结构的SQLite数据库中。也就是说,我必须将postgres数据库中分配的相同数据复制到我的应用程序中的sqlite数据库中。有什么有效的方法吗?是否有一些api或其他可以帮助工作的东西

我必须告诉大家,我可以使用JSON数据量不大的OMRLite,但当我尝试使用更大的数据量时,我的应用程序崩溃,出现内存不足错误


请如果你有一些想法或一些例子,我可以遵循我会非常感激!提前谢谢

因为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都会按列名搜索列索引。也许这就是表现缓慢的部分原因。