我跟随a tutorial on youtube,制作了一个带有数据库的列表应用程序。 现在我得到了错误:
为JDBC引发了异常。
这是我的代码:
package com.example.jopri.databaseconnectie;
import android.content.AsyncQueryHandler;
import android.content.Context;
import android.content.res.Resources;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
public class MainActivity extends AppCompatActivity {
ItemAdapter itemAdapter;
Context thisContext;
ListView myListView;
TextView progressTextView;
Map<String, Double> fruitsMap = new LinkedHashMap<String, Double>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
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 = "";
static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
static final String DB_URL = "jdbc:mysql://" +
DbStrings.DATABASE_URL + "/" +
DbStrings.DATABASE_NAME;
protected void onPreExecute() {
progressTextView.setText("Connecting to database...");
}
@Override
protected String doInBackground(String... params) {
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 fruit";
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
String soort = rs.getString("soort");
double prijs = rs.getDouble("prijs");
fruitsMap.put(soort, prijs);
}
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(fruitsMap.size() > 0) {
itemAdapter = new ItemAdapter(thisContext, fruitsMap);
myListView.setAdapter(itemAdapter);
}
}
}
} // END
连接器:
package com.example.jopri.databaseconnectie;
import java.net.URL;
public class DbStrings {
static final String DATABASE_URL = "127.0.0.1:3306";
static final String DATABASE_NAME = "proef";
static final String USERNAME = "root";
static final String PASSWORD = "password";
}
项目适配器:
package com.example.jopri.databaseconnectie;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class ItemAdapter extends BaseAdapter {
LayoutInflater mInflator;
Map<String, Double> map;
List<String> soort;
List<Double> prijs;
public ItemAdapter(Context c, Map m) {
mInflator = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
map = m;
soort = new ArrayList<String>(map.keySet());
prijs = new ArrayList<Double>(map.values());
};
@Override
public int getCount() {
return map.size();
}
@Override
public Object getItem(int position) {
return soort.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = mInflator.inflate(R.layout.item_layout, null);
TextView nameTextView = (TextView) v.findViewById(R.id.nameTextView);
TextView priceTextView = (TextView) v.findViewById(R.id.priceTextView);
nameTextView.setText(soort.get(position));
priceTextView.setText("€" + prijs.get(position).toString());
return v;
}
}
答案 0 :(得分:3)
static final String DATABASE_URL = "127.0.0.1:3306";
此行表示您正在Android设备本身上运行MySQL服务器,这对我来说似乎极不可能。如果您再次观看视频,他将永远不会使用localhost / 127.0.0.1。
此URL应该是您网络中可解析的远程IP /主机名(理想情况下,应通过WiFi和移动设备运行)
此外,通过这样做,您会将数据库密码公开给可以访问您的应用程序/代码的任何人,因为它只是内存中的纯字符串。因此,在实际环境中,您实际上会使用基于HTTP的API,该API可以更安全地隐藏数据库凭据并将其存储在一个位置,而不是在一系列移动设备上复制该信息(如果您发布应用,供其他人使用)。
如果您想要的只是一个具有列表视图的数据库,请从SQLite开始,该SQLite已嵌入并作为库作为Android SDK的一部分提供