Tworzenie bazy danych w Androidzie.

Kolejnym etapem mojej pracy nad aplikacją jest stworzenie bazy danych, w której będę przechowywał informacje o użytkownikach. Na razie będzie to lokalna, mała baza, którą będę później sukcesywnie powiększał.

pexels-photo-132907

Przygotowanie modelu użytkownika.

Na początku trzeba zdefiniować klasę użytkownika – sprecyzować jakie informacje o nim potrzebujemy. Ja potrzebuję 5 rzeczy: imię, nazwisko, e-mail, miejscowość, datę urodzenia.

Kiedy mamy zapisane już zmienne, trzeba stworzyć odpowiednie  konstruktory.

private int id;
private String name;
private String surname;
private String email;
private String city;
private String dayOfBirthday;

public User() {}

public User(int id, String name, String surname, String email, String city, String dayOfBirthday) {
    this.id = id;
    this.name = name;
    this.surname = surname;
    this.email = email;
    this.city = city;
    this.dayOfBirthday = dayOfBirthday;
}

public User(String name, String surname, String email, String city, String dayOfBirthday) {
    this.name = name;
    this.surname = surname;
    this.email = email;
    this.city = city;
    this.dayOfBirthday = dayOfBirthday;
}
 

Oczywiście trzeba wygenerować również gettery i settery do każdej zmiennej.

Tworzenie bazy danych.

Musimy stworzyć klasę, która będzie rozszerzeniem klasy abstrakcyjnej SQLiteOpenHelper. Ja nazwałem ją DatabaseHandler. Na początku musimy stworzyć kilka prywatnych, finalnych zmiennych statycznych. Będą one zawierać podstawowe parametry potrzebne do wygenerowania, a później operowania na bazie danych.

    private static final int DATABASE_VERSION = 1;
    private static final String DATABASE_NAME = "userManager";
    private static final String TABLE_USERS = "users";

    private static final String KEY_ID = "id";
    private static final String KEY_NAME = "name";
    private static final String KEY_SURNAME = "surname";
    private static final String KEY_EMAIL = "email";
    private static final String KEY_CITY = "city";
    private static final String KEY_DAYOFBIRTHDAY = "dayOfBirthday";

Musimy stworzyć także odpowiedni konstruktor:

public DatabaseHandler(Context context) {
     super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

Z tak przygotowaną klasą możemy zabrać się za implementacje metod onCreate oraz onUpgrade.
onCreate – w tej metodzie będziemy tworzyli naszą bazę danych. Schemat jest bardzo prosty i wygląda tak:

@Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        String CREATE_USERS_TABLE = "CREATE TABLE " + TABLE_USERS + "("
                + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT,"
                + KEY_SURNAME + " TEXT," + KEY_EMAIL + " TEXT," + KEY_CITY + " TEXT,"
                + KEY_DAYOFBIRTHDAY + " TEXT" + ")";
        sqLiteDatabase.execSQL(CREATE_USERS_TABLE);
    }

onUpgrade – ta metoda służy do aktualizowania bazy danych. Usuwa starą bazę i wywołuje metodę onCreate, która tworzy nową.


@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
    sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + TABLE_USERS);
    onCreate(sqLiteDatabase);
}

Operowanie na bazie danych (CRUD)

Kiedy mamy stworzoną bazę danych przydałoby się mieć metody, które pozwolą na dodawanie, modyfikowanie i wyświetlanie rekordów.

Zacznijmy od metody pozwalającej dodawać nowe rekordy. Prezentuje się ona następująco:

public void addUser(User user) {
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(KEY_NAME, user.getName());
        values.put(KEY_SURNAME, user.getSurname());
        values.put(KEY_EMAIL, user.getEmail());
        values.put(KEY_CITY, user.getCity());
        values.put(KEY_DAYOFBIRTHDAY, user.getDayOfBirthday());

        db.insert(TABLE_USERS, null, values);
        db.close();
    }

Przyda się nam także metoda pobierająca rekord z bazy danych:

public User getUser(int id) {
        SQLiteDatabase db = this.getReadableDatabase();

        Cursor cursor = db.query(TABLE_USERS, new String[] { KEY_ID,
            KEY_NAME, KEY_SURNAME, KEY_EMAIL, KEY_CITY, KEY_DAYOFBIRTHDAY}, KEY_ID + "=?",
                new String[] { String.valueOf(id) }, null, null, null, null);
        if (cursor != null) {
            cursor.moveToFirst();
        }

        User user = new User(Integer.parseInt(cursor.getString(0)),
                cursor.getString(1), cursor.getString(2), cursor.getString(3),
                cursor.getString(4), cursor.getString(5));

        return user;
    }

Stworzyłem także klasę wyciągająca wszystkie rekordy z bazy danych. Główne będę używał jej do testowania.

public List<User> getAllUsers() {
        List<User> userList = new ArrayList<User>
        String selectQuery = "SELECT * FROM " + TABLE_USERS;

        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);
        if (cursor.moveToFirst()) {
            do {
                User user = new User();
                user.setId(Integer.parseInt(cursor.getString(0)));
                user.setName(cursor.getString(1));
                user.setSurname(cursor.getString(2));
                user.setEmail(cursor.getString(3));
                user.setCity(cursor.getString(4));
                user.setDayOfBirthday(cursor.getString(5));

                userList.add(user);
            } while (cursor.moveToNext());
        }
        return userList;
    }

Przydatną rzeczą będzie aktualizowanie wpisów w bazie danych więc stworzyłem odpowiednią do tego metodę.

public int updateUser(User user) {
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(KEY_NAME, user.getName());
        values.put(KEY_SURNAME, user.getSurname());
        values.put(KEY_EMAIL, user.getEmail());
        values.put(KEY_CITY, user.getCity());
        values.put(KEY_DAYOFBIRTHDAY, user.getDayOfBirthday());

        return db.update(TABLE_USERS, values, KEY_ID + " = ?",
                new String[] { String.valueOf(user.getId()) });
    }

Nie można zapomnieć o metodzie usuwającej rekord z bazy, bo i ona może się przydać.

public void deleteUser(User user) {
        SQLiteDatabase db = this.getWritableDatabase();
        db.delete(TABLE_USERS, KEY_ID + " = ?",
                new String[] { String.valueOf(user.getId()) });
        db.close();
    }

Czas na test.

Po stworzeniu klasy wypadałoby ją przetestować. W tym celu stworzyłem taki oto kod w mojej klasie LoginActivity.

DatabaseHandler db = new DatabaseHandler(this);

        Log.d("Insert: ", "Inserting ..");
        db.addUser(new User("Ravi", "Haris", "ravi@example.com", "Los Angels", "10.05.1985"));
        db.addUser(new User("Srinivas", "Paul", "paul@example.com", "New York", "7.09.2001"));

        Log.d("Reading: ", "Reading all users..");
        List<User> users = db.getAllUsers();

        for (User usr : users) {
            String log = "Id: "+usr.getId()+" ,Name: " + usr.getName() + ",Surname: " + usr.getSurname() + ", Email: " + usr.getEmail() ;
            Log.d("Name: ", log);
        }

U mnie działa 🙂 mam nadzieje, że i Tobie udało się stworzyć własną bazę danych w Androidzie. Jeśli masz jakieś pytania lub uwagi pisz śmiało.

Reklamy

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj /  Zmień )

Zdjęcie na Google+

Komentujesz korzystając z konta Google+. Wyloguj /  Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj /  Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj /  Zmień )

Połączenie z %s