Как работать с MySQL в Android? Часть 1

На днях мне пришлось подключится к внешней БД MySQL в Android приложении, которое бы использовало ресурсы готового сервиса, так вот в данном уроке я покажу как я это сделал.

В данном уроке мы с вами сделаем простое Android-приложения, который будет вызывать PHP скрипт для выполнения основных CRUD (Create, Read, Update, Delete) операций.

Android приложение будет вызывать PHP скрипт, который будет подключается к базе данных MySQL и выполнить какие то операции.

Что вам потребуется?

1) WEB-сервер для PHP. Будем использовать сборку DenWer.

2) MySQL база данных.

3) Android Emulator.

Шаг 1. Установка WEB-сервера.

Так как мы будем работать со сборкой Denwer, то для начала скачиваем её тут http://www.denwer.ru/

После того как вы его установили и проверили, что он работает, переходим к следующему шагу.

Шаг 2. Создание БД

Так как мы подняли WebServer Denwer в нем уже вшита MySQL база данных, давайте создадим базу и таблицу (products) в ней.

Создание таблиц в БД:

CREATE TABLE products(
    pid int(11) primary key auto_increment,
    name varchar(100) not null,
    price decimal(10,2) not null,
    description text,
    created_at timestamp default now(),
    updated_at timestamp
);

В конце видео создания БД я не зря показал локальный IP, так как я использую виртуальную ОС для удобства. В вашем случае вы будите обращаться к localhost или же 127.0.0.1 .

Шаг 3. Подключение к MySQL базе с помощью PHP

Давайте создадим PHP класс, который будет отвечать за подключение к БД. Основная цель этого класса — открытие и закрытие соединения с БД.

Но, для того что бы подключатся к БД нам нужно где то хранить требуемые параметры для подключения к БД для этого создадим [C:\WebServers\home\devserver.com\www\db_config.php] со следующим содержимым:

<?php 
    define('DB_USER', "root"); //логин админа БД
    define('DB_PASSWORD', "root"); // пароль админа БД
    define('DB_DATABASE', "devcolibri"); // база данных
    define('DB_SERVER', "localhost"); // сервер 'localhost'
?>

А теперь создадим в той же директории файл [C:\WebServers\home\devserver.com\www\db_connect.php] со следующим содержимым:

<?php

class DB_CONNECT {

    function __construct() {
        $this->connect();
    }

    function __destruct() {
        $this->close();
    }

    function connect() {
        require 'db_config.php';

        $con = mysql_connect(DB_SERVER, DB_USER, DB_PASSWORD) or die(mysql_error());

        $db = mysql_select_db(DB_DATABASE) or die(mysql_error()) or die(mysql_error());

        return $con;
    }

    function close() {
        mysql_close();
    }

}

?>

Шаг 4. Базовые CRUD операции в PHP

В этом уроке я покрываю основные CRUD (Create, Read, Update, Delete) операций для MySQL с помощью PHP.

Запись строки в БД

Создадим в нашем PHP проекте новый файл create_product.php который будет обеспечивать возможность записи продукта в БД.

<?php
$response = array();

if (isset($_POST['name']) && isset($_POST['price']) && isset($_POST['description'])) {

    $name = $_POST['name'];
    $price = $_POST['price'];
    $description = $_POST['description'];

    require 'db_connect.php';

    $db = new DB_CONNECT();

    $result = mysql_query("INSERT INTO products(name, price, description) VALUES('$name', '$price', '$description')");

    if ($result) {
        $response["success"] = 1;
        $response["message"] = "Product successfully created.";

        echo json_encode($response);
    } else {
        $response["success"] = 0;
        $response["message"] = "Oops! An error occurred.";

        echo json_encode($response);
    }
} else {
    $response["success"] = 0;
    $response["message"] = "Required field(s) is missing";

    echo json_encode($response);
}
?>

Для приведенного выше кода JSON ответ будет примерно таким:

Когда POST параметр(ы) отсутствует:

{
    "success": 0,
    "message": "Обязательное поле(я) отсутствует"
}

Когда продукт успешно добавлен:

{
    "success": 1,
    "message": "Продукт успешно создана."
}

Когда ошибка при добавлении данных в БД:

{
    "success": 0,
    "message": "Error! По каким-то причинам продукт не был добавлен."
}

Чтение строки с БД

Создадим новый PHP файл в нашем проекте и назовем его get_product_details.php со следующим содержанием:

