2013-03-11 27 views
5

Câu hỏi của tôi là về thực tiễn tốt về xử lý ngoại lệ DB.Android: Tôi nên xử lý ngoại lệ truy cập DB như thế nào?

Giả sử tôi có một ứng dụng lưu trữ một số dữ liệu trong DB. Có các lớp sau được triển khai:

  1. DatabaseAdapter - xử lý truy vấn SQL và cung cấp dữ liệu cho lớp cao hơn dưới dạng mô hình. Bộ biến thế có một phương pháp như: Danh sách
    • getAllUsers()
    • trống adduser (UserModel người dùng)
  2. UserListActivity - hiển thị danh sách tất cả người dùng, cho phép thêm người dùng mới vv Hoạt động này sử dụng DatabaseAdapter để đọc/ghi cơ sở dữ liệu.

Câu hỏi đặt ra là: liệu tôi có xử lý ngoại lệ truy cập cơ sở dữ liệu hay không, ví dụ: khi thêm bản ghi mới (giả sử rằng bản ghi phải luôn được thêm chính xác)? Tôi có nên thử nắm bắt ngoại lệ trong DatabaseAdapter và thêm nó vào nhật ký không? Hoặc có lẽ tôi không nên bắt nó?

Trả lời

4

Hầu hết thời gian, Ngoại lệ khi truy vấn cơ sở dữ liệu là kết quả của lỗi "thời gian phát triển", chẳng hạn như truy vấn không đúng định dạng hoặc sửa đổi giản đồ nhưng không tăng phiên bản cơ sở dữ liệu hoặc tương tự. Đây sẽ là khá dễ dàng để tìm và sửa chữa ngay tại chỗ, do đó, người dùng cuối của bạn sẽ không bị ảnh hưởng bởi những loại sai lầm.

Tuy nhiên, cũng có khả năng thực sự mà bạn có thể có trường hợp ngoại lệ trong các trường hợp sau đây:

  • Bạn cố gắng truy cập vào cơ sở dữ liệu SQLite của bạn từ nhiều quy trình (một công thức cho thảm họa).
  • Người dùng hết dung lượng đĩa trên thiết bị của họ.
  • Bạn có truy vấn không đúng định dạng do không thoát đúng cách nhập người dùng.
  • Có lỗi trong phương thức onUpgrade() của bạn hoặc thứ gì đó tương tự.
  • Bạn đang sử dụng tính toàn vẹn tham chiếu (có thể trong SQLite 3.6.19 trở lên) và một số ràng buộc bảng không thành công.

Thực sự, không có câu trả lời chung cho các trường hợp này. Đối với người dùng cuối, việc hiển thị lỗi đơn giản hơn rất nhiều so với việc buộc ứng dụng của bạn đóng cửa chẳng hạn.

Quy tắc chung của tôi là tránh tham nhũng cơ sở dữ liệu của bạn bằng mọi giá. Tôi sẽ thay vì ném một RuntimeException và ngay lập tức giết các ứng dụng thay vì có nó âm thầm làm điều gì đó sai trái. Ngoài ra, tôi muốn hiển thị một thông báo nói rằng một chèn không thể được hoàn thành hơn là buộc đóng ứng dụng.

0

Không có câu trả lời chung cho câu hỏi này phù hợp với nhau. Nó phụ thuộc vào trường hợp sử dụng. Tuy nhiên, các quy tắc áp dụng luôn: không vượt qua các thông báo ngoại lệ quá chi tiết đến lớp trên (UI không cần biết về một vấn đề trong cú pháp SQL) và xử lý ngoại lệ khi nó có ý nghĩa (không hiển thị hộp thoại báo lỗi trong lớp DB của bạn). Ví dụ, bạn có thể nắm bắt cơ sở dữ liệu ngoại lệ trong lớp DB, đăng nhập và sau đó ném lại một CustomerNotFoundException tùy chỉnh bị bắt trong giao diện người dùng nơi bạn có thể hiển thị hộp thoại báo lỗi.