阅读更多 自带的CookieStore只能在内存里边管理cookie,但是有的时候需要把cookie保存到文件里边。

为了长久保存cookie,自定义了BasicCookieStore,当添加cookie的时候,都保存到数据库,初始化的时候再从数据里边恢复cookie。

1、自定义的CookieStore

public class CustomCookieStore extends BasicCookieStore {public CustomCookieStore() {super();try {List cookies = CookieDBManager.getInstance().getAllCookies();CookieDBManager.getInstance().clear();Cookie[] cookiesArr = new Cookie[cookies.size()];for (int i = cookies.size() - 1; i >= 0; i--) {cookiesArr[i] = cookies.get(i);}addCookies(cookiesArr);} catch (Exception e) {e.printStackTrace();}}@Overridepublic synchronized void addCookie(Cookie cookie) {super.addCookie(cookie);try {CookieDBManager.getInstance().saveCookie(cookie);} catch (Exception e) {e.printStackTrace();}}@Overridepublic synchronized void addCookies(Cookie[] cookies) {super.addCookies(cookies);try {CookieDBManager.getInstance().saveCookies(cookies);} catch (Exception e) {e.printStackTrace();}}@Overridepublic synchronized void clear() {super.clear();try {CookieDBManager.getInstance().clear();} catch (Exception e) {e.printStackTrace();}}@Overridepublic synchronized boolean clearExpired(Date date) {try {CookieDBManager.getInstance().clearExpired();} catch (Exception e) {e.printStackTrace();}return super.clearExpired(date);}@Overridepublic synchronized List getCookies() {return super.getCookies();}@Overridepublic String toString() {return super.toString();}}



2、数据库

public class CookieDBManager {private final String DB_NAME = "cookie.db";private final String TABLE_NAME = "cookie";private DBHelper dbHelper;private SQLiteDatabase db;private static CookieDBManager instance;public static CookieDBManager getInstance() {if (instance == null) {instance = new CookieDBManager();}return instance;}public CookieDBManager() {dbHelper = new DBHelper(App.getCurrentApp(), DB_NAME, null, 1);db = dbHelper.getWritableDatabase();}private class DBHelper extends SQLiteOpenHelper {private String SQL_CAREATE_DB = "CREATE TABLE IF NOT EXISTS "//+ TABLE_NAME + " (" + //Column.AUTO_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + //Column.VALUE + " TEXT," + //Column.NAME + " TEXT," + //Column.COMMENT + " TEXT," + //Column.DOMAIN + " TEXT," + //Column.EXPIRY_DATE + " INTEGER," + //Column.PATH + " TEXT," + //Column.SECURE + " INTEGER," + //Column.VERSION + " TEXT)";//public DBHelper(Context context, String name, CursorFactory factory,int version) {super(context, name, factory, version);}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL(SQL_CAREATE_DB);}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);db.execSQL(SQL_CAREATE_DB);}}public List getAllCookies() {List cookies = new ArrayList();Cursor cursor = db.query(TABLE_NAME, null, null, null, null, null, null);for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {String name = cursor.getString(cursor.getColumnIndex(Column.NAME));String value = cursor.getString(cursor.getColumnIndex(Column.VALUE));BasicClientCookie cookie = new BasicClientCookie(name, value);cookie.setComment(cursor.getString(cursor.getColumnIndex(Column.COMMENT)));cookie.setDomain(cursor.getString(cursor.getColumnIndex(Column.DOMAIN)));long expireTime = cursor.getLong(cursor.getColumnIndex(Column.EXPIRY_DATE));if (expireTime != 0) {cookie.setExpiryDate(new Date(expireTime));}cookie.setPath(cursor.getString(cursor.getColumnIndex(Column.PATH)));cookie.setSecure(cursor.getInt(cursor.getColumnIndex(Column.SECURE)) == 1);cookie.setVersion(cursor.getInt(cursor.getColumnIndex(Column.VERSION)));cookies.add(cookie);}cursor.close();return cookies;}public void saveCookie(Cookie cookie) {LogUtil.d("saveCookie:" + cookie);if (cookie == null) {return;}db.delete(TABLE_NAME, Column.NAME + " = ? ",new String[] { cookie.getName() });ContentValues values = new ContentValues();values.put(Column.VALUE, cookie.getValue());values.put(Column.NAME, cookie.getName());values.put(Column.COMMENT, cookie.getComment());values.put(Column.DOMAIN, cookie.getDomain());if (cookie.getExpiryDate() != null) {values.put(Column.EXPIRY_DATE, cookie.getExpiryDate().getTime());}values.put(Column.PATH, cookie.getPath());values.put(Column.SECURE, cookie.isSecure() ? 1 : 0);values.put(Column.VERSION, cookie.getVersion());db.insert(TABLE_NAME, null, values);}public void saveCookies(Cookie[] cookies) {LogUtil.d("saveCookies:" + cookies);if (cookies == null) {return;}db.beginTransaction();for (Cookie cookie : cookies) {saveCookie(cookie);}db.setTransactionSuccessful();db.endTransaction();}public void clear() {db.delete(TABLE_NAME, null, null);}public void clearExpired() {long time = System.currentTimeMillis();db.delete(TABLE_NAME, "EXPIRY_DATE < ? AND EXPIRY_DATE != 0",new String[] { String.valueOf(time) });}private static class Column {public static final String AUTO_ID = "AUTO_ID";public static final String VALUE = "VALUE";public static final String NAME = "NAME";public static final String COMMENT = "COMMENT";public static final String DOMAIN = "DOMAIN";public static final String EXPIRY_DATE = "EXPIRY_DATE";public static final String PATH = "PATH";public static final String SECURE = "SECURE";public static final String VERSION = "VERSION";}}



3、把CookieStore设置到httpclient

httpClient.setCookieStore(new CustomCookieStore());




更多相关文章

  1. android Timber日志打印
  2. Android(安卓)display架构分析四-msm_fb.c 函数和数据结构介绍
  3. Android(安卓)RILD运行机制详解
  4. 【Android(安卓)开发教程】创建数据库辅助类
  5. Android(安卓)Settings 系统设置中 PreferenceActivity点击Heade
  6. android sqlite3使用命令
  7. Android(安卓)开发之SQLite基础
  8. [Android(安卓)Training视频系列] 6.2 Saving Files(保存文件)
  9. Android数据库安全permission

随机推荐

  1. android 开发解密时出现pad block corrup
  2. iOS学习――iOS应用程序生命周期(四)
  3. ContentProvider-1查询
  4. Android(安卓)activity之间传递自定义类
  5. 关于Android中使用Uri监听数据库的变化
  6. Android(安卓)自定义控件之第二讲:TypedAr
  7. android 设计模式之代理模式
  8. Bundle的说明和用法
  9. android中创建XML
  10. Android(安卓)EventBus发布/订阅事件总线