Программируем клиент для блога на WordPress (часть 2 — база данных)

Всем привет!

В прошлой статье мы писали серверную часть на php и, поскольку я не получил сильных пинков по поводу ее содержания, теперь займемся нашим клиентом для блога на WordPress под Android. И сегодня мы будем работать с базой данных. На сколько мне известно, (а известно мне не много) единственной базой данных, имеющейся в распоряжении разработчика на Android SDK является SQLite. Что это за зверь такой? В отличие от привычных нам всем mysql и прочих баз данных SQLite — это не серверное приложение, это СУБД встраиваемая прямо в Ваше приложение и обеспечивающая доступ к базе данных хранящейся в определенном файле. Т.е. ваше приложение не нуждается в соединении с сервером.

Сегодня мы с Вами попробуем реализовать класс, который будет работать с небольшой базой, состоящей из одной таблицы. Смысл работы в том, чтобы присоединиться к базе, уметь пересоздавать в ней все таблицы, уметь получать из нее нужные нам данные.

Но для начала опишем вот такой крохотный класс:

package ru.davidmd.sitereader;

public class OnePost {
	String title;
	String text;
	String date;
	String guid;
	int id;
}

Этот класс — собственно представление одного поста на сайте. Здесь у нас имеются заголовок, текст поста, дата поста его id и полный путь к посту — guid.

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

package ru.davidmd.sitereader;

import java.util.ArrayList;
import java.util.Arrays;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Environment;
import android.util.Log;

public class dbExtender {

	SQLiteDatabase db; // база данных
	String name; // имя базы данных

	/**
	 * Конструктор - принимает контекст в качестве параметра
	 *
	 */
	public dbExtender() {
		// указываем путь к нашей базе данных (я решил хранить ее прям на
		// СД карточке, но вообще так делать нельзя - зачем лишний раз засорять
		// карточку пользователя непонятным хламом?)
		name = Environment.getExternalStorageDirectory().getAbsolutePath()
				+ "/SOME.db";
		// Открываем базу данных, или если ее нет, то создаем заново
		db = SQLiteDatabase.openOrCreateDatabase(name, null);
		// Ну и если все прошло нормаьлно, то просто
		// закрываем нашу базу
		if (db != null)
			db.close();
	}

	/**
	 * Здесь мы пересоздаем нашу
	 * базу данных
	 */
	public void reCreate() {
		//открываем базу
		db = SQLiteDatabase.openOrCreateDatabase(name, null);
		//Выполняем запрос на пересоздание таблицы
		db.execSQL("CREATE TABLE IF NOT EXISTS posts (_id INTEGER PRIMARY KEY, title TEXT, content TEXT, date TEXT, guid TEXT)");
		// закрываем базу
		db.close();
	}

	/**
	 * Добавляем в базу пост
	 * @param title - заголовок поста
	 * @param content - краткое содержимое поста
	 * @param date - дата поста
	 * @param id - id поста
	 * @param guid - ссылка на пост
	 */
	public void addpost(String title, String content, String date, int id,
			String guid) {
		// ну тут все просто, открыли базу, закинули пост в таблицу, закрыли.
		db = SQLiteDatabase.openOrCreateDatabase(name, null);
		db.execSQL("INSERT INTO posts (_id, title, content, date, guid) VALUES ('"
				+ id
				+ "','"
				+ title
				+ "','"
				+ content
				+ "','"
				+ date
				+ "','"
				+ guid + "')");
		db.close();
	}

