Я получаю контакты из CallLog и вставляю их в базу данных, используя Сервис с ContentObserver.Итак, ContentObserver продолжает следить за тем, происходят ли какие-то новые изменения в CallLog, и если да, внутри метода onChange () он вызывает метод, который получает данные в CallLog и вставляет их в базу данных.
Но,проблема заключается в том, что, если я сделаю новый вызов, есть одна новая информация, поэтому она должна быть вставлена в базу данных, только одна новая строка, но она вставляет 3 строки.Я не знаю почему.Я тестировал его на Android 2.3 Emulator и на эмуляторе все нормально, но на реальном устройстве 2.3 это происходит.И в эмуляторе 2.1 это тоже происходит.
Так вот мой код.Сервис размещен.Спасибо!
Вот служба MyApplicationService.java
public class MyApplicationService extends Service {
private Handler handler = new Handler();
private SQLiteDatabase db;
private OpenHelper helper;
class MyApplicationContentObserver extends ContentObserver {
public MyApplicationContentObserver(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);
searchInsert();
}
}
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onCreate() {
db = DataHandlerDB.createDB(this);
registerContentObservers();
}
@Override
public void onDestroy() {
db.close();
}
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);
ContentValues values = 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", duration);
values.put("date", dateFormat.format(date));
values.put("current_time", currTime);
values.put("cont", 1);
values.put("type", callType);
if (!db.isOpen()) {
db = getApplicationContext()
.openOrCreateDatabase(
"/data/data/com.myapp.app/databases/my_database.db",
SQLiteDatabase.OPEN_READWRITE, null);
}
db.insert(DataHandlerDB.TABLE_NAME_2, null, values);
cursor.close();
}
}
public void registerContentObservers() {
this.getApplicationContext()
.getContentResolver()
.registerContentObserver(
android.provider.CallLog.Calls.CONTENT_URI, true,
new MyApplicationContentObserver(handler));
}
}