2011-07-20 32 views
6

Tôi đã phát triển một ứng dụng sử dụng HTML5 + WebSQL để đồng bộ hóa dữ liệu từ cơ sở dữ liệu cục bộ với máy chủ.Cách nén cơ sở dữ liệu WebSQL từ JavaScript

Khi dữ liệu bị xóa, kích thước của tệp cơ sở dữ liệu sqlite vẫn giữ nguyên. Tôi biết rằng điều này có chứa không gian trống và nó sẽ được lấp đầy khi dữ liệu mới được chèn vào nhưng tôi muốn giữ kích thước càng nhỏ càng tốt vì những hạn chế.

Tôi biết rằng lệnh VACUUM trong sqlite có thể nén cơ sở dữ liệu và xóa không gian không sử dụng, nhưng khi tôi cố gắng chạy nó trên cơ sở dữ liệu WebSQL từ JavaScript nó không thành công với lỗi "lỗi logic hoặc cơ sở dữ liệu bị thiếu". Chạy lệnh từ bên ngoài trình duyệt hoạt động tốt.

Câu hỏi của tôi là:

  1. lệnh CHÂN KHÔNG thể được thực hiện bằng cách nào đó từ JavaScript?

  2. Trình duyệt có thực hiện điều này tự động không và cuối cùng nó có được gọi là không? (không thể tìm thấy bất kỳ tài liệu nào về điều này)

Cảm ơn bạn đã được trợ giúp.

Trả lời

4

Do tính chất abondoned/work dừng lại của WebSQL, các yêu cầu về tính năng/lỗi/tính năng không được - và sẽ không bao giờ được vinh danh. Vấn đề tương tự tồn tại như một lỗi Chromium, ví dụ, không có phản ứng.

Dường như điều tồi tệ nhất là thực sự của hai câu hỏi của bạn:

1: Bởi vì lệnh chân không chỉ có thể chạy khi không kết nối cơ sở dữ liệu, nó chỉ có thể được chạy từ dòng lệnh. Không có "ngắt kết nối cơ sở dữ liệu và sau đó chạy VACUUM" lệnh trong trình duyệt hoặc javascript, có vẻ như.

2: Đừng tin vào nó. Nó không phải là rõ ràng rằng nó thậm chí sẽ chạy khi nó chạm vào giới hạn kích thước tối đa, và thậm chí nếu nó không bạn sẽ nhận thấy chậm lớn lớn trước khi bạn nhấn giới hạn kích thước tối đa.

Hầu hết bạn có thể gửi lệnh đến trình cắm, hoặc một thứ gì đó bên ngoài ngữ cảnh javascript, có thể tự chạy lệnh ... nó không còn được dùng nữa nên nó là điểm moot. Đối với một ứng dụng kế thừa nếu bạn phải có chức năng, nó sẽ phải được thực hiện bên ngoài ngữ cảnh trang web/js đơn giản.

Ứng dụng trong tương lai/hiện đại sử dụng IndexedDB ngay bây giờ; câu hỏi này đã được trả lời chỉ cho các ứng dụng cũ.

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