Создание класса модели данных для обработки базы данных - PullRequest
8 голосов
/ 03 августа 2011

Я только начинал работать с приложением базы данных, когда понял, что должен реализовать шаблон MVC, поскольку приложение довольно сложное и включает в себя ряд операций с базой данных.
В связи с этим я решил создать отдельную model class для обработки операций с базой данных. Этот класс будет иметь все методы, которые будут возвращать мне данные после выполнения команды Sqlite (например, Select) ИЛИ просто выполнит команду SQLite (например, Delete). Но я хочу отделить этот класс от Database Adapter класса, где я открываю, создаю и закрываю свою базу данных.
Позвольте мне изложить мою концепцию в коде:

public class DataModel
{
/*

Private members

*/

// Method to Select data from Student table
public ArrayList<String> FetchStudents (parameter 1)
{
private ArrayList<String> arrStudent;


DatabaseAdapter objDB= new DatabaseAdapter();
objDB.open();  
/*
Some code
*/
objDB.close();


return arrStudent
}

//Method to delete record from Student table
public DeleteStudent(parameter 1)
{
DatabaseAdapter objDB= new DatabaseAdapter();
objDB.open();
//Some code
objDB.close();
}

/*

Rest of methods

*/
}  

// DatabaseAdapterClass

private static class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
/**
* onCreate method is called for the 1st time when database doesn't exists.
*/
@Override
public void onCreate(SQLiteDatabase db) {
Log.i(TAG, "Creating DataBase: " + CREATE_STUDENT_TABLE);
db.execSQL(CREATE_STUDENT_TABLE);
}
/**
* onUpgrade method is called when database version changes.
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
                        + newVersion);
}
}  

Вопрос
Что я хочу спросить, это правильный подход к реализации? Хорошо ли создавать отдельный класс для методов базы данных ? Какие ограничения или проблемы, вы думаете, ребята, могут беспокоить меня позже? Кроме того, есть ли лучший способ реализовать вышеуказанную концепцию?

Спасибо
Камень

Ответы [ 3 ]

11 голосов
/ 18 августа 2011

То, что вы называете «классом модели», более известно как объект доступа к данным (DAO). Ваша модель обычно представляет собой набор классов, которые содержат ваши данные и бизнес-логику. В вашем случае, вероятно, класс Student, имеющий свойства ID, имени, GPA и т. Д. Если вы хотите отделить доступ к данным от вашей модели, ваш класс доступа к данным (DatabaseHelper) запросит базу данных и использует полученные данные для возврата Student объектов или List<Student>. В действительности нет особого смысла отделять класс доступа к данным от помощника базы данных, лучше иметь весь код, связанный с базой данных, в одном месте.

Однако использование классов модели (только) может не всегда быть практичным для Android, поскольку имеет встроенную поддержку получения и отображения данных из курсора (CursorAdapter и т. Д.). Если вы хотите использовать что-либо из этого, вам придется представить ваши данные не как объекты модели, а как Cursor. Что касается контент-провайдеров, взгляните на них тоже, но если вам не нужно предоставлять свои данные другим приложениям, написание ContentProvider может оказаться излишним.

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

1 голос
/ 08 февраля 2015

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

0 голосов
/ 03 августа 2011

родной подход к моделированию андроида - контент-провайдеры. Ссылка

это своего рода абстракция, а также тип источника данных.

Я использовал для этого аналогичным образом.но опять же, это также субъективно.

...