gpt4 book ai didi

java - Android 应用程序不将 SQL 结果显示为数字

转载 作者:行者123 更新时间:2023-12-01 19:52:37 24 4
gpt4 key购买 nike

我一直在 Android Studio 上开发一个 Android 应用程序,并且已经达到了它可以工作的程度,并且我能够从外部 SQL DB 获取数据。问题是,当我按应用程序上的“获取数据”按钮时,我得到一个带小数点的数字,并且以 E12 结尾。例如,8.41095645265E12。然而,我输入数据库的号码是 8410376016789。用于特定列的数据类型是 int(255)、PK、NN。我尝试将其切换为 varchar,并在工作台上将其切换为 PK 和 NN,但它仍然存在。我的猜测是这不是一个与 SQL 相关的问题。

这是我的 Activity 代码

package com.example.manager.app;

import android.content.Context;
import android.content.res.Resources;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.LinkedHashMap;
import java.util.Map;

public class SeventhActivity extends AppCompatActivity {

ItemAdapter itemAdapter;
Context thisContext;
ListView myListView;
TextView progressTextView;
Map<String, Double> myprojectMap = new LinkedHashMap<String, Double>();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fourth);

Resources res = getResources();
myListView = (ListView) findViewById(R.id.myListView);
progressTextView = (TextView) findViewById(R.id.progressTextView);
thisContext = this;

progressTextView.setText("");
Button btn = (Button) findViewById(R.id.getDataButton);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
GetData retrieveData = new GetData();
retrieveData.execute("");
}
});
}

private class GetData extends AsyncTask<String,String,String> {

String msg = "";
// JDBC Driver name and database URL
static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
// Example 10.20.30.40:3306
static final String DB_URL = "jdbc:mysql://" +
DbStrings.DATABASE_URL + "/" +
DbStrings.DATABASE_NAME;

@Override
protected void onPreExecute() {
progressTextView.setText("Connecting to Database...");
}

@Override
protected String doInBackground(String... strings) {

Connection conn = null;
Statement stmt = null;

try {
Class.forName(JDBC_DRIVER);
conn = DriverManager.getConnection(DB_URL, DbStrings.USERNAME, DbStrings.PASSWORD);

stmt = conn.createStatement();
String sql = "SELECT * FROM mythisone.codes";
ResultSet rs = stmt.executeQuery(sql);

while (rs.next()) {
String name = rs.getString("Toode");
double price = rs.getDouble("Hind");

myprojectMap.put(name, price);
}

msg = "Process complete.";

rs.close();
stmt.close();
conn.close();

} catch (SQLException connError) {
msg = "An exception was thrown for JDBC.";
connError.printStackTrace();
} catch (ClassNotFoundException e) {
msg = "A class not found exception was thrown.";
e.printStackTrace();
} finally {

try {
if (stmt != null) {
stmt.close();
}
} catch (SQLException e) {
e.printStackTrace();
}

try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}

}

return null;
}

@Override
protected void onPostExecute(String msg) {

progressTextView.setText(this.msg);

if (myprojectMap.size() >0) {

itemAdapter = new ItemAdapter(thisContext, myprojectMap);
myListView.setAdapter(itemAdapter);
}

}
}

} //END of MainActivity

有什么我没注意到的吗?谢谢

最佳答案

double 是有问题的,而且不精确:

           double price = rs.getDouble("Hind");

带小数:

           BigDecimal price = rs.getBigDecimal("Hind");

没有:

           long price = rs.getLong("Hind");

(限制为 2^63,约 8*10^18)

double 有两个问题:

  • 表示形式(次要的,也适用于 BigDecimal)。然而,BigDecimal 具有 toPlainString(),它消除了科学记数法 3E4 -> 30000。
  • 它使用 2 的幂和来近似数字。对于有误差的小数,对于有间隙的大数(下一个较大的 double 要大 1 以上)。

关于java - Android 应用程序不将 SQL 结果显示为数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50800271/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com