Почему MySQL не подключается к моему приложению в Android Studio? - PullRequest
0 голосов
/ 22 сентября 2019

Я работаю над этим домашним заданием и пытаюсь подключиться к локальной базе данных MySQL, приложение устанавливается и запускается в моем AVD, но когда я нажимаю кнопку «получить данные», я возвращаю сообщение connError.

Я очень новичок в этом и хочу заняться этим, поэтому я просмотрел несколько видео и статей, но по какой-то причине я не могу найти решение этой проблемы.Вот мой основной код Java.

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 = findViewById(R.id.myListView);
        progressTextView = findViewById(R.id.progressTextView);
        thisContext = this;

        progressTextView.setText("");
        Button btn = findViewById(R.id.getDataBtn);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                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://localhost:3306/fruits" +
                DbStrings.DATABASE_URL + "/" +
                DbStrings.DATABASE_NAME;

        @Override
        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 fruits";
                ResultSet rs = stmt.executeQuery(sql);

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

                    fruitsMap.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 (fruitsMap.size() > 0) {
                itemAdapter = new ItemAdapter(thisContext, fruitsMap);
                myListView.setAdapter(itemAdapter);
            }
        }
    }

} //End of MainActivity

Ожидаемые результаты должны представлять собой базу данных, показывающую различные фрукты и их цены в TextView.

1 Ответ

3 голосов
/ 22 сентября 2019

Android не поддерживает MySQL из коробки.«Обычный» способ получить доступ к вашей базе данных - разместить перед ней сервер Restful и использовать протокол HTTPS для подключения к интерфейсу Restful.

Посмотрите на ContentProvider.Обычно он используется для доступа к локальной базе данных (SQLite), но его можно использовать для получения данных из любого хранилища данных.

Я рекомендую вам посмотреть на наличие локальной копии всех / некоторых данных ваших веб-сайтов.локально, таким образом, ваше приложение все равно будет работать, когда устройство Android не подключено.Если вы пойдете по этому маршруту, тогда можно использовать службу для синхронизации двух баз данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...