<?php

$response = array();

require 'db_connect.php';

$db = new DB_CONNECT();

if (isset($_GET["pid"])) {
    $pid = $_GET['pid'];

    $result = mysql_query("SELECT *FROM products WHERE pid = $pid");

    if (!empty($result)) {
        if (mysql_num_rows($result) > 0) {

            $result = mysql_fetch_array($result);

            $product = array();
            $product["pid"] = $result["pid"];
            $product["name"] = $result["name"];
            $product["price"] = $result["price"];
            $product["description"] = $result["description"];
            $product["created_at"] = $result["created_at"];
            $product["updated_at"] = $result["updated_at"];
            $response["success"] = 1;

            $response["product"] = array();

            array_push($response["product"], $product);

            echo json_encode($response);
        } else {
            $response["success"] = 0;
            $response["message"] = "No product found";

            echo json_encode($response);
        }
    } else {
        $response["success"] = 0;
        $response["message"] = "No product found";

        echo json_encode($response);
    }
} else {
    $response["success"] = 0;
    $response["message"] = "Required field(s) is missing";

    echo json_encode($response);
}
?>

Ответ JSON для вышеупомянутого файла будет следующим.

При успешном получении продукта:

{
    "success": 1,
    "product": [
        {
            "pid": "1",
            "name": "iPHone 5",
            "price": "500.00",
            "description": "iPhone 5 white",
            "created_at": "2013-04-27 01:22:56",
            "updated_at": "0000-00-00 00:00:00"
        }
    ]
}

Когда продукт не найден:

{
    "success": 0,
    "message": "Продукт не найден."
}

Получение всех продуктов с БД

Для того чтобы вывести весь список продуктов на устройство нам нужно получить все продукты с БД.

Создадим get_all_products.php со следующим содержимым:

<?php

$response = array();

require 'db_connect.php';

$db = new DB_CONNECT();

$result = mysql_query("SELECT *FROM products") or die(mysql_error());

if (mysql_num_rows($result) > 0) {
    $response["products"] = array();

    while ($row = mysql_fetch_array($result)) {
        $product = array();
        $product["pid"] = $row["pid"];
        $product["name"] = $row["name"];
        $product["price"] = $row["price"];
        $product["created_at"] = $row["created_at"];
        $product["updated_at"] = $row["updated_at"];

        array_push($response["products"], $product);
    }
    $response["success"] = 1;

    echo json_encode($response);
} else {
    $response["success"] = 0;
    $response["message"] = "No products found";

    echo json_encode($response);
}
?>

JSON ответ выше приведенного кода будет таким:

{
    "products": [
        {
            "pid": "1",
            "name": "iPhone 5",
            "price": "500.00",
            "created_at": "2013-04-27 02:04:02",
            "updated_at": "0000-00-00 00:00:00"
        },
        {
            "pid": "2",
            "name": "Macbook Pro",
            "price": "600.00",
            "created_at": "2012-04-29 02:04:51",
            "updated_at": "0000-00-00 00:00:00"
        },
        {
            "pid": "3",
            "name": "Macbook Air",
            "price": "800.00",
            "created_at": "2013-04-27 02:05:57",
            "updated_at": "0000-00-00 00:00:00"
        },
        {
            "pid": "4",
            "name": "OS X Lion",
            "price": "100.00",
            "created_at": "2013-04-27 02:07:14",
            "updated_at": "0000-00-00 00:00:00"
        }
    ],
    "success": 1
}

Когда продукт не найден:

{
    "success": 0,
    "message": "Продуктов нет в БД!"
}

Обновление продукта в БД

Создайте файл с именем update_product.php со следующим содержимым:

<?php

$response = array();

if (isset($_POST['pid']) && isset($_POST['name']) && isset($_POST['price']) && isset($_POST['description'])) {

    $pid = $_POST['pid'];
    $name = $_POST['name'];
    $price = $_POST['price'];
    $description = $_POST['description'];

    require 'db_connect.php';

    $db = new DB_CONNECT();

    $result = mysql_query("UPDATE products SET name = '$name', price = '$price', description = '$description' WHERE pid = $pid");

    if ($result) {
        // successfully updated
        $response["success"] = 1;
        $response["message"] = "Product successfully updated.";

        echo json_encode($response);
    } else {

    }
} else {
    $response["success"] = 0;
    $response["message"] = "Required field(s) is missing";

    echo json_encode($response);
}
?>

