2016-08-18 22 views
0

我有一个免费的Android应用程序,已经超出了原有的用户群。我遇到过这样的情况:这种的String.format产生无效的SQL字符串:那肯定造成一个问题是用户的定位是为阿拉伯语,因此客户ID在阿拉伯语字符表示在Android中,如果你用一个整数连接一个字符串,是整数本地化?

String sql = String.format ("SELECT name from customers where cust_id=%d", cust_id); 

一种情况。

我定像这样的特殊问题:

String sql = String.format (Locale.ENGLISH, "SELECT name from customers where cust_id=%d", cust_id); 

什么延迟找到一个解决方案是,因为它是一个免费的应用程序,大多数人都没有报告problem-他们刚刚停止使用的应用程序:我只能从崩溃日志中找到。此外,本地化的本质似乎取决于所选择的语言以及Android的版本......该应用程序一直支持V2.1。我已经为阿拉伯语检测到两种不同的类型,而另一种(我没有识别该语言)将数字定位为问号。

我的问题是,是否会有类似的问题产生使用串联SQL查询,类似这样的语句:

String sql = "SELECT name from customers where cust_id=" + cust_id; 

我的大部分的查询都是这样的,所以这将是一个很大的工作,检查并更改。我可以在当前版本上凭经验测试它,但以前和未来版本如何?

+0

见http://stackoverflow.com/questions/9159358/implicit-铸的toString-的toString和-INT – Serg

回答

0

没有字符串连接不会对本地化做任何更改,只有String格式。

0

一个整数不保存任何本地化信息(因为它是一个原语),问题出在你的String.format调用中。

您使用的String.format这样的:

String sql = String.format ("SELECT name from customers where cust_id=%d", cust_id); 

的Android文档这样说:

String format (String format, Object... args)

使用指定格式字符串和参数返回一个格式化字符串。 始终使用的语言环境是由Locale.getDefault()返回的语言环境。

指定没有区域设置总是会导致字符串本地化为默认值(在客户的情况下,这是阿拉伯语)。 按照Android文档,还采取了区域设置的第二方法声明:

String format (Locale l, String format, Object... args)

返回使用指定的语言环境,格式字符串,和参数的格式的字符串。

如果l为null,则不应用本地化。

所以,你的解决办法是修改您的通话:

String sql = String.format (null, "SELECT name from customers where cust_id=%d", cust_id); 

当然,你也可以切换到简单的字符串连接您的电话(这可能是对SQL查询的首选方式):

String sql = "SELECT name from customers where cust_id=" + cust_id; 

来源:https://developer.android.com/reference/java/lang/String.html

相关问题