隐藏DataBaseHelper&来自我的活动的DAO

时间:2012-07-16 14:34:55

标签: android ormlite

我想在Activity中的Order对象上调用CRUD操作。我想知道以下是实现“服务”类的一个好方法吗?我不想在我的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数据库的好方法吗? 我已经阅读了可以在Android中配置的“服务”实现,所以我想到这是我应该使用的东西吗?

2 个答案:

答案 0 :(得分:1)

这或多或少是我采取的方法。我的应用程序架构通常如下所示:

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

这看起来非常接近你所拥有的,所以我说它看起来不错!我通常不会将其实现为单例,但是,因为我不喜欢在应用程序的整个生命周期内保持相同的Context。相反,我传入Context以从每个Activity创建服务。

答案 1 :(得分:1)

尽管将数据库逻辑移动到另一个类,但是您正在UI线程中执行所有数据库操作,这并不理想。另请注意,即使您的类名为“service”,它也不会从Android中的任何Service类继承。

另一种方法是使用AsyncTaskdoInBackground方法执行数据库操作,从该方法返回所需的数据。然后,使用返回的数据以onPostExecute方法更新您的活动。