【问题标题】:Try to convert Arraylist<LatLng> to string before insert to database在插入数据库之前尝试将 Arraylist<LatLng> 转换为字符串
【发布时间】:2017-03-19 10:59:33
【问题描述】:

我尝试将我的ArrayList&lt;LatLng&gt; list1 插入很多这样的值:(99.9999999,99.9999999) 到数据库 MySQL 中的表中,精确到 1 列,如下所示:

row 1 (99.9999999,99.9999999)  
row 2 (99.9999999,99.9999999)  
row 3 (99.9999999,99.9999999)

...全部为 1 列。

在我看来,目前我有一个很好的方法:

String sql = "INSERT INTO table1 VALUES(";
for(String s : list1) {
    sql = sql+"'"+s+"'"; 
}    
sql = sql+")";
stmt.executeUpdate(sql);

但 Android Studio 强调 String s 并说:

Incompatible types
Required: com.google.android.gms.maps.model.LatLng
Found: java.lang.String

在我看来,Android Studio 试图告诉我:您需要将所有值从 ArrayList&lt;LatLng&gt; list1 转换为 String !
是否可以通过一种方法转换我的ArrayList 中的所有值?

【问题讨论】:

  • 你使用的是哪个版本的jave?
  • 不,不,不,不,不!!!!永远不要在单个列中存储多个值!!!
  • 您应该首先学习如何使用PreparedStatement,这样您的Android 应用就不会包含称为SQL 注入的严重安全漏洞。
  • 你不是在每个值之间缺少一个逗号吗?

标签: java jdbc arraylist foreach tostring


【解决方案1】:

不好的做法:

您可以通过以下方式将数据转换为字符串:

for(LatLng s : list1)
{
    String sql = "INSERT INTO table1 VALUES('"+s+"');
    stmt.executeUpdate(sql);
}

也就是说,您无需执行任何特定操作即可对其进行转换。我假设您在 LatLng 类中实现了 toString() 方法,以便为 LatLng 类型的对象提供有意义的字符串表示形式。

这样做的好方法:

String sql = "INSERT INTO table1 VALUES(?)";
PreparedStatement stmt = dbConnection.prepareStatement(sql);
for(LatLng s : list1){
    stmt.setString(1, s); // insert 's' in place of the 1st '?'
    stmt.addBatch();
}
stmt.executeBatch();

在最后一种情况下,您正在准备一批命令以一次发送到您的数据库。这比发送许多 sql 语句要好得多,因为您最终的开销要少得多。此外,您不是自己连接 sql 语句。你给最初的 sql 语句一个 '?'占位符,然后您使用 'setString()' 或 'setInt()' 或您要插入的任何类型插入值。

【讨论】:

  • 有点成功!但是应用程序将所有值添加到表格中的一行,您知道如何修复它吗?
  • @patrick1980 我的最后一次编辑应该可以满足您的需求。基本上你每行发送一个插入命令。
  • 你已经回答了这个问题,但正在宣传糟糕的编程,所以我对你的回答投了反对票。
  • @GeneMyers 是的,你完全正确。我已经用一种更好的方式编辑了我的答案。
  • @Jose 我再次支持你,但 patrick1980 仍然应该考虑使用更好的数据类型来存储这个值 :-)
【解决方案2】:

错误是告诉您 ArrayList 不包含字符串,而不是您必须转换为字符串。您不能像您所做的那样将 LatLng 类型的数组条目隐式转换为字符串。

你的for 声明应该是:

for(LatLng ll : list1)

假设您使用的是 PostgreSQL/PostGIS,您应该将 LatLng 值存储在 point datatype 中。正如您的 cmets 中的 @juergen d 所指出的,将逗号分隔的字符串存储在单个列中或自己引用字符串不是一个好习惯。

这里有一个链接解释如何store the LatLng data as a Point in PostGIS。或者,您可以将 lat 和 lng 分别存储在“双精度”数据类型中。

【讨论】:

    【解决方案3】:
    1. 在LatLng 实例上使用toString 方法将它们转换为字符串。
    2. 不要尝试自己在 SQL 查询中引用参数;为此目的使用 API 对占位符的支持。尝试自己引用字符串会使攻击者为了自己的目的而破坏或操纵您的数据库变得轻而易举。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多