37

Tôi đã nâng cấp Nexus 7 của mình bằng Android 5.0 Lollipop, Trước khi ứng dụng của tôi hoạt động tốt với Cơ sở dữ liệu SQLite nhưng bây giờ Bất cứ khi nào tôi thực hiện bất kỳ loại truy vấn nào, nó mang lại cho tôi log mèo lỗi như:Cơ sở dữ liệu SQLite cung cấp chỉ mục tự động cảnh báo trên <table_name> (cột) Sau khi nâng cấp Android L

12-09 12:37:04.942: E/SQLiteLog(13041): (284) automatic index on area(server_id) 
12-09 12:37:04.942: E/SQLiteLog(13041): (284) automatic index on account(area_id) 
12-09 12:37:04.942: E/SQLiteLog(13041): (284) automatic index on staff_visit(account_id) 
12-09 12:37:04.942: E/SQLiteLog(13041): (284) automatic index on ordertab(account_id) 
12-09 12:37:04.960: E/SQLiteLog(13041): (284) automatic index on area(server_id) 
12-09 12:37:04.960: E/SQLiteLog(13041): (284) automatic index on account(area_id) 
12-09 12:37:04.960: E/SQLiteLog(13041): (284) automatic index on staff_visit(account_id) 
12-09 12:37:04.960: E/SQLiteLog(13041): (284) automatic index on ordertab(account_id) 
12-09 12:37:04.978: E/SQLiteLog(13041): (284) automatic index on area(server_id) 
12-09 12:37:04.978: E/SQLiteLog(13041): (284) automatic index on account(area_id) 
12-09 12:37:04.978: E/SQLiteLog(13041): (284) automatic index on staff_visit(account_id) 
12-09 12:37:04.978: E/SQLiteLog(13041): (284) automatic index on ordertab(account_id) 

Vì vậy, nó là lỗi của bất kỳ sai lầm Lollipop? Tôi nghĩ như vậy bởi vì tôi không có cập nhật mã của tôi trước và sau khi nâng cấp hệ điều hành này.

+0

Chỉ số tự động BTW cải thiện tốt thời gian thực hiện truy vấn –

+0

Mặc dù tôi đã tạo chỉ mục theo cách thủ công cho tìm kiếm của tôi hoặc tham gia cột nhưng vẫn đang tạo chỉ mục tự động. –

Trả lời

65

Automatic indexing đã được giới thiệu trong sqlite 3.7.17. Phiên bản sqlite với tính năng này chỉ là included in Android L developer preview. Đây là lý do tại sao bạn nhận được tin nhắn chỉ trên Lollipop nhưng không phải trước đó. Ngay cả khi nó được đăng nhập như một lỗi, nó thực sự chỉ là một tin nhắn.

Về cơ bản, lập chỉ mục tự động được phát khi bạn thực hiện tra cứu trên các cột không được lập chỉ mục. sqlite giả định có rất nhiều dữ liệu tạo ra một chỉ mục tạm thời là rẻ hơn so với tra cứu thô.

Cân nhắc thêm chỉ mục rõ ràng, vĩnh viễn cho các cột tra cứu của bạn với CREATE INDEX. Ví dụ, sau CREATE TABLE của bạn:

CREATE INDEX indexname ON tablename(columnname); 

nơi bạn có thể chọn tablename(columnname) từ những thông điệp autoindex như sản xuất bởi SQLite.

Nếu bạn chỉ muốn các hành vi cũ trở lại, bạn có thể tắt tính năng tự động lập chỉ mục với

PRAGMA automatic_index=off; 
+0

Cảm ơn @laalto, Nếu tôi không làm gì thì mọi thứ sẽ sai? –

+0

Chỉ hiệu suất truy vấn của bạn bị ảnh hưởng. – laalto

+0

Vì vậy, đó là cách tốt hơn để lập chỉ mục chúng. Điều này có vấn đề không? –

1

Đây là bài đầu trong khi tôi đã nhìn vào vấn đề này. Mặc dù tôi có một dự án C# C# và nó có thể không liên quan đến OP, tôi nghĩ rằng nó vẫn có thể hữu ích cho ai đó.

Đối với những người thắc mắc tại sao thư tiếp tục xuất hiện, mặc dù chỉ mục được tạo rõ ràng; có thể truy vấn của bạn đang sử dụng một đối chiếu khác.

Tôi đã có một bảng có cột văn bản và truy vấn chọn có tuyên bố ở đâu chỉ định where name = @var1 COLLATE NOCASE. Điều này đã kích hoạt các cảnh báo, vì chỉ mục tôi đã tạo là đối chiếu mặc định.

Do đó, viết lại chỉ mục hoặc câu lệnh tạo bảng để chỉ định nocase cho cột đó, làm cho cảnh báo biến mất.

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