Ответ JSON выше кода, когда продукт успешно обновлены будет следующим:

{
    "success": 1,
    "message": "Продукт удачно обновлен!"
}

Удаление продукта с БД

Последняя операция удаления из базы данных. Создайте новый файл назовите delete_product.php и вставьте следующий код:

<?php

$response = array();

if (isset($_POST['pid'])) {
    $pid = $_POST['pid'];

    require 'db_connect.php';

    $db = new DB_CONNECT();

    $result = mysql_query("DELETE FROM products WHERE pid = $pid");
    if (mysql_affected_rows() > 0) {
        $response["success"] = 1;
        $response["message"] = "Product successfully deleted";

        echo json_encode($response);
    } else {
        $response["success"] = 0;
        $response["message"] = "No product found";

        echo json_encode($response);
    }
} else {
    $response["success"] = 0;
    $response["message"] = "Required field(s) is missing";

    echo json_encode($response);
}
?>

Когда продукт удачно будет удален то JSON ответ будет таким:

{
    "success": 1,
    "message": "Продукт удачно удален!"
}

Когда продукт не найден, то таким:

{
    "success": 0,
    "message": "Продукт не найден!"
}

Теперь наконец-то мы можем приступить к программированию на Android. То что мы описали выше на PHP будем использовать как API слой. И наше приложение будет общаться с MySQL сервером по средством JSON формата и GET, POST запросов.

Шаг 5. Создаем Android приложение

Урок создан: 27 апреля 2013 | Просмотров: 56163 | Автор: Александр Барчук | Правила перепечатки


Добавить комментарий

Добавить комментарий

Ваш e-mail не будет опубликован.

Комментарии:

  • 10 мая 2013 в 13:00

    Игорь

    статья понравилась, но когда выйдет пятый шаг?

  • 10 мая 2013 в 20:01

    Сергей

    Очень ждем от вас продолжения и исходника. Очень поможет)) спасибо)

  • 10 мая 2013 в 22:54

    Александр Барчук

    Внимание. Те кто уже читали данную статью обратите внимание на изменение всех PHP классов. Я исправил ошибки.

    • 11 мая 2013 в 12:34

      Сергей

      Спасибо:) Буду разбираться)

  • 02 июля 2013 в 14:50

    Игорь

    У меня возникла проблема, когда я попробовал кодировать (json_encode) массив (инфа кириллица) в JSON для отправки клиенту, то получил следующее:

    {«product»:[{«pid»:1, «name»: «\u0448\u044e\u0436\u043e\u0431\u0438\u042…}], «success»:1} и т.д.

    Немного поразмыслив, я понял в чем проблема. А проблема была в том, что json_encode() «переводит» киррилицу в «свой» формат. Тоесть с бд информация идет в правильной кодировке, а уже сам json_encode() портит её.
    Проблему решил написав «переводчик» в нормальную кодировку. Вышло что-то типо этого:
    http://pastebin.com/1xTQJAC2

    Надеюсь кому-то пригодится)

    • 06 июля 2013 в 17:34

      Игорь

      можно просто добавить вторым параметром JSON_UNESCAPED_UNICODE в команду json_encode, если версия php выше 5.4

  • 22 ноября 2013 в 22:17

    archie

    В исходниках старые, не правильные файлы.

  • 24 ноября 2013 в 00:26

    archie

    Это нормально, что в файле db_connect.php, в строчке $db = mysql_select_db(DB_DATABASE) or die(mysql_error()) or die(mysql_error()) , последние две команды совпадают?

  • 26 января 2014 в 20:46

    archie

    Статья в ру нете уникальная. На русском языке практически нет статей, где объясняется, как соединить android приложение с внешней базой данных. Жалко есть некоторые баги и недоработки.

  • 26 ноября 2015 в 23:14

    игорь

    отличная пошаговая инструкция! Подписался на паблик ВК. Можно расширить ее для БД на Хостинге?

  • 02 апреля 2016 в 22:43

    Михаил

    Вопрос такой! как сделать авторизацию из приложения, так чтобы сессия оставалась, допустим из того же примера с БД товары, юзер открыл APP ввел лоин и пароль и работает, гостям там делать нефиг!

    • 03 апреля 2016 в 11:16

      Михаил

      на сайте авторизация есть, скрипты php я поправлю, добавлю функций вопрос как из андроида авторизоваться и чтобы сессия висела не закрытой пока либо креш либо logout не произойдет