1

我想在我的 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 DB 的好方法吗?我已经阅读了可以在 Android 中配置的“服务”实现,所以我觉得这是我应该使用的东西吗?

4

2 回答 2

1

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

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

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

于 2012-07-16T14:39:56.357 回答
1

尽管将您的数据库逻辑移动到不同的类,但您在 UI 线程中执行所有数据库操作,这并不理想。另请注意,即使您的类被称为“服务”,它也不会继承自ServiceAndroid 中的任何类。

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

于 2012-07-16T14:51:11.500 回答