	/**
	 * Здесь проверяем имеется ли уже пост с определенным id в базе данных
	 * @param id - id искомого поста
	 * @return - истина еси пост есть и ложь если его нет
	 */
	public boolean isPost(int id) {
		// тоже по сути ничего сложного
		// открыли базу запросили в ней пост с определенным id
		// и смотрим, сколько записей вернул нам наш запрос
		// если больше нуля - значит пост есть а в противном случае
		// его нет
		db = SQLiteDatabase.openOrCreateDatabase(name, null);
		Cursor c = db.rawQuery(
				"SELECT * FROM posts WHERE (_id = '" + id + "')", null);
		db.close();
		if (c.getCount() > 0) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * Получаем все данные из базы
	 * @return массив элементов типа OnePost
	 */
	public ArrayList<OnePost> getAllData() {
		// открыть базу
		db = SQLiteDatabase.openOrCreateDatabase(name, null);
		// запросить все записи в таблице
		Cursor c = db.rawQuery(
				"SELECT * FROM posts WHERE 1 ORDER BY 'date' ASC", null);
		// инициализировать массив постов
		ArrayList<OnePost> posts = new ArrayList<OnePost>();
		OnePost post;
		// переместить курсор в конец результатов запроса
		c.moveToLast();
		// в цикле обработать каждую запись в базе
		// и добавить ее в массив постов
		for (int i = 0; i < c.getCount(); i++) {

			post = new OnePost();
			post.text = c.getString(c.getColumnIndex("content"));
			post.date = c.getString(c.getColumnIndex("date"));
			post.guid = c.getString(c.getColumnIndex("guid"));
			post.title = c.getString(c.getColumnIndex("title"));
			post.id = c.getInt(c.getColumnIndex("_id"));
			posts.add(post);
			c.moveToPrevious();
		}
		// закрыть базу
		db.close();
		// вернуть массив постов
		return posts;
	}

	/**
	 * Здесь мы получаем дату последнего добавленного поста
	 * @return строковое представление даты последнего добавленного поста
	 */
	public String getLastDate() {
		// Подключаемся к базе
		db = SQLiteDatabase.openOrCreateDatabase(name, null);
		// запрашиваем все даты постов из базы
		Cursor c = db.rawQuery(
				"SELECT date FROM posts WHERE 1 ORDER BY 'date' DESC", null);
		if (c.getCount() > 0) {
			c.moveToLast();
			// создаем массив с датами
			String s[] = new String[c.getCount()];
			for (int i = 0; i < s.length; i++) {
				// в цикле добавляем каждую дату в массив дат
				s[i] = c.getString(0);
				c.moveToPrevious();
			}
			//сортируем массив дат
			Arrays.sort(s);
			// закрываем базу
			db.close();
			// возвращаем последний элемент массива
			return s[s.length - 1];
		} else
			return "0";
	}
}

Хотя в коде достаточно много комментариев, но некоторые участки всеж нуждаются в пояснении. Во первых давайте посмотрим на поля нашего класса. Их всего два — это db — имеющее тип SQLiteDatabase и name — строковое значение. Первое поле — собственно и есть та самая волшебная переменная которая выполняет всю работу с базой данных. Цель нашего класса — лишь чуток упростить интерфейс для db. У этого объекта есть куча интересных и любопытных методов, но мы по сути пользуемся лишь 4 из них — это метод открытия или создания openOrCreateDatabase(), метод закрытия с разочаровывающе простым именем close(), и два метода для запросов к базе. Первый из двух этих методов — execSQL() — используется тогда, когда наш sql код не собирается нам ничего возвращать, а второй rawQuery() — тогда когда наш запрос возвращает нам какие-то данные. Вообще есть еще метод query(), который тоже возвращает данные, но поскольку я немного знаю sql, то мне было проще посылать базе сырые запросы (то есть такие, какие мы посылаем например обычной базе MSSql или MySQL). Сильно не пинайте, такой метод тоже имеет право на жизнь.

Ну и методы имеющиеся у нашего класса — это метод для пересоздания базы reCreate(), метод для добавления в нее поста addpost() с целой куче параметров — которые описывают наш пост, метод для проверки существования в базе поста с определенным id isPost(), метод возвращающий нам массив элементов типа OnePost (которые мы описали в самом начале статьи), ну и метод возвращающий нам дату последнего поста в базе (зачем он нам нужен мы разберемся позднее).

На этом на сегодня думаю все :). Если у Вас есть вопросы или предложения не стесняйтесь, пишите в комментах или на мой e-mail который указан внизу страницы.

Вам понравилось? Было полезно? Поделитесь!

Опубликовать в Facebook
Опубликовать в Google Buzz
Опубликовать в Google Plus
Опубликовать в LiveJournal
Опубликовать в Мой Мир
Опубликовать в Одноклассники
Опубликовать в Яндекс
Запись опубликована в рубрике Android. Добавьте в закладки постоянную ссылку.

3 Responses to Программируем клиент для блога на WordPress (часть 2 — база данных)

  1. Вадим говорит:

    Не до конца понял, это все что-ли? а зачем нам нужен был webview?

  2. CoMMoN говорит:

    Вот бы еще вы писали на чом пишите если например пользователь не хочет читать пред статью или первую т.к ему нужна именно эта часть, и вылаживайте исходник чтобы пользователь видел куда что как и почему. а так спасибо большое за статью.

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *