Я хочу вызвать операции CRUD для объектов Order в моей Activity. Мне было интересно, является ли следующая реализация класса "Сервис" хорошим способом сделать это? Я не хочу ссылаться на объекты DatabaseHelper или DAO в моем коде действия, так как я не думаю, что это было бы желательно. Вот мой класс обслуживания
public class OrderService
{
private static OrderService instance;
private static Dao<Order, Integer> orderDAO;
static public void init(Context ctx) {
if (null == instance) {
instance = new OrderService(ctx);
}
}
public static OrderService getInstance() {
return instance;
}
private OrderService(Context ctx) {
DatabaseHelper helper = DatabaseHelper.getInstance(ctx);
helper.getWritableDatabase();
orderDAO = helper.getOrderDao();
}
public Order getOrderWithId(int orderId) {
Order myOrder = null;
try {
myOrder = orderDAO.queryForId(orderId);
} catch (SQLException e) {
e.printStackTrace();
}
return myOrder;
}
public Order neworder(Order order) {
try {
orderDAO.create(order);
} catch (SQLException e) {
e.printStackTrace();
}
return order;
}
public void deleteorder(Order order) {
try {
orderDAO.delete(order);
} catch (SQLException e) {
e.printStackTrace();
}
}
public void updateorder(Order order) {
try {
orderDAO.update(order);
} catch (SQLException e) {
e.printStackTrace();
}
}
public List <Order> getordersForCategory(int orderId) {
List <Order> orders = null;
try {
orders = orderDAO.queryForAll();
} catch (SQLException e) {
e.printStackTrace();
}
return orders;
}
}
и вот как я намерен использовать сервис
public class OrderProcessingActivity extends Activity {
int orderID;
private Order order;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.myview);
order = OrderService.getInstance().getOrderWithId(orderID);
......
Это похоже на хороший способ доступа к SQLlite DB? Я прочитал о реализациях "Сервис", которые могут быть настроены на Android, поэтому я был сыгран, это то, что я должен использовать вместо этого?
Несмотря на то, что вы перемещаете логику базы данных в другой класс, вы делаете все свои операции с базой данных в потоке пользовательского интерфейса, что не идеально. Также обратите внимание, что даже если ваш класс называется "служба", он не наследуется ни от одного из классов Service
в Android.
Один альтернативный подход doInBackground
бы в том, чтобы выполнять операции с базой данных из метода doInBackground для AsyncTask, возвращать необходимые данные из этого метода. Затем используйте возвращаемые данные для обновления вашей активности в методе onPostExecute
.
Это более или менее подход, который я принимаю. Моя архитектура приложения обычно выглядит так:
Activity <--> Service <--> DAO <--> SQLite
Это выглядит довольно близко к тому, что у вас есть, поэтому я бы сказал, что это выглядит хорошо! Однако я обычно не реализую его как одноэлементный, поскольку мне не нравится поддерживать один и тот же Context
на протяжении всего срока службы приложения. Вместо этого я перехожу в Context
для создания службы из каждого Activity
.