I'm experiencing this problem. I have attached a content observer for
the events URI.

On Jun 10, 8:44 am, Roger <roger.cam...@gmail.com> wrote:
> I haven't found any solution for this problem in the bunch of
> questions and reference I've searched.
>
> So here is.
>
> I'm trying to query the data from the CallLog and insert in DB. For
> that, I've created a COntentObserver as inner class in a Service, and
> inside onChange() method, I call my method that goes to the specified
> URI and query the data that has changed.
>
> But, lets say, I received a call, so the observer was notified. So, my
> method goes to the call log content provider, query and insert, but it
> is inserting two, three times the same register.
>
> And the funny is that I have another service implemented identically
> like this one, but, it doesnt happen.
>
> Here is the code of my service.
>
> public class RatedCallsService extends Service
>
> private Handler handler = new Handler();
>     private SQLiteDatabase db;
>     private OpenHelper helper;
>     private String theDate;
>     private String theMonth_;
>     private String theYear_;
>     private String theDay_;
>     public static boolean servReg = false;
>
>     class RatedCallsContentObserver extends ContentObserver {
>
>             public RatedCallsContentObserver(Handler h) {
>
>                 super(h);
>                 //helper = new OpenHelper(getApplicationContext());
>                 //db = helper.getWritableDatabase();
>
>             }
>
>             @Override
>             public boolean deliverSelfNotifications() {
>
>                 return true;
>
>             }
>
>             @Override
>             public void onChange(boolean selfChange) {
>
>                 super.onChange(selfChange);
>                 Log.i(LOG_TAG, "Inside on Change. selfChange " +
> selfChange);
>                 searchInsert();
>             }
>         }
>
>         @Override
>         public IBinder onBind(Intent arg0) {
>
>             return null;
>
>         }
>
>         @Override
>
>         public void onCreate() {
>             servReg = true;
>             db = DataHandlerDB.createDB(this);
>             registerContentObserver();
>
>         }
>
>         @Override
>         public void onDestroy() {
>
>             super.onDestroy();
>             db.close();
>
> this.getApplicationContext().getContentResolver().unregisterContentObserver 
> (new
> RatedCallsContentObserver(handler));
>
>         }
>
>         private void searchInsert() {
>
>                     Cursor cursor = getContentResolver().query(
>             android.provider.CallLog.Calls.CONTENT_URI, null, null,
> null,
>             android.provider.CallLog.Calls.DATE + " DESC ");
>
>     if (cursor.moveToFirst()) {
>
>         int numberColumnId = cursor
>                 .getColumnIndex(android.provider.CallLog.Calls.NUMBER);
>         int durationId = cursor
>                 .getColumnIndex(android.provider.CallLog.Calls.DURATION);
>         int contactNameId = cursor
>                 .getColumnIndex(android.provider.CallLog.Calls.CACHED_NAME);
>         int numTypeId = cursor
>                 
> .getColumnIndex(android.provider.CallLog.Calls.CACHED_NUMBER_TYPE);
>         int callTypeId = cursor
>                 .getColumnIndex(android.provider.CallLog.Calls.TYPE);
>
>         Date dt = new Date();
>         int hours = dt.getHours();
>         int minutes = dt.getMinutes();
>         int seconds = dt.getSeconds();
>         String currTime = hours + ":" + minutes + ":" + seconds;
>
>         SimpleDateFormat dateFormat = new SimpleDateFormat("M/d/
> yyyy");
>
>         Date date = new Date();
>
>         cursor.moveToFirst();
>
>         String contactNumber = cursor.getString(numberColumnId);
>         String contactName = (null ==
> cursor.getString(contactNameId) ? ""
>                 : cursor.getString(contactNameId));
>         String duration = cursor.getString(durationId);
>         String numType = cursor.getString(numTypeId);
>         String callType = cursor.getString(callTypeId);
>
>         seconds = Integer.parseInt(duration);
>
>         theDate = dateFormat.format(date);
>
>         if (theDate.length() == 9) {
>
>             theMonth_ = theDate.substring(0, 1);
>             theDay_ = theDate.substring(2, 4);
>             theYear_ = theDate.substring(5, 9);
>
>         } else if (theDate.length() == 10) {
>
>             theMonth_ = theDate.substring(0, 2);
>             theDay_ = theDate.substring(3, 4);
>             theYear_ = theDate.substring(6, 10);
>
>         } else if (theDate.length() == 8) {
>
>             theMonth_ = theDate.substring(0, 1);
>             theDay_ = theDate.substring(2, 3);
>             theYear_ = theDate.substring(4, 8);
>
>         }
>
>         ContentValues values = new ContentValues();
>         ContentValues values2 = new ContentValues();
>
>         values.put("contact_id", 1);
>         values.put("contact_name", contactName);
>         values.put("number_type", numType);
>         values.put("contact_number", contactNumber);
>         values.put("duration", Utilities.convertTime(seconds));
>         values.put("date", dateFormat.format(date));
>         values.put("current_time", currTime);
>         values.put("cont", 1);
>         values.put("type", callType);
>
>         values2.put("month",
>                 Utilities.monthName(Integer.parseInt(theMonth_)));
>         values2.put("duration", Utilities.convertTime(seconds));
>         values2.put("year", theYear_);
>         values2.put("month_num", Integer.parseInt(theMonth_));
>
>         if (!db.isOpen()) {
>             db = getApplicationContext()
>                     .openOrCreateDatabase(
>                             "/data/data/com.project.myapp/databases/
> myDb.db",
>                             SQLiteDatabase.OPEN_READWRITE, null);
>         }
>         if (duration != "") {
>             if (Integer.parseInt(duration) != 0) {
>
>                 String existingMonthDuration = DataHandlerDB
>                         .selectMonthsDuration(theMonth_, theYear_,
> this);
>                 Integer newMonthDuration;
>
>                 if (existingMonthDuration != "") {
>
>                     newMonthDuration = Integer
>                             .parseInt(existingMonthDuration)
>                             +
> Integer.parseInt(duration);
>
>                     values2.put("duration",
>                             Utilities.convertTime(newMonthDuration));
>                     db.update(DataHandlerDB.TABLE_NAME_3, values2,
>                             "year = ?", new String[] { theYear_ });
>
>                 } else {
>
>                     db.insert(DataHandlerDB.TABLE_NAME_3, null,
> values2);
>
>                 }
>
>                 db.insert(DataHandlerDB.TABLE_NAME_2, null, values);
>
>             }
>         }
>         cursor.close();
>
>     }
>
>             }
>
>     public void registerContentObserver() {
>
>             this.getApplicationContext()
>                     .getContentResolver()
>                     .registerContentObserver(
>
> android.provider.CallLog.Calls.CONTENT_URI, false,
>                             new RatedCallsContentObserver(handler));
>
>         }
>     }
>
> I've tried everything. unregistering the observer, etc. but nothing.
> Thanks in advance.

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to