Tabela znajomych i relacje w bazie danych.

Baza danych, którą stworzyłem w tamtym tygodniu ciągle się rozrasta. Nastał moment, w którym trzeba było umieścić tam tabele zawierające wpisy, którzy użytkownicy są znajomymi. W tym wpisie przedstawię wam proces upgrade’u bazy.

bench-sea-sunny-man

Zmiany w strukturze tabeli users.

Kiedy zabrałem się za tworzenie drugiej tabeli w bazie wpadłem na pomysł, że fajnie byłoby mieć informację kiedy dany użytkownik zarejestrował się w aplikacji. Dodałem kolejną stałą do mojego kodu:

private static final String KEY_CREATED_AT = "createdAt";

Umieściłem ją w strukturze bazy, a pobieranie daty utworzenia rekordu zaimplementowałem w taki sposób:

values.put(KEY_CREATED_AT, String.valueOf(Calendar.getInstance().getTime()));

Nowa tabela – friends.

Do stworzenia tabeli z informacją, którzy użytkownicy są znajomymi potrzebne mi są w sumie tylko dwa klucze zawierające ID odpowiednich userów. Tabela będzie zawierać jeszcze własne ID i pole, w którym zapisana będzie data utworzenia rekordu – informacja ile czasu użytkownicy są razem znajomymi.

Kod struktury tabeli:

private static final String CREATE_FRIENDS_TABLE = "CREATE TABLE " + TABLE_FRIENDS
 + "(" + KEY_ID + " INTEGER PRIMARY KEY," + KEY_FRIEND1 + " INTEGER,"
 + KEY_FRIEND2 + " INTEGER," + KEY_CREATED_AT + " DATETIME" + ")";

Jego wywołanie w metodzie onCreate:

sqLiteDatabase.execSQL(CREATE_FRIENDS_TABLE);

oraz w metodzie onUpgrade:

sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + TABLE_FRIENDS);

Tworzenie relacji wielu do wielu.

Najprostszym sposobem zapisania relacji między jednym użytkownikiem, a drugim jest zapisanie ID pierwszego użytkownika do pierwszego pola i ID drugiego użytkownika do drugiego pola rekordu, który tworzymy. Takie rozwiązanie ma jedną wadę, aby zapisać, że użytkownicy są znajomymi trzeba wywołać metodę dwa razy, za drugim razem należy zmienić kolejność umieszczania kluczy na odwrotną. Moja metoda wygląda następująco:

public void makeFriend(long id, long friendId) {
SQLiteDatabase db = this.getWritableDatabase();

ContentValues values = new ContentValues();
values.put(KEY_FRIEND1, id);
values.put(KEY_FRIEND2, friendId);
values.put(KEY_CREATED_AT, String.valueOf(Calendar.getInstance().getTime()));

db.insert(TABLE_FRIENDS, null, values);
}

Musimy stworzyć jeszcze metodę pozwalającą nam wyciągnąć z bazy dany listę znajomych danego użytkownika. Ja na razie przygotowałam taką metodę, w razie potrzeby będę ją modyfikował:

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));
user.setCreatedAt(cursor.getString(6));

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

A co jeśli znajomi się pokłócą o to co jest lepsze – taby czy spacje i przestaną być znajomymi? 🙂 Użyją metody do usuwanie znajomego, która ma taką samą wadę jak metoda dodająca znajomego – trzeba ją wywołać dwa razy:

public void deleteFriend(int id, int friendId) {
SQLiteDatabase db = this.getWritableDatabase();
String findId = "SELECT " + KEY_ID + " FROM " + TABLE_FRIENDS + " WHERE "
+ KEY_FRIEND1 + " = " + id + " AND " + KEY_FRIEND2 + " = " + friendId;
Cursor cursor = db.rawQuery(findId, null);

if (cursor != null)
cursor.moveToFirst();
db.delete(TABLE_FRIENDS, KEY_ID + " = ?",
new String[] {String.valueOf(
cursor.getInt(cursor.getColumnIndex(KEY_ID))
)});
}

Kiedy zmiany nie działają…

Zdarza się, że wprowadzone przez nas zmiany w bazie danych nie są widoczne w aplikacji. Co robić?

  • Zmieniasz wersję bazy danych – nie polecam tego rozwiązania w fazie tworzenia, bo mógłbyś dojść do całkiem pokaźnych wartości jeśli często edytujesz bazę. To rozwiązanie lepiej sprawdzi się na produkcji.

lub

  • Przeklikujesz menedżer aplikacji w swoim telefonie i czyścisz cache, w którym zapisane są dane bazy, w niektórych przypadkach jednak to nie pomaga i trzeba odinstalować aplikacje z telefonu i uruchomić od nowa kompilator w Android Studio.

Jeszcze dużo pracy nad modułem znajomych przede mną, a więc szkoda marnować czas, trzeba zabrać się do dalszej pracy!  

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 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