/**
* Copyright (c) 2013-2014, Rinc Liu (http://rincliu.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.rincliu.library.common.persistence.db;
import java.lang.ref.WeakReference;
import java.util.HashMap;
import java.util.HashSet;
import android.content.ContentValues;
import android.content.Context;
import android.database.ContentObserver;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public abstract class RLDBHelper extends SQLiteOpenHelper {
private final HashMap<String, HashSet<WeakReference<ContentObserver>>> observers = new HashMap<String, HashSet<WeakReference<ContentObserver>>>();
/**
* [constructor]
*
* @param context
* @param dbName
* @param dbVersion
*/
public RLDBHelper(Context context, String dbName, int dbVersion) {
super(context, dbName, null, dbVersion);
}
/**
* [description]
*
* @param table
* @param observer
* @see []
*/
protected void registerContentObserver(String table, ContentObserver observer) {
try {
HashSet<WeakReference<ContentObserver>> set = observers.get(table);
if (set == null) {
set = new HashSet<WeakReference<ContentObserver>>();
observers.put(table, set);
}
set.add(new WeakReference<ContentObserver>(observer));
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* [description]
*
* @param observer
* @see []
*/
public void unregisterContentObserver(ContentObserver observer) {
try {
HashSet<WeakReference<ContentObserver>> trashSet = new HashSet<WeakReference<ContentObserver>>();
for (HashSet<WeakReference<ContentObserver>> set : observers.values()) {
for (WeakReference<ContentObserver> reference : set) {
if (reference.get() != null) {
if (reference.get() == observer) {
trashSet.add(reference);
}
} else {
trashSet.add(reference);
}
}
for (WeakReference<ContentObserver> reference : trashSet) {
set.remove(reference);
}
trashSet.clear();
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void dispatchChange(String table) {
try {
HashSet<WeakReference<ContentObserver>> set = observers.get(table);
if (set != null) {
HashSet<WeakReference<ContentObserver>> trashSet = new HashSet<WeakReference<ContentObserver>>();
for (WeakReference<ContentObserver> reference : set) {
if (reference.get() != null) {
reference.get().dispatchChange(true);
} else {
trashSet.add(reference);
}
}
for (WeakReference<ContentObserver> reference : trashSet) {
set.remove(reference);
}
trashSet.clear();
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* [description]
*
* @param db
* @param table
* @param values
* @return
* @see []
*/
protected boolean doInsert(SQLiteDatabase db, String table, ContentValues values) {
long id = db.insert(table, null, values);
if (id != -1) {
dispatchChange(table);
return true;
}
return false;
}
/**
* [description]
*
* @param db
* @param table
* @param whereClause
* @param whereArgs
* @return
* @see []
*/
protected boolean doDelete(SQLiteDatabase db, String table, String whereClause, String[] whereArgs) {
int count = db.delete(table, whereClause, whereArgs);
if (count > 0) {
dispatchChange(table);
return true;
}
return false;
}
/**
* [description]
*
* @param db
* @param table
* @param values
* @param whereClause
* @param whereArgs
* @return
* @see []
*/
protected boolean doUpdate(SQLiteDatabase db, String table, ContentValues values, String whereClause,
String[] whereArgs) {
int count = db.update(table, values, whereClause, whereArgs);
if (count > 0) {
dispatchChange(table);
return true;
}
return false;
}
}