在插入数据库之前尝试将 Arraylist<LatLng> 转换为字符串

Try to convert Arraylist<LatLng> to string before insert to database

我尝试插入我的 ArrayList<LatLng> list1 和很多这样的值:(99.9999999,99.9999999) 到数据库 MySQL 中的 table,正好是 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<LatLng> list1 转换为 String !
是否可以用一种方法转换我的 ArrayList 中的所有值?

错误的做法:

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

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

也就是说,您无需执行任何特定操作即可对其进行转换。我假设您在 LatLng class 中实现了 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()' 或您要插入的任何类型插入值。

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

您的 for 语句应该是:

for(LatLng ll : list1)

您应该将 LatLng 值存储在评论中的 point datatype , assuming you are using PostgreSQL/PostGIS. As noted by @juergen d 中。将逗号分隔的字符串存储在单个列中或自己引用字符串不是一个好习惯。

这里 link 解释了如何 store the LatLng data as a Point in PostGIS。或者,您可以将纬度和经度分别存储在 'double precision' 数据类型中。

  1. LatLng 个实例上使用 toString 方法将它们转换为字符串。
  2. 不要尝试自己在 SQL 查询中引用参数;为此,请使用 API 对占位符的支持。尝试自己引用字符串会使攻击者破坏或操纵您的数据库达到他们自己的目的变得微不足道。