Repository патерн в Android (без фреймворків)
Вступ
В Android розробці Repository патерн є важливим елементом архітектури, який дозволяє абстрагувати доступ до даних. Він дозволяє централізувати логіку доступу до бази даних, знижуючи залежність від конкретної реалізації джерела даних (наприклад, SQLite). Це дозволяє легше тестувати та підтримувати додаток.
Крок 1: Створення SQLite допоміжного класу
Перед тим як створювати сам Repository, необхідно налаштувати доступ до бази даних за допомогою SQLite.
Створення класу для роботи з базою даних
public class DatabaseHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "my_database";
private static final int DATABASE_VERSION = 1;
public static final String TABLE_NAME = "users";
public static final String COLUMN_ID = "id";
public static final String COLUMN_NAME = "name";
public static final String COLUMN_AGE = "age";
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String createTableQuery = "CREATE TABLE " + TABLE_NAME + " (" +
COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
COLUMN_NAME + " TEXT, " +
COLUMN_AGE + " INTEGER)";
db.execSQL(createTableQuery);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);
}
}
Тут ми створюємо допоміжний клас DatabaseHelper, який успадковується від SQLiteOpenHelper. Він визначає методи для створення та оновлення бази даних.
Крок 2: Створення моделі даних
Модель даних представляє собою об'єкт, який буде зберігати дані з таблиці.
public class User {
private long id;
private String name;
private int age;
public User(long id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
// Геттери та сеттери
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
У нашій моделі User є три поля: id, name і age, які відповідають колонкам таблиці в базі даних.
Крок 3: Реалізація Repository патерну
Тепер ми можемо створити сам Repository, який буде виконувати CRUD операції (створення, читання, оновлення, видалення) з базою даних.
public class UserRepository {
private SQLiteDatabase database;
private DatabaseHelper dbHelper;
public UserRepository(Context context) {
dbHelper = new DatabaseHelper(context);
}
// Встановлення з'єднання з базою даних
private void open() {
database = dbHelper.getWritableDatabase();
}
// Закриття з'єднання з базою даних
private void close() {
dbHelper.close();
}
// Додавання користувача
public void addUser(User user) {
open();
ContentValues values = new ContentValues();
values.put(DatabaseHelper.COLUMN_NAME, user.getName());
values.put(DatabaseHelper.COLUMN_AGE, user.getAge());
database.insert(DatabaseHelper.TABLE_NAME, null, values);
close();
}
// Отримання користувача за id
public User getUser(long id) {
open();
Cursor cursor = database.query(
DatabaseHelper.TABLE_NAME,
null,
DatabaseHelper.COLUMN_ID + " = ?",
new String[]{String.valueOf(id)},
null, null, null
);
User user = null;
if (cursor != null && cursor.moveToFirst()) {
String name = cursor.getString(cursor.getColumnIndex(DatabaseHelper.COLUMN_NAME));
int age = cursor.getInt(cursor.getColumnIndex(DatabaseHelper.COLUMN_AGE));
user = new User(id, name, age);
cursor.close();
}
close();
return user;
}
// Оновлення користувача
public void updateUser(User user) {
open();
ContentValues values = new ContentValues();
values.put(DatabaseHelper.COLUMN_NAME, user.getName());
values.put(DatabaseHelper.COLUMN_AGE, user.getAge());
database.update(
DatabaseHelper.TABLE_NAME,
values,
DatabaseHelper.COLUMN_ID + " = ?",
new String[]{String.valueOf(user.getId())}
);
close();
}
// Видалення користувача
public void deleteUser(long id) {
open();
database.delete(
DatabaseHelper.TABLE_NAME,
DatabaseHelper.COLUMN_ID + " = ?",
new String[]{String.valueOf(id)}
);
close();
}
}
У класі UserRepository ми реалізуємо методи для додавання, отримання, оновлення та видалення користувачів. Ми також відкриваємо та закриваємо з'єднання з базою даних у кожному методі, щоб забезпечити ефективне використання ресурсів.
Крок 4: Використання Repository в Activity
Тепер ми можемо використовувати наш Repository для взаємодії з даними в Activity або іншій компоненці Android.
public class MainActivity extends AppCompatActivity {
private UserRepository userRepository;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
userRepository = new UserRepository(this);
// Створення нового користувача
User newUser = new User(0, "John Doe", 30);
userRepository.addUser(newUser);
// Отримання користувача
User user = userRepository.getUser(1);
if (user != null) {
Log.d("MainActivity", "User: " + user.getName() + ", Age: " + user.getAge());
}
// Оновлення користувача
if (user != null) {
user.setAge(31);
userRepository.updateUser(user);
}
// Видалення користувача
if (user != null) {
userRepository.deleteUser(user.getId());
}
}
}
У MainActivity ми створюємо екземпляр UserRepository, використовуємо його методи для додавання, отримання, оновлення та видалення користувачів із бази даних.