2011-09-01 42 views
5

Tôi có đoạn mã sau để kiểm tra số hàng trong cơ sở dữ liệu.Kiểm tra xem giá trị nguyên đã tăng chưa?

private void checkMMSRows(){ 
    Cursor curPdu = getContentResolver().query(Uri.parse("content://mms/part"), null, null, null, null); 
    if (curPdu.moveToNext()){ 
     int number = curPdu.getCount(); 
     System.out.println(number); 
    } 
} 

Tôi sẽ chạy mã này mỗi giây và làm điều gì đó khi giá trị thay đổi. Vấn đề là, làm thế nào để tôi đi về "phát hiện" sự thay đổi? Bất kỳ trợ giúp sẽ được đánh giá cao.

Trả lời

4

Rất cơ bản, thêm một biến lớp học - bạn có thể làm cho nó static trên tất cả các thể hiện của lớp, hoặc một biến Ví dụ (bằng cách loại bỏ các từ khóa static).

Mỗi khi bạn nhận được một số, bạn có thể so sánh số này với oldNumber. Sau khi so sánh, thiết lập các oldNumber đến số lượng hiện tại - vì vậy bạn có cái gì để so sánh với thời gian tiếp theo:

private static int oldNumber = -1; 
private void checkMMSRows(){ 
    Cursor curPdu = getContentResolver().query(Uri.parse("content://mms/part"), null, null, null, null); 
    if (curPdu.moveToNext()){ 
     int number = curPdu.getCount(); 
     System.out.println(number); 
     if(number != oldNumber){ 
      System.out.println("Changed"); 
      // add any code here that you want to react to the change 
     } 
     oldNumber = number; 
    } 
} 

Cập nhật:

câu trả lời của tôi là một giải pháp thẳng đang Hack & dấu gạch chéo, nhưng tôi có thể khuyên bạn nên amit's answer.

+0

Phương pháp tiếp tục kiểm tra hay nó chỉ kiểm tra một lần và đúng không? – androidnoob

+0

@androidnoob Nó kiểm tra sau mỗi lần bạn gọi 'getCount()' - vì vậy có, mỗi lần. – Mikaveli

+0

'oldNumber = number;' số không thể được giải quyết cho một biến, tôi có cần phải khai báo nó như là một biến toàn cầu? – androidnoob

4

Phụ thuộc vào ngữ cảnh trong đó thao tác này được chạy. Giả sử rằng đối tượng mà phương thức này thuộc về sẽ sống giữa các kiểm tra khác nhau, tất cả những gì bạn cần làm là thêm trường int currentValue vào đối tượng, lưu trữ giá trị trong đó lần đầu tiên bạn kiểm tra và sau đó so sánh giá trị với những người thân trong kiểm tra tiếp theo (và cập nhật nếu cần thiết)

int currentValue = 0; 
private void checkMMSRows(){ 
    Cursor curPdu = getContentResolver().query(Uri.parse("content://mms/part"), null, null, null, null); 
    if (curPdu.moveToNext()){ 
     int newValue = curPdu.getCount(); 
     if (newvalue != currentValue) { 
       //detected a change 
       currentValue = newValue; 
     } 
     System.out.println(newValue); 
    } 
} 
+0

+1. Câu trả lời của tôi càng ít, nhưng bạn đã đến đó vài giây trước đó. :) – Mikaveli

0

bạn có thể regsister một braodcastreceiver cho mms đến mới và bằng cách này bạn sẽ đến để nhận biết rằng sự thay đổi đã diễn ra ..

3

Thay vì kiểm tra mỗi giây nếu yếu tố của bạn đã được thay đổi, bạn có thể muốn xem xét một thay thế: chỉ cho phép truy cập đặc biệt vào phần tử này và thực hiện điều gì đó khi nó được thay đổi.

Đây là mẫu thiết kế nổi tiếng và được gọi là Observer Pattern.

Đây là mẫu thiết kế được chứng minh tốt, điều này sẽ làm cho mã của bạn dễ đọc hơn và có lẽ cũng sẽ nâng cao hiệu suất và tính chính xác của ứng dụng của bạn.

EDIT:
Trong java, bạn có thể sử dụng giao diện ObserverObservable để làm như vậy.

+2

+1. Cách tiếp cận tốt, nhưng nó có thể giúp viết một lời giải thích đơn giản - tùy thuộc vào cách 'noob' OP là gì. – Mikaveli

+1

@Mikaveli: Tôi đã thêm các liên kết vào giao diện Observer và lớp Observable trong java.util, và tôi nghĩ sau khi đọc trang wiki và javadocs cho các lớp này, việc triển khai mẫu này không quá khó. – amit

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