2010-01-28 40 views
31

Tôi muốn nhận các liên hệ của người dùng và sau đó nối thêm một số loại biểu thức chính quy và thêm chúng vào chế độ xem danh sách. Tôi hiện đang có khả năng để có được tất cả các địa chỉ liên lạc quaLàm cách nào để lọc kết quả của trình phân giải nội dung trong Android?

getContentResolver().query(People.CONTENT_URI, null, null, null, null);

và sau đó vượt qua chúng vào một lớp tùy chỉnh mà kéo dài SimpleCursorAdapter.

Vì vậy, tôi muốn biết cách chỉ nhận các liên hệ khớp với cụm từ thông dụng chứ không phải tất cả người liên hệ của người dùng.

Trả lời

63

Thay vì

getContentResolver().query(People.CONTENT_URI, null, null, null, null); 

bạn nên sử dụng một cái gì đó giống như

final ContentResolver resolver = getContentResolver(); 
final String[] projection = { People._ID, People.NAME, People.NUMBER }; 
final String sa1 = "%A%"; // contains an "A" 
cursor = resolver.query(People.CONTENT_URI, projection, People.NAME + " LIKE ?", 
    new String[] { sa1 }, null); 

này sử dụng một yêu cầu tham số (sử dụng ?) và cung cấp các giá trị thực tế như một lý lẽ khác nhau, điều này tránh được nối và ngăn chặn SQL tiêm chủ yếu nếu bạn đang yêu cầu bộ lọc từ người dùng. Ví dụ, nếu bạn đang sử dụng

cursor = resolver.query(People.CONTENT_URI, projection, 
    People.NAME + " = '" + name + "'", 
    new String[] { sa1 }, null); 

tưởng tượng nếu

name = "Donald Duck' OR name = 'Mickey Mouse") // notice the " and ' 

và bạn đang concatenating các dây.

+0

Cảm ơn tất cả các câu trả lời của bạn Tôi thực sự đánh giá cao. – maxsap

+2

Giải thích rất hay, cảm ơn rất nhiều! –

5

Bạn có thể truy vấn nhà cung cấp nội dung có đầu vào loại sql, phương thức truy vấn chỉ là trình bao bọc cho lệnh sql.

Dưới đây là một ví dụ mà tôi truy vấn cho một tên hệ được đưa ra một số đặc biệt

String [] requestedColumns = { 
      Contacts.Phones.NAME, 
      Contacts.Phones.TYPE 
    }; 

Cursor contacts = context.getContentResolver().query(
      Contacts.Phones.CONTENT_URI, 
      requestedColumns, 
      Contacts.Phones.NUMBER + "='" + phoneNumber + "'", 
      null, null); 

Lưu ý rằng thay vì null Tôi có tham số mà xây dựng các câu lệnh SQL.

Yêu cầuColumn là dữ liệu tôi muốn quay lại và Danh bạ.Phones.NUMBER + "= '" + phoneNumber + "'" là mệnh đề Where, vì vậy tôi truy xuất Tên và Loại nơi Số điện thoại khớp với

3

Bạn có thể đặt mệnh đề WHERE SQLite hợp pháp làm đối số thứ ba cho phương thức query(), bao gồm LIKE, nhưng không có hàm REGEXP gốc trong SQLite và Android dường như không cho phép bạn định nghĩa riêng của mình. Vì vậy, tùy thuộc vào mức độ phức tạp của nhu cầu của bạn, một tập hợp các điều kiện SQLite và biểu thức LIKE khác có thể thực hiện thủ thuật.

Xem tài liệu trên query method trong ContentResolver và SQLite expressions.

1

Thực tế REGEXP với nhà cung cấp nội dung Calllog hoạt động (có nghĩa là hàm regexp() được xác định cho Cơ sở dữ liệu của nhà cung cấp nội dung đó https://sqlite.org/lang_expr.html#regexp)! Nhưng nó rất chậm: ~ 15 giây trên ~ 1750 bản ghi.

String regexp = "([\\s\\S]{0,}" + 
TextUtils.join("||[\\s\\S]{0,}", numbers) + 
")"; 

cursor = context.getContentResolver().query(
CallLog.Calls.CONTENT_URI, 
null, 
CallLog.Calls.NUMBER + " REGEXP ?", 
new String[]{regexp}, 
CallLog.Calls.DATE + " DESC" 
); 
Các vấn đề liên quan