2010-07-13 44 views
9

Tôi có một ứng dụng Android sử dụng cơ sở dữ liệu SQLite. Tôi mở cơ sở dữ liệu khi ứng dụng bắt đầu, nhưng không bao giờ đóng nó khi nó được sử dụng liên tục.Cơ sở dữ liệu Flushing và SQLite trên android

Cách tốt nhất để yêu cầu cơ sở dữ liệu xóa tất cả thay đổi của nó thành bộ nhớ vĩnh viễn là gì? Tôi có cần phải đóng nó lại và mở lại hay có cách nào hiệu quả hơn không?

Vấn đề của tôi là khi thử nghiệm trên điện thoại, tắt điện thoại sau một số lần viết khiến cơ sở dữ liệu mất các cập nhật mới nhất khi ứng dụng được khởi động lại, điều này rõ ràng là không thể chấp nhận đối với hệ thống cơ sở dữ liệu.

Vì tôi không thể tìm hiểu cách nắm bắt sự kiện đóng ứng dụng, tôi không thể biết khi nào nên đóng thủ công cơ sở dữ liệu.

Trả lời

8

Tôi mở cơ sở dữ liệu khi ứng dụng bắt đầu, nhưng không bao giờ đóng nó khi nó được sử dụng liên tục.

Đừng làm vậy. Bạn dường như bỏ qua tất cả các lỗi xuất hiện trong LogCat phàn nàn rằng bạn đang bị rò rỉ kết nối cơ sở dữ liệu.

cách tốt nhất để biết cơ sở dữ liệu để tuôn ra tất cả những thay đổi của nó để lưu trữ vĩnh viễn là gì?

It will do that automatically at the end of a transaction. Theo mặc định, mỗi hoạt động SQL riêng lẻ (ví dụ: chèn) là một giao dịch.

Tôi có cần phải đóng và mở lại hoặc có cách hiệu quả hơn không?

Bạn nên đóng cơ sở dữ liệu của mình tại một số thời điểm (ví dụ: onDestroy() của dịch vụ đang dàn xếp cơ sở dữ liệu của bạn).

Vấn đề của tôi là khi thử nghiệm trên điện thoại , tắt điện thoại sau một số của viết đôi khi gây ra cơ sở dữ liệu để mất cập nhật gần đây nhất khi ứng dụng được khởi động lại, mà rõ ràng là không thể chấp nhận cho một hệ thống cơ sở dữ liệu.

Nếu bạn có thể tạo dự án mẫu thể hiện sự cố ngay cả sau khi bạn đóng kết nối cơ sở dữ liệu đúng cách, hãy đăng nó lên Android issue tracker.

Vì tôi không thể tìm ra cách để chụp sự kiện gần ứng dụng tôi không có thể biết khi nào tự đóng cơ sở dữ liệu .

Đóng nó khi tất cả các hoạt động không bị ràng buộc từ dịch vụ làm trung gian kết nối cơ sở dữ liệu, kích hoạt phương thức onDestroy() của dịch vụ đó. Hoặc, mở một kết nối mới trong mỗi thành phần cần truy cập vào cơ sở dữ liệu và sử dụng đồng bộ hóa Java để đảm bảo hai luồng không cố gắng sử dụng đồng thời cơ sở dữ liệu (nếu cần).

+3

Ứng dụng không phải sử dụng dịch vụ trung gian để sử dụng cơ sở dữ liệu SQLite và ứng dụng android không được thông báo khi tắt máy, vì vậy câu trả lời ở trên không hữu ích lắm. –

-1

Có phải trên Droid không? Và làm cách nào để bạn tắt điện thoại? Trừ khi bạn kéo pin ra, tắt điện thoại sẽ từ từ gió xuống hệ điều hành, tại thời điểm đó nó sẽ cam kết tất cả mọi thứ vào bộ nhớ.

Khi nào bạn mất cơ sở dữ liệu của mình một cách chính xác? Sau mỗi lần khởi động lại ứng dụng, hoặc chỉ ngẫu nhiên? Nếu sau mỗi lần khởi động lại, có vẻ như bạn đang phá hủy cơ sở dữ liệu khi khởi động.

+0

Sau khi khởi động lại, thông tin đó sẽ không đồng nhất. Khi tôi khởi động thiết bị, tôi chỉ cần mở, sau đó truy vấn nội dung cơ sở dữ liệu và đôi khi chỉ có một số thông tin ở đó. Tại sao thiết bị sẽ đưa mọi thứ vào đĩa? Nếu hệ điều hành giết chết chương trình mà không gọi onTerminate (mà SDK nói rằng nó hoàn toàn hợp lệ và dự kiến ​​sẽ làm) tôi có cần đóng/mở lại cơ sở dữ liệu sau mỗi lần viết không? – Akusete

+1

Trừ khi bạn giết một ứng dụng (hoặc bằng sigterm, hoặc bằng cách tháo pin), nó sẽ luôn tắt hoàn toàn. Xem mã nguồn của tất cả các ứng dụng Android như ứng dụng Nhắn tin - tất cả đều sử dụng nhà cung cấp nội dung mở cơ sở dữ liệu nhưng không bao giờ đóng nó. Họ để nó cho hệ điều hành để kết thúc quá trình, tại thời điểm đó nó sẽ làm sạch. (Hackbod đã đề cập rằng trong một bài đăng ở đâu đó). Không có lý do gì để tuôn ra bất cứ điều gì. Bạn có thể đăng mã về cách bạn tạo/quản lý cơ sở dữ liệu của bạn không? – EboMike

1

Nếu bạn sử dụng bất kỳ giao dịch nào được lồng nhau. Có nghĩa là nếu bạn thoát ra khỏi một trước khi kết thúc nó. Bạn sẽ kết thúc với một số ghi được cuộn lại khi điện thoại/ứng dụng được khởi động lại vì bạn không bao giờ đóng kết nối.

db.beginTransaction(); 
    try { 
    ... 
    db.setTransactionSuccessful(); 
    } finally { 
    db.endTransaction(); 
    } 
Các vấn đề liên quan