Android中的JDBC连接问题

时间:2018-11-05 14:03:08

标签: java android

我跟随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;
}

}

1 个答案:

答案 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的一部分提供