Скрытие DataBaseHelper и DAO от моей деятельности

1

Я хочу вызвать операции 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, поэтому я был сыгран, это то, что я должен использовать вместо этого?

Теги:
ormlite

2 ответа

1
Лучший ответ

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

Один альтернативный подход doInBackground бы в том, чтобы выполнять операции с базой данных из метода doInBackground для AsyncTask, возвращать необходимые данные из этого метода. Затем используйте возвращаемые данные для обновления вашей активности в методе onPostExecute.

  • 0
    это хорошо, такие вещи, которые я надеялся выяснить. Так что по соображениям производительности его следует нарезать. Я понял Есть ли у вас хорошие ссылки, которые показывают реализацию с использованием классов Android Service?
1

Это более или менее подход, который я принимаю. Моя архитектура приложения обычно выглядит так:

Activity <--> Service <--> DAO <--> SQLite

Это выглядит довольно близко к тому, что у вас есть, поэтому я бы сказал, что это выглядит хорошо! Однако я обычно не реализую его как одноэлементный, поскольку мне не нравится поддерживать один и тот же Context на протяжении всего срока службы приложения. Вместо этого я перехожу в Context для создания службы из каждого Activity.

  • 0
    Я также читал, что некоторые люди оборачивают слой DAO в ContentProvider. Я попробовал этот подход, но мне было трудно начать работать и привязать время здесь, чтобы найти решение на месте. Но есть баланс, который нужно достичь, лучший против самого быстрого. Это только первая из многих сущностей, к которым нам потребуется доступ, поэтому мы хотим начать с наилучшей возможной основы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню