package com.smartisanos.sidebar.util; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.os.Handler; import android.os.HandlerThread; import android.os.Looper; import android.os.Message; import android.provider.BaseColumns; import android.util.Log; public class ClearDatabaseHelper extends SQLiteOpenHelper { private static final int DB_VERSION = 1; private static final String TABLE_USELESS = "useless"; private Handler mHandler; private Set<Integer> mSet = new HashSet<Integer>(); private Callback mCallback; private boolean mIsDataSetOk; public ClearDatabaseHelper(Context context, String name, Callback callback) { super(context, name, null, DB_VERSION); mCallback = callback; HandlerThread thread = new HandlerThread(name); thread.start(); mHandler = new DataHandler(thread.getLooper()); mHandler.obtainMessage(MSG_INIT_DATA).sendToTarget(); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE " + TABLE_USELESS+ " ( _id INTEGER PRIMARY KEY AUTOINCREMENT," + "useless_id INTEGER" + ");"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // nothing to do now } private void initData(){ Cursor cursor = null; List<Integer> list = new ArrayList<Integer>(); try { cursor = getReadableDatabase().query(TABLE_USELESS, null, null, null, null, null, null); while (cursor.moveToNext()) { int id = cursor.getInt(cursor.getColumnIndex(UselessColumns.USELESS_ID)); list.add(id); } } catch (Exception e) { e.printStackTrace(); } finally { if (cursor != null) { cursor.close(); } } synchronized(mSet){ mSet.clear(); mSet.addAll(list); } mIsDataSetOk = true; if(mCallback != null){ mCallback.onInitComplete(); } } public boolean isDataSetOk(){ return mIsDataSetOk; } public Set<Integer> getSet(){ Set<Integer> set = new HashSet<Integer>(); synchronized(mSet){ set.addAll(mSet); } return set; } public void addUselessId(List<Integer> list){ List<Integer> local = new ArrayList<Integer>(); synchronized(mSet){ for(Integer value : list){ if(!mSet.contains(value)){ mSet.add(value); local.add(value); } } } mHandler.obtainMessage(MSG_INSERT_DATA, local).sendToTarget(); } private void insertDatabase(List<Integer> list) { SQLiteDatabase db = getWritableDatabase(); db.beginTransaction(); try { for (Integer value : list) { ContentValues cv = new ContentValues(); cv.put(UselessColumns.USELESS_ID, value); db.insert(TABLE_USELESS, null, cv); } db.setTransactionSuccessful(); } catch (Exception e) { e.printStackTrace(); } finally { if (db != null) { db.endTransaction(); db.close(); } } } static class UselessColumns implements BaseColumns{ static final String USELESS_ID = "useless_id"; } private static final int MSG_INSERT_DATA = 0; private static final int MSG_REMOVE_DATA = 1; private static final int MSG_INIT_DATA = 2; private class DataHandler extends Handler { public DataHandler(Looper looper) { super(looper, null, false); } @Override public void handleMessage(Message msg) { switch (msg.what) { case MSG_INSERT_DATA: List<Integer> list = (List<Integer>) msg.obj; insertDatabase(list); break; case MSG_REMOVE_DATA: break; case MSG_INIT_DATA: initData(); break; } } } public interface Callback{ void onInitComplete(); } }