2012-02-03 34 views
6
SQLiteOpenHelper dbOpenHelper = new (ctx, nameofdb); 
SQLiteDatabase db = dbOpener.getWritableDatabase(); 

Tôi có phải gọi .close() trên cả hai thứ này hoặc chỉ một trong số đó là đủ? Nếu có, thì cái nào?Tôi có nên gọi .đóng() trên cả SQLiteDatabase và SQLiteOpenHelper

SQLiteDatabase 
SQLiteOpenHelper 

Vấn đề tôi đang gặp là tôi không thấy một hàng cụ thể trong DDMS xem trong Eclipse, nhưng khi tôi sử dụng con trỏ để có được nó, nó cho thấy rằng tôi có entry đó. Vì vậy, tôi tự hỏi nó có thể được gây ra bởi không đóng cơ sở dữ liệu đúng cách? Bất cứ ai có thể giúp đỡ sẽ là tuyệt vời. Cảm ơn!

Trả lời

5

Nếu bạn nhìn vào các tài liệu cho SQLiteOpenHelper.close() ...

công đồng bộ void gần()

Đóng tất cả các đối tượng cơ sở dữ liệu mở.

Nó không đóng SQLiteOpenHelper, nó đóng cơ sở dữ liệu.

Hơn nữa, nếu bạn nhận được mã của mình, bạn có thể tránh trực tiếp giao dịch trực tiếp với đối tượng cơ sở dữ liệu.

Ví dụ: nếu bạn có truy vấn bạn sử dụng thường xuyên để nhận con trỏ cho bộ điều hợp để điền chế độ xem, hãy tạo phương thức trong lớp SQLiteOpenHelper và đặt truy vấn vào đó.

Nói cách khác, không được tham chiếu đến cơ sở dữ liệu thực trong mã chính của bạn chỉ cần lấy SQLiteOpenHelper để làm mọi thứ cho bạn.

+1

Điều gì về [Nguyên tắc trách nhiệm duy nhất] (http://en.wikipedia.org/wiki/Single_responsibility_principle)? Tôi nghĩ rằng lớp 'SQLiteOpenHelper' chỉ sử dụng [để giúp] để mở (để tạo ra \ update) một cơ sở dữ liệu. –

+0

@LeonidSemyonov: Có thể lập luận rằng bằng cách đơn giản mở rộng bất kỳ lớp nào và thêm chức năng (các phương thức mới hoặc thực hiện giao diện) cũng bổ sung thêm trách nhiệm ... nhưng làm điều đó là nguyên tắc cơ bản của OOD/OOP. Nó không phải là không phổ biến trong Android để tạo ra một lớp trợ giúp DB 'chung' mà bản thân nó duy trì một 'SQLiteOpenHelper'. Quan điểm của tôi là trong một số trường hợp, 'SQLiteOpenHelper' có thể được mở rộng để cung cấp * ALL * của các phương thức trợ giúp của DB 'hơn là có một trình trợ giúp DB' riêng biệt 'POJO. – Squonk

+0

@Squonk làm 'đóng bất kỳ đối tượng cơ sở dữ liệu mở' ngụ ý rằng nó sẽ đóng tất cả các trường hợp SqliteDatabase mở trong ứng dụng (giả sử rằng có nhiều mở) hoặc nó chỉ đóng những cái được gắn với đối tượng SqliteOpenHelper hiện tại? – aandis

Các vấn đề liên quan