2009-03-24 17 views
6

Tôi có các đốm màu lớn trong ứng dụng SQLite và cần phải cập nhật các phân đoạn nhỏ của các đốm màu này theo kiểu chắp vá. Một cái gì đó giống như nói "cập nhật byte X thông qua Y của blob B với dữ liệu D", điều này có thể được thực hiện trong cơ sở dữ liệu khác với chức năng thao tác Blob, nhưng tôi không thể tìm thấy bất cứ điều gì như thế này cho SQLite, tôi bị mắc kẹt? Hoặc liệu SQLite có cách điều khiển Blobs không?Làm thế nào để cập nhật piecewise một blob trong SQLite?

Cảm ơn.

Trả lời

4

SQLite 3.x hỗ trợ điều này thông qua hàm sqlite3_blob_write.

int sqlite3_blob_write(sqlite3_blob *, const void *z, int n, int iOffset) 

Lưu ý rằng chức năng này được cung cấp như một phần của API 3 C/C++ của SQLite. Bạn sẽ cần phải lập trình chống lại điều này trực tiếp để sử dụng nó.

Nếu bạn đang sử dụng một số trình bao bọc cấp cao hơn khác chẳng hạn như System.Data.SQLite, lần cuối tôi nhìn, bạn sẽ không có quyền truy cập vào chức năng này.

7

Đây không phải là câu trả lời trực tiếp cho câu hỏi của bạn, nhưng tôi có một số kinh nghiệm sử dụng truy cập ngẫu nhiên cho các blob (lớn) trong SQLite và tôi khuyên bạn không nên sử dụng nó nếu có thể. Đây là lý do:

Blobs tách hoàn toàn định dạng truy vấn SQL. Nếu dữ liệu blob của bạn cần bất kỳ loại xử lý nào, chắc chắn nó sẽ cần lọc. Dù bạn có cơ chế nào để xử lý việc lọc trong SQL thì sẽ vô ích trong vấn đề này.

Xử lý các đốm màu nhị phân được bao bọc trong cơ sở dữ liệu trái ngược với dữ liệu nhị phân trong tệp thô giới hạn tùy chọn của bạn. Bạn sẽ không thể đọc ngẫu nhiên và ghi vào dữ liệu cùng một lúc từ nhiều quy trình, có thể với các tệp. Bạn không thể sử dụng bất kỳ công cụ nào có liên quan đến dữ liệu này và chỉ cung cấp giao diện I/O tệp. Bạn không thể cắt bớt hoặc thay đổi kích thước blob. Các tệp đơn giản hơn rất nhiều.

Có vẻ thuận tiện khi có mọi thứ chứa trong một tệp, vì nó đơn giản hóa việc sao lưu và chuyển, nhưng nỗi đau khi làm việc với các đốm màu đơn giản là không đáng.

Vì vậy, với tư cách luật sư của bạn, tôi khuyên bạn nên viết blob của bạn dưới dạng tệp thô vào hệ thống tệp và chỉ lưu trữ tham chiếu đến tên tệp trong cơ sở dữ liệu của bạn. Nếu các đốm màu của bạn khá nhỏ và chắc chắn không phát triển, hãy quên lời khuyên của tôi.

+1

Vâng, đôi khi của tôi có thể phát triển , nhưng đó là trong quá trình nâng cấp đầy đủ các dịch vụ, do đó, "an toàn" để nói rằng chúng có độ dài không đổi trong "chu kỳ sản phẩm" (tuy nhiên dài hoặc ngắn có thể) –

+0

Nhưng, tôi hoàn toàn đồng ý với mọi từ bạn nói , Tôi thực sự muốn tránh các đốm màu, nhưng vì cách các thông số kỹ thuật được đặt ra, tôi không có lựa chọn:/ –

+0

Thumbs up. Anh ấy sẽ cần rất nhiều lời khuyên pháp lý trước khi điều này kết thúc. : P – Cray

3

Tôi mạnh mẽ đồng ý với mọi thứ được nói bởi paniq. Sử dụng BLOB giới hạn các tùy chọn của bạn một cách đáng kể.

Nếu bạn đang sử dụng System.Data.SQLite bạn sẽ không có hỗ trợ thực sự cho BLOB. Đó là lý do tại sao tôi đã viết lớp của riêng mình để xử lý chúng. Bạn có thể tìm thấy mã ở đây: Sample BLOB code

Lưu ý rằng SQLite có một số cạm bẫy tiềm năng cho những người dám làm việc với BLOB. Một trong những vấn đề chính là SQLite tải toàn bộ trường BLOB vào bộ nhớ trước khi cho phép bạn thậm chí kiểm tra độ dài của chúng .. Vì vậy, mong đợi rất nhiều bộ nhớ đập nếu bạn có các trường BLOB lớn ...

+0

Tệp của bạn bị thiếu –

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