Android SQLiteDatabase 缓存带给用户更好的体验...

 ***************************************************************************************************************************************************************************************

     也许你的主页面的列表信息是登录之后,通过网络加载的,那这样设置会导致用户每次进入主页面有加载的延迟,你可能会说,可以设置进度框,那网络情况不好的时候, 不是会一直在界面打转,"请稍候.."的字样长时间显示,这就会给用户造成不好的体验,那怎么样可以既要实现存储功能,又要不影响用户体验?也许你的应用中使用了同步手机通讯录的功能,那用户在同步并修改联系人之后,退出登录,过段时间,重新登录,想找之前修改的联系人打电话唠会,发现又需要重新同步,并且同步后的联系人也不是之前修改的?。。。诸如此类问题,开发中会遇到很多,那该怎么解决这个问题呢?这样我们就不可避免要用到缓存功能,好,接下来选择存储方式:使用sharePreference,存储数据有点小,不合适,ContentProvider,手机存储比较合适,。。。这时候是不是会想到数据库,Android自带的数据库SQLiteDatabase,感觉差不多,下面我们来试试,看能否满足我们的需求:存储主页面数据信息,以备下次登录避免重新网络请求 

    首先来说一下SQLiteDatabase 是什么?

    SQLiteDatabase 是小型的嵌入式数据库,以文件进行存储。

   在Andrdoid系统中已经集成了该数据库,故在进行Andrdoid程序开发的时候可以很方便的获取该数据库,从而进行增、删、改、查的操作。

    1. SQL语句

       a.建表语句:create table table_name(column_name1, column_type1,column_name2,column_type2,)

       b.插入语句:insert into table_name(column_name1,column_name2,......)values (column_data1,column_data2,......)

       c.更新语句:update table_name set column_name= column_newData where column_name = column_data ;

       d. 删除语句:delete from table_name where column_name = column_data ;

       e.查询语句:select column_name1,column_name2,...from table_name where column_name = column_data ;

       查询所有数据:select * from table_name ;

      f.删除表语句:drop table table_name ;

    2.数据类型

       text  文本型

       integer  整数型

       null   空数据

       double/float/real  小数型

    3. 使用方法

       SQLiteDatabase 对象的创建需要借助辅助类SQLiteOpenHelper

     a.创建SQLiteOpenHelper的子类,添加构造方法,用于指明创建出来的数据库的相关信息

          参数一:上下文

          参数二:指定获取数据库的名字

          参数三:指定创建游标的工厂对象

          参数四:指定数据库的版本号

     b.重写onCreate()和onUpgrade()方法

          当数据库对象被系统创建的时候,系统会调用onCreate()方法,做一些初始化工作,该方法只会在数据库第一次被创建的时                 候才会被系统调用

     c. 创建SQLiteOpenHelper类的对象,传入数据库的信息

     d.借助于辅助类获取数据库对象

      getReadableDatabase()与getWritableDatabase()这两个方法获取的都是可读可写的数据库,仅在手机存储空间不足,Readable方法返回的才是一个只可读的数据库

     e.调用数据库对象的增、删、改、查方法,进行数据的操作

    4.事务回滚

     a. 获取helper对象

     b. 获取数据库对象

     c.开启事务

     d.将事务添加到try...catch...中

     e.标记事务执行成功(如果不调用该方法,事务是不会提交的)

       setTranctionSuccessful()

     f. 在finally中关闭事务

       endTransaction()

     g. 在onDestroy()中关闭数据库

      

database.insert(String table, String nullColumnHack, ContentValues values);  
database.update(String table, Contentvalues values, String whereClause, String whereArgs); 

       第一个参数表示插入数据的数据表的名称,第二个参数表示当values参数为空或者里面没有内容的时候,insert会失败(底层数据

库不允许插入一个空行),为了防止这种情况,要在这里指定一个列名,到时候如果发现将要插入的行为空时,就会将你指定的这个

列明的值设为null,然后在向数据库中插入
   

    第三个参数是ContentValues类型的变量,由K-V形式组成,和Map使用方法类似 ,Key代表要插入的列名,Value代表要插入的值,update方法中的第二个参数,用法与此相同。

    update方法中的第三个参数表示查询条件,比如"where _id=?"、" and _id =? or name =? ",而whereArgs 则表示占位符的实际 

的参数值,通常用String数组形式体现:new String []{ "%"+ name +"%",_id}
    

    查询的话,虽然说查询的方式比较多,但在我看来都是由最简单的衍生出来的,类似于代码解耦性,那其他查询的方法可以自己

查看Android官方文档,下面介绍一种比较简单的:
 

      database.rawQuery(String sql, String[] selectionArgs);

    

将你所需要的查询语句,全部拼到sql中,然后里面用到的参数值,用selectionArgs占位符代替,就可以了,
    
   相对于其他方法来说,不用将各个参数分隔开,使用一条sql语句就可以搞定,缺点就是阅读起来可能不太方便,这个根据习惯自己
决定了。
    第三个参数是ContentValues类型的变量,由K-V形式组成,和Map使用方法类似 ,Key代表要插入的列名,Value代表要插入的值,update方法中的第二个参数,用法与此相同。
    update方法中的第三个参数表示查询条件,比如"where _id=?"、" and _id =? or name =? ",而whereArgs 则表示占位符的实际的参数值,通常用String数组形式体现:new String []{ "%"+ name +"%",_id}
    查询的话,虽然说查询的方式比较多,但在我看来都是由最简单的衍生出来的,类似于代码解耦性,那其他查询的方法可以自己查看Android官方文档,下面介绍一种比较简单的:
     database.rawQuery(String sql, String[] selectionArgs);
    将你所需要的查询语句,全部拼到sql中,然后里面用到的参数值,用selectionArgs占位符代替,就可以了,
    相对于其他方法来说,不用将各个参数分隔开,使用一条sql语句就可以搞定,缺点就是阅读起来可能不太方便,这个根据习惯自己决定了。

     下面新建了一个SQLiteDatabaseDemo项目,一块来看下代码:

      

     先来看主界面:

package com.zhao.sqlitedatabasedemo;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.zhao.sqlitedatabasedemo.adapter.PersonListAdapter;
import com.zhao.sqlitedatabasedemo.db.PersonListHelper;
import com.zhao.sqlitedatabasedemo.utils.NetUtils;

public class MainActivity extends Activity {

	private JSONArray array = null;
	private Activity activity;
	private int currentPage = 1;
	private int pageSize = 10;
	private String key = "";
	private String TAG = "MainActivity";
	private ListView lv_person;
	private PersonListAdapter personListAdapter = null;
	private TextView tv_delete,tv_upate;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		activity = MainActivity.this;

		lv_person = (ListView) findViewById(R.id.lv_person);
		tv_delete = (TextView) findViewById(R.id.tv_delete);
		tv_upate = (TextView) findViewById(R.id.tv_upate);

		setData();

		setListener();
		
		// AppUtil.myLog(TAG);

	}
	
	//设置数据
	public void setData() {
		
		/**
		 * 没有调用网络请求工具类,简单模拟一下啦...
   
   <抱拳>
    
    
		 * 
		 */
		if (!NetUtils.checkNetConnection(activity)) {
			// 无网络
			Toast.makeText(activity, "当前无网络", Toast.LENGTH_LONG);
			array = getData();

			PersonListHelper personListHelper = new PersonListHelper(activity);

			// 保存数据
			personListHelper.savePersonList(array);

			// 查询数据
			array = null;
			array = personListHelper.findPersonList(currentPage, pageSize, key);

			personListAdapter = new PersonListAdapter(activity, array);
			
			lv_person.setAdapter(personListAdapter);

		} else {
		}
		
		
	}

	// 保存数据源
	public JSONArray getData() {

		array = new JSONArray();

		JSONObject obj = null;

		for (int i = 1; i <= 100; i++) {

			obj = new JSONObject();

			try {
				obj.put("name", "用户" + i);
				if (i % 2 == 0) {
					obj.put("sex", 0);
				} else {
					obj.put("sex", 1);
				}
				obj.put("address", "东城区东四北大街" + i + "号");
				if (i % 3 == 0) {
					obj.put("profession", "Android工程师");
				} else if (i % 3 == 1) {
					obj.put("profession", "架构师");
				} else if (i % 3 == 2) {
					obj.put("profession", "全栈工程师");
				}
				array.put(obj);

			} catch (JSONException e) {
				e.printStackTrace();
			}
		}
		return array;

	}
	
	int id = 100 ;
	public void setListener() {
		
		//一定是删除item时,调用的删除方法,这里,只做实现数据库删除功能
		tv_delete.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {

				PersonListHelper personListHelper = new PersonListHelper(activity);

				// 保存数据
				personListHelper.deletePersonId(String.valueOf(id));
				
				id -- ;
				
				array = null;
				array = personListHelper.findPersonList(currentPage, pageSize, key);

				personListAdapter = new PersonListAdapter(activity, array);
				
				lv_person.setAdapter(personListAdapter);
				
			}
		});
		
		
	//更新数据写死了,在项目中,可以从数据源中获取数据
	tv_upate.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {

				PersonListHelper personListHelper = new PersonListHelper(activity);

				// 保存数据
				personListHelper.updatePhone("Mr.zhao", "和平里北街..");
				
				array = null;
				array = personListHelper.findPersonList(currentPage, pageSize, key);

				personListAdapter = new PersonListAdapter(activity, array);
				
				lv_person.setAdapter(personListAdapter);
				
			}
		});
		
		
		
	}

}

   
   
      数据库管理类:
package com.zhao.sqlitedatabasedemo.db;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
 *  
 * @author Mr.zhao
 */
public class MySQLiteOpenHelper extends SQLiteOpenHelper {
	public static final int VERSION = 2;
	//定义数据库名称
	public static final String SQL_NAME = "personInfo.db";
	//定义数据表名称,不存在则创建
	//public String personInfo = "create table if not exists person_info(_id integer primary key autoincrement,name char,sex char,address char,profession char)";
	//这里为了方便测试,就使用每次新建数据表的语句啦
	public String personInfo = "create table person_info(_id integer primary key autoincrement,name char,sex char,address char,profession char)";
	public MySQLiteOpenHelper(Context context) {
		super(context, SQL_NAME, null, VERSION);
	}
	//创建数据表
	@Override
	public void onCreate(SQLiteDatabase db) {
		db.execSQL(personInfo);
	}
	// 更新数据库方法
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

	}
}
      缓存数据管理方法:
package com.zhao.sqlitedatabasedemo.db;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

import com.ken.androidkit.security.CheckUtil;
import com.zhao.sqlitedatabasedemo.utils.AppUtil;

/**
 * 存储工具
 */
public class PersonListHelper {
	private String TAG = "PersonListHelper";
	private MySQLiteOpenHelper openHelper;
	private Context context;

	public PersonListHelper(Context context) {
		openHelper = new MySQLiteOpenHelper(context);
		this.context = context ;
	}

	/**
	 * 保存信息
	 * 
	 * @param jsonObj
	 */
	public void savePersonList(JSONArray jsonObj) {
		SQLiteDatabase database = openHelper.getWritableDatabase();
		ContentValues values = new ContentValues();
		JSONObject obj = null;
		Cursor cursor = null;
		for (int i = 0; i < jsonObj.length(); i++) {
			try {
				obj = jsonObj.getJSONObject(i);
				cursor = database.rawQuery("select * from person_info  where _id=? ", new String []{AppUtil.getJsonString(obj, "id")});
				if(cursor==null || !cursor.moveToNext()){
					values.put("name", AppUtil.getJsonString(obj, "name"));
					values.put("sex", AppUtil.getJsonString(obj, "sex"));
					values.put("address",AppUtil.getJsonString(obj, "address"));
					values.put("profession",AppUtil.getJsonString(obj, "profession"));
					database.insert("person_info", null, values);
				}
			} catch (JSONException e) {
				e.printStackTrace();
			}
		}
		database.close();
	}

	/**
	 * 查询信息 实现分页
	 * 
	 * @return
	 */
	public JSONArray findPersonList(int currentPage,int pageSize,String key) {
		SQLiteDatabase database = openHelper.getWritableDatabase();
		int index = (currentPage-1)*pageSize;
		String sql = "select * from person_info ";
		 
		sql +=" order by _id desc limit ?,?";//第一个占位符代表请求页数,第二个占位符代表请求条数 
		Cursor cursor = null;
		if(!CheckUtil.isNull(key)){
			cursor = database.rawQuery(sql, new String []{ "%"+ key +"%" ,"%"+ key + "%", key,(index)+"",pageSize+""});
		}else{
			cursor = database.rawQuery(sql, new String []{(index)+"",pageSize+""});
		}
		JSONArray jsonObj = new JSONArray();
		while (cursor.moveToNext()) {
			JSONObject obj = new JSONObject();
			try {
				obj.put("name",cursor.getString(cursor.getColumnIndex("name")));
				obj.put("sex", cursor.getString(cursor.getColumnIndex("sex")));
				obj.put("address",	cursor.getString(cursor.getColumnIndex("address")));
				obj.put("profession",	cursor.getString(cursor.getColumnIndex("profession")));
				obj.put("id",	cursor.getString(cursor.getColumnIndex("_id")));
				jsonObj.put(obj);
			} catch (JSONException e) {
				e.printStackTrace();
			}
		}
		cursor.close();
		database.close();
		Log.i(TAG, jsonObj.toString());
		return jsonObj;
	}
	 
		/**
		 * 更新方法  为了更全面的演示更新参数使用,这里只更新第一条,同样可以不指定更新条数
		 * 
		 * @param name  名称
		 * @param address  地址
		 */
		public void updatePhone(String name,String address) {
			SQLiteDatabase database = openHelper.getWritableDatabase();
			ContentValues values = new ContentValues();  
			values.put("name",name);
			values.put("address", address);  
			String whereClause = "_id=?";
			String[] whereArgs = new String[] { String.valueOf(100),};  
			int count = database.update("person_info", values, whereClause, whereArgs); 
			
			if (count == 0) {
				
				database.update("person_info", values, null, null); 
			}
			
			System.out.println(count);
			
		}
		/**
		 * //删除方法
		 * 
		 * @param id
		 */
		public void deletePersonId(String id) {
			SQLiteDatabase database = openHelper.getWritableDatabase();
			String whereClause = "_id=?"; 
			String[] whereArgs = new String[] { String.valueOf(id) };  
			int count = database.delete("person_info", whereClause, whereArgs);
			
			if (count == 0) {
				
				database.delete("person_info", null, null);
			}
			
			System.out.println(count);
			database.close();
		}
		
}
      适配器代码:
package com.zhao.sqlitedatabasedemo.adapter;

import org.json.JSONArray;

import android.app.Activity;
import android.view.View;
import android.view.ViewGroup;

/**
 * 适配器
 * 
 */
public class BaseAdapter extends android.widget.BaseAdapter {
	protected Activity activity;
	protected JSONArray array;

	public void setArray(JSONArray array) {
		this.array = array;
	}
	public BaseAdapter(Activity activity, JSONArray array) {
		this.activity = activity;
		this.array = array;
	}
	@Override
	public int getCount() {
		return array.length();
	}

	@Override
	public Object getItem(int position) {
		return array.opt(position);
	}

	@Override
	public long getItemId(int position) {
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		return null;
	}

}
package com.zhao.sqlitedatabasedemo.adapter;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import com.zhao.sqlitedatabasedemo.R;
import com.zhao.sqlitedatabasedemo.utils.AppUtil;
/**
 * 数据适配器
 * 
 * @author  Mr.zhao
 * 
 */
public class PersonListAdapter extends BaseAdapter {
	private Context context;
	public 	JSONArray array = null;
	public PersonListAdapter(Context context,JSONArray array ) {
		this.context = context;
		this.array = array;
	}
	@Override
	public int getCount() {
		return array.length();
	}
	@Override
	public Object getItem(int position) {
		try {
			return array.getJSONObject(position);
		} catch (JSONException e) {
			e.printStackTrace();
			return null ;
		}
	}
	@Override
	public long getItemId(int position) {
		return position;
	}
	public ViewHolder viewHolder = null;
	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
 		JSONObject obj = null;
		try {
			obj = array.getJSONObject(position);
		} catch (JSONException e) {
			e.printStackTrace();
		}
		if (convertView == null) {
			viewHolder = new ViewHolder();
			convertView = LayoutInflater.from(context).inflate(R.layout.person_list_item, null);
			viewHolder.tv_name = (TextView) convertView.findViewById(R.id.tv_name);
			viewHolder.tv_sex = (TextView) convertView.findViewById(R.id.tv_sex);
			viewHolder.tv_address = (TextView) convertView.findViewById(R.id.tv_address);
			viewHolder.tv_profession = (TextView) convertView.findViewById(R.id.tv_profession);
			convertView.setTag(viewHolder);
		} else {
			viewHolder = (ViewHolder) convertView.getTag();
		}
		
		viewHolder.tv_name.setText(AppUtil.getJsonString(obj, "name"));
		if ("0".equals(AppUtil.getJsonString(obj, "sex"))) {
			viewHolder.tv_sex.setText("男");
		} else {
			viewHolder.tv_sex.setText("女");
		}
		viewHolder.tv_address.setText(AppUtil.getJsonString(obj, "address"));
		viewHolder.tv_profession.setText(AppUtil.getJsonString(obj, "profession"));
		 
		 
		return convertView;
	}
	  public class ViewHolder {
		  private TextView tv_name;    
		  private TextView tv_sex;    
		  private TextView tv_address;    
		  private TextView tv_profession;    
	}
	private static int counter;  
	public static int countStr(String str1, String str2) {  
	      if (str1.indexOf(str2) == -1) {  
	          return 0;  
	      } else if (str1.indexOf(str2) != -1) {  
	          counter++;  
	          countStr(str1.substring(str1.indexOf(str2) +  
	                 str2.length()), str2);  
	             return counter;  
	      }  
	          return 0;  
	}  
}
       主界面文件:

        
        
 
         
         
 
         
         
     
         
         


        
        
       item界面文件:

       
       

       
       

    
        
        

        
         
         

        
         
         
    
        
        

    
        
        

        
         
         

        
         
         
    
        
        


       
       
       顺便把工具类也贴出来:
package com.zhao.sqlitedatabasedemo.utils;

import java.io.File;
import java.math.BigDecimal;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningServiceInfo;
import android.app.Fragment;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Environment;
import android.util.Log;
import android.util.SparseArray;

import com.ken.androidkit.security.CheckUtil;

/**
 * 常用工具
 * 
 */
public class AppUtil {
	private static final String LOG_TAG = "AppUtil";
	
	private static String SDCARD = "";
	 public static String getSDCARD(Context context) { 
		 if (sdCardExist()) {
			 SDCARD = Environment.getExternalStorageDirectory() + "/haodun/";
		}else {
			SDCARD = context.getCacheDir().getAbsolutePath();
		}
		return SDCARD;
	}
	  
	 public static boolean sdCardExist(){
		 boolean sdCardExist = Environment.getExternalStorageState() 
				 .equals(android.os.Environment.MEDIA_MOUNTED); //判断sd卡是否存在
		 return sdCardExist;
	 }
	/**
	 * 记录日志
	 * 
	 * @param log
	 */
	public static void myLog(String log) {
		if (log == null) {
			return;
		}
		Log.v("haodun", log);
	}
	
	public static void myLoge(String log){
		if (log == null) {
			return;
		}
		Log.e("haodun", log);
	}

	/**
	 * 生成给定位数的随机数字串
	 * 
	 * @param number
	 *            位数
	 * @return
	 */
	public static String randomNumberString(int number) {
		if (number < 1)
			return null;
		String sample = "1234567890";
		Random random = new Random();
		char str[] = sample.toCharArray();
		char ch[] = new char[number];
		for (int i = 0; i < number; i++)
			ch[i] = str[random.nextInt(sample.length())];
		return new String(ch);
	}

	/**
	 * MD5摘要
	 * 
	 * @param src
	 * @return
	 */
	public static String md5Digest(String src) {
		if (src == null) return "";
		String rst = "";
		try {
			MessageDigest md = MessageDigest.getInstance("md5");
			md.update(src.getBytes());
			byte[] dig = md.digest();
			StringBuffer sb = new StringBuffer();
			for (int i = 0; i < dig.length; i++) {
				int digByte = dig[i] & 0xFF;
				if (digByte <= 0x0F) sb.append("0");
				sb.append(Integer.toHexString(digByte));
			}
			rst = sb.toString();
		} catch (NoSuchAlgorithmException e) {
			rst = src;
		}
		return rst;
	}

	public static double parseDouble(String v) {
		if (CheckUtil.isNull(v) || !CheckUtil.isNum(v)) {
			return -1;
		}
		return Double.parseDouble(v);
	}
	/**
	 * string转date
	 * 
	 * @param dateStr
	 * @param partten 格式
	 * @return
	 */
	public static Date parseDateString(String dateStr, String partten) {
		SimpleDateFormat sdf = new SimpleDateFormat(partten, Locale.CHINA);
		Date date = null;
		try {
			date = sdf.parse(dateStr);
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}
		return date;
	}

	/**
	 * data 转 string
	 * 
	 * @param date
	 * @param partten 格式
	 * @return
	 */
	public static String parseStringDate(Date date, String partten) {
		SimpleDateFormat sdf = new SimpleDateFormat(partten, Locale.CHINA);
		return sdf.format(date);
	}
	
	
	public static JSONObject getJson(String key, Object value){
		return getJson(new String[]{key}, new Object[]{value});
	}
	
	public static JSONObject getJson(String[] keys, Object... values){
		JSONObject json = new JSONObject();
		try {
			for (int i = 0; i < keys.length; i++) {
				json.put(keys[i], values[i]);
			}
		} catch (Exception e) {
			AppUtil.myLoge(LOG_TAG + e.toString());
		}
		return json;
	}
	
	public static JSONObject editJson(JSONObject json, String key, Object value) {
		try {
			if (null != json)
				json.put(key, value);
		} catch (Exception e) {
		}
		return json;
	}
	
	public static JSONObject editJsons(JSONArray jsons, JSONObject json) {
		try {
			if (null != json) jsons.put(json);
		} catch (Exception e) {
		}
		return json;
	}
	
	public static JSONObject getJsonFromArray(JSONArray array, int length){
		JSONObject json = new JSONObject();
		try {
			json = array.getJSONObject(length);
		} catch (Exception e) {
			AppUtil.myLoge(LOG_TAG + e.toString());
		}
		return json;
	}

	public static int getJsonInt(JSONObject json, String keyName) {
		try {
			if (json==null) {
				return -1;
			}
			return json.getInt(keyName);
		} catch (JSONException e) {
			myLog(e.getMessage());
			return -1;
		}
	}

	public static long getJsonLong(JSONObject json, String keyName) {
		try {
			if (json==null) {
				return -1;
			}
			return json.getLong(keyName);
		} catch (JSONException e) {
			myLog(e.getMessage());
			return -1;
		}
	}

	public static String getJsonString(JSONObject json, String keyName) {
		try {
			if (json==null) {
				return "";
			}
			String s = json.getString(keyName);
			return (s == null || s.equals("") || s.equals("null")) ? "" : s;
		} catch (JSONException e) {
			myLog(e.getMessage());
			return "";
		}
	}

	public static boolean getJsonBool(JSONObject json, String keyName) {
		try {
			return json.getBoolean(keyName);
		} catch (JSONException e) {
			myLog(e.getMessage());
			return false;
		}
	}

	public static double getJsonDouble(JSONObject json, String keyName) {
		try {
			return json.getDouble(keyName);
		} catch (JSONException e) {
			myLog(e.getMessage());
			return -1;
		}
	}

	public static JSONObject getJsonObject(JSONObject json, String keyName) {
		try {
			return json.getJSONObject(keyName);
		} catch (JSONException e) {
			myLog(e.getMessage());
			return new JSONObject();
		}
	}
	
	public static JSONObject getJsonObject(JSONArray array, int i) {
		try {
			return array.getJSONObject(i);
		} catch (JSONException e) {
			myLog(e.getMessage());
			return new JSONObject();
		}
	}

	public static JSONObject fromString(String val) {
		if (val == null) return null;
		try {
			return new JSONObject(val);
		} catch (JSONException e) {
			myLog(e.getMessage());
			return null;
		}
	}

	public static JSONArray arrayfromString(String val) {
		if (val == null) return null;
		try {
			return new JSONArray(val);
		} catch (JSONException e) {
			myLog(e.getMessage());
			return new JSONArray();
		}
	}
	/**
	 * String转json (取非空json)
	 * 
	 * @param val
	 * @return
	 */
	public static JSONObject fromStringNotNull(String val) {
		if (val == null)
			return new JSONObject();
		try {
			return new JSONObject(val);
		} catch (JSONException e) {
			myLog(e.getMessage());
			return new JSONObject();
		}
	}

	public static JSONArray getJsonArray(JSONObject json, String keyName) {
		try {
			return json.getJSONArray(keyName);
		} catch (JSONException e) {
			myLog(e.getMessage());
			return new JSONArray();
		}
	}

	public static Object getObject(JSONObject json, String keyName) {
		try {
			return json.get(keyName);
		} catch (JSONException e) {
			myLog(e.getMessage());
			return new JSONObject();
		}
	}

	public static SparseArray
        
        
         
          jsonArrayToSpArray(JSONArray jarray){
		SparseArray
         
         
          
           ret = new SparseArray
          
          
           
           ();
		if (jarray != null && jarray.length() > 0) {
			for (int i = 0; i < jarray.length(); i++) {
				ret.append(i, jarray.optJSONObject(i));
			}
		}
		return ret;
	}


	/***
	 * 检查传入时间是否在今天之前
	 * 
	 * @param myString
	 * @param formatstr
	 * @return
	 */
	public static boolean checkDate(String myString, String formatstr) {
		java.util.Date nowdate = new java.util.Date();
		SimpleDateFormat sdf = new SimpleDateFormat(formatstr, Locale.CHINA);
		String Ndate = sdf.format(nowdate);
		java.util.Date d = null;
		java.util.Date dd = null;
		try {
			d = sdf.parse(myString);
			dd = sdf.parse(Ndate);
		} catch (ParseException e) {
			e.printStackTrace();
		} 
		return d.after(dd);
	}

	/**
	 * 比较date1是否在date2之后
	 * 
	 * @param date1
	 * @param date2
	 * @param formatstr
	 * @return
	 */
	public static boolean checkDate(String date1, String date2, String formatstr) {
		SimpleDateFormat sdf = new SimpleDateFormat(formatstr, Locale.CHINA);
		java.util.Date d1 = null;
		java.util.Date d2 = null;
		try {
			d1 = sdf.parse(date1);
			d2 = sdf.parse(date2);
		} catch (ParseException e) {
			e.printStackTrace();
		} 
		return d1.after(d2);
	}

	/**
	 * 检测文件是否存在
	 * 
	 * @param name
	 * @return 存在返回 true, 否则返回false
	 */
	public static boolean checkFile(String name, String path) {
		File file = new File(SDCARD + path);
		if (!file.exists()) {
			file.mkdirs();
			return false;
		}
		File listfFile[] = file.listFiles();
		if (listfFile == null) return false;
		for (File f : listfFile) {
			int index = f.getName().lastIndexOf(".");// 根据.分割文件
			if (index > 0) {
				if (f.getName().substring(0, index).trim().equals(name.trim())) {
					return true;
				}
			}
			int j = f.getPath().lastIndexOf("/");// 根据/翻个文件
			if (f.getPath().substring(j).equals(name)) {
				return true;
			}
		}
		return false;
	}

 
	/**
	 * 删除目录下文件
	 * 
	 * @param filePath
	 * @return
	 */
	public static boolean deleteFile(String filePath) {
		File file = new File(filePath);
		File listfFile[] = file.listFiles();
		if (listfFile == null) return false;
		for (File f : listfFile) {
			File tFile = new File(filePath + "/" + f.getName());
			if (tFile.exists()) tFile.delete();
		}
		return true;
	}

	/**
	 * 删除某个文件
	 * 
	 * @param filePath
	 * @return
	 */
	public static void deleteF(String filePath) {
		File tFile = new File(filePath);
		if (tFile.exists()) tFile.delete();
	}



	/**
	 * 日期转化字符串
	 * 
	 * @param date
	 * @return
	 */
	public static String dateToString(Date date, String form) {
		SimpleDateFormat format = new SimpleDateFormat(form, Locale.CHINA);
		return format.format(date);
	}

	/**
	 * 字符串转化日期
	 * 
	 * @param date
	 * @return
	 */
	public static Date StringToDate(String str, String form) {
		Date date = null;
		SimpleDateFormat format = new SimpleDateFormat(form, Locale.CHINA);
		try {
			date = format.parse(str);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return date;
	}

	/***
	 * 时间格式转换
	 * 
	 * @param str 时间字符串
	 * @param fmt 原格式
	 * @param tofmt 要转换的格式
	 * @return
	 */
	public static String dateStrFormat(String str, String fmt, String tofmt) {
		if (str == null || str.length() <= 0) {
			return "";
		}
		SimpleDateFormat format = new SimpleDateFormat(fmt, Locale.CHINA);
		SimpleDateFormat toformat = new SimpleDateFormat(tofmt, Locale.CHINA);
		Date date = null;
		try {
			date = format.parse(str);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return toformat.format(date);
	}



	/**
	 * 获取今天后n天日期
	 * 
	 * @param n
	 * @return
	 */
	public static Date getUnDate(int n) {
		Calendar calendar = Calendar.getInstance();
		int y = calendar.get(Calendar.YEAR);
		int m = calendar.get(Calendar.MONTH);
		int d = calendar.get(Calendar.DAY_OF_MONTH) + n;
		calendar.set(Calendar.YEAR, y);
		calendar.set(Calendar.MONTH, m);
		calendar.set(Calendar.DAY_OF_MONTH, d);
		return calendar.getTime();
	}
/**
 * 获取距离生日天
 * @param day
 * @param format
 * return 0//今天生日,1七天内生日
 */
	public static int getBrithday(String bday,String format) {
		int i=-1;
		if (bday!=null && bday.length()>8) { 
			Calendar birthDay = Calendar.getInstance();
			birthDay.setTime(StringToDate(bday, format));
			int month = birthDay.get(Calendar.MONTH);
			int day=birthDay.get(Calendar.DAY_OF_MONTH); 
			Calendar today = Calendar.getInstance();
			int curYear = today.get(Calendar.YEAR);
			int curMonth = today.get(Calendar.MONTH);
			int cruDay=today.get(Calendar.DAY_OF_MONTH);
			today.clear();
			today.set(curYear, curMonth, cruDay); 
			Calendar thisBirthDay = Calendar.getInstance();
			thisBirthDay.clear();
			thisBirthDay.set(curYear, month, day);
			int yearDay=365;
			if (curYear%4==0) {
				yearDay=366;
			}
			long d= Math.abs((thisBirthDay.getTimeInMillis()-today.getTimeInMillis())/1000/3600/24);
			if (d==0) {//今天生日
				i=0;
			}else if ((d<=7 && d>0) || ((yearDay-d)<=7 && (yearDay-d)>0)) {//七天内生日
				i=1;
			}else if (d>100 && d<260) {//清除数据时
				i=2;
			}
		} 
		return i;
	}
	/**
	 * 计算两个时间间隔
	 * 返回毫秒
	 * @return
	 */
	public static long doubleTimeSpace(Date starTime, String endTime,String format) {
		Date endDate = StringToDate(endTime, format);
		long td = starTime.getTime();
		long ed = endDate.getTime();
		long e = 0;
		if (ed > td) {
			e = ed - td;
		} 
		return e;
	}
	
	/**
	 * 		//将毫秒数换算成x天x时x分x秒x毫秒
	 * @param ms
	 * @return
	 */
	public static String formatToDHms(long ms) {
		int ss = 1000;
		int mi = ss * 60;
		int hh = mi * 60;
		int dd = hh * 24;
		long day = ms / dd;
		long hour = (ms - day * dd) / hh;
		long minute = (ms - day * dd - hour * hh) / mi;
		long second = (ms - day * dd - hour * hh - minute * mi) / ss;
		//long milliSecond = ms - day * dd - hour * hh - minute * mi - second * ss;
		String strDay = day < 10 ? "0" + day : "" + day;
		String strHour = hour < 10 ? "0" + hour : "" + hour;
		String strMinute = minute < 10 ? "0" + minute : "" + minute;
		String strSecond = second < 10 ? "0" + second : "" + second;
		//String strMilliSecond = milliSecond < 10 ? "0" + milliSecond : "" + milliSecond;
		//strMilliSecond = milliSecond < 100 ? "0" + strMilliSecond : "" + strMilliSecond;
		
		StringBuffer sBuffer=new StringBuffer(); 
		if (day>0) {
			sBuffer.append(strDay + "天 ");
		}
		if (hour>0) {
			 sBuffer.append(strHour + ":");  
		} 
		 sBuffer.append( strMinute + ":" ); 
		 sBuffer.append( strSecond);  
		return sBuffer.toString();//+ " " + strMilliSecond; 
     }
 
	/**
	 * 是否需要更新apk
	 * @param activity
	 * @param version 版本号
	 * @return true:需要更新 false反之
	 */
	public static boolean isInstallVersionApk(Activity activity, String version) {
		try {
			PackageInfo packInfo = activity.getPackageManager().getPackageInfo(activity.getPackageName(), 0);
			if (null != packInfo) {
				String versionName = packInfo.versionName;
				//versionName 给用户看的版本号
				//String versionName = String.valueOf(packInfo.versionName);
				if(!versionName.equals(version)){
					return true;
				}
					
			}
		} catch (NameNotFoundException e){
			AppUtil.myLoge("" + e.toString());
		}
		return false;
	}

	/**
	 * 加载class
	 * 
	 * @param className
	 * @return
	 */
	public static Class
           
            formName(String className) {
		try {
			return Class.forName(className);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			return null;
		}
	}
	
/**
 *  业务入口
 */ 
	public static Fragment getClass(String entranceAdd) {
		Fragment clazz = null;
		if (entranceAdd.indexOf("?") != -1) {
			entranceAdd = entranceAdd.substring(0, entranceAdd.indexOf("?"));
		}
		 
		
			 
		return clazz;
	}

	// 分解参数
	public static void splitParas(String entranceAddStr, JSONObject paras) {
		String[] array = entranceAddStr.split("=");
		if (array != null && array.length == 2) {
			try {
				paras.put(array[0], array[1]);
			} catch (JSONException e) {
				AppUtil.myLoge(LOG_TAG + e.toString());
			}
		}
	}
	
	// 
	public static List
           
           
            
             splitString2Array(String sourceStr, String splitChar) {
		List
            
            
              list = new ArrayList 
             
               (); try { String[] array = sourceStr.split(splitChar); for(String s : array){ if (!CheckUtil.isNull(s)) { list.add(s); } } } catch (Exception e) { AppUtil.myLoge(LOG_TAG + e.toString()); } return list; } // 分解url(参数格式Activity?classId=x&name=y) public static SplitResult splitUrl(String entranceAddStr) { SplitResult splitResult = null; if (entranceAddStr == null) return splitResult; if (entranceAddStr.indexOf("?") > 0) { splitResult = new SplitResult(); JSONObject paras = new JSONObject(); splitResult.setActivityName(entranceAddStr.substring(0, entranceAddStr.indexOf("?"))); // 如果有多个参数 entranceAddStr = entranceAddStr.substring(entranceAddStr .indexOf("?") + 1); if (entranceAddStr.indexOf("&") > 0) { String[] array = entranceAddStr.split("&"); if (array != null && array.length > 0) { for (String str : array) { if (str.indexOf("=") > 0) splitParas(str, paras); } } } else { if (entranceAddStr.indexOf("=") > 0) splitParas(entranceAddStr, paras); } splitResult.setParas(paras); } return splitResult; } public static class SplitResult { private String activityName; private JSONObject paras; public String getActivityName() { return activityName; } public void setActivityName(String activityName) { this.activityName = activityName; } public JSONObject getParas() { return paras; } public void setParas(JSONObject paras) { this.paras = paras; } } /** * 检查service是否运行 * @param context * @param classNname * @return */ public static boolean isServiceRunning(Context context,String classNname) { List 
              
                list =getRunService(context); for (RunningServiceInfo service : list) { //System.out.println(service.service.getClassName()); if (classNname.equals(service.service.getClassName())) { return true; } } return false; } public static List 
               
                 getRunService(Context context){ ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); return manager.getRunningServices(Integer.MAX_VALUE); } /** * 获取最大值,(制图时使用) * @param arr * @return */ public static double getDoubleMax(double[] arr) { double max = arr[0]; for(int x=1; x 
                
                  max) max = arr[x]; } return max; } /** * 获取最小值,(制图时使用) * @param arr * @return */ public static double getDoubleMin(double[] arr) { int min = 0; for(int x=1; x 
                 
                   =1&&between_days<=7){ Date date2 = sdf.parse(time); callTime=getWeekOfDate(date2); }else{ callTime=time.substring(5, 10); callTime=callTime.replace("-", "月"); callTime=callTime.concat("日"); } return callTime; } public static String getSmsTime(String time) throws ParseException{ SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); Calendar cal = Calendar.getInstance(); cal.setTime(sdf.parse(time)); long time1 = cal.getTimeInMillis(); Date date=new Date(); DateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String nowTime=format.format(date); cal.setTime(sdf.parse(nowTime)); long time2 = cal.getTimeInMillis(); long between_days=(time2-time1)/(1000*3600*24); String callTime=""; if(between_days<1){ String minute=time.substring(11, time.length()-3); callTime="今天"+" "+minute; }else if(between_days>=1&&between_days<=7){ String minute=time.substring(11, time.length()-3); Date date2 = sdf.parse(time); callTime=getWeekOfDate(date2)+" "+minute; }else{ String minute=time.substring(11, time.length()-3); callTime=time.substring(2, 10).replace("-", "/"); callTime=callTime+" "+minute; } return callTime; } public static boolean checkEmail(String email){ boolean flag = false; try{ String check = "^([a-z0-9A-Z]+[-|_|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$"; Pattern regex = Pattern.compile(check); Matcher matcher = regex.matcher(email); flag = matcher.matches(); }catch(Exception e){ flag = false; } return flag; } public static boolean isNumeric(String str){ for (int i = str.length();--i>=0;){ if (!Character.isDigit(str.charAt(i))){ return false; } } return true; } } 
                  
                 
                
               
              
            
           
           
          
          
         
         
        
        
package com.zhao.sqlitedatabasedemo.utils;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;

/**
 * 网络连接工具类
 * 
 */
public class NetUtils {

	/**
	 * 打开网络设置界面
	 */
	public static void openSetting(Activity activity) {
		Intent intent = new Intent("/");
		ComponentName cm = new ComponentName("com.android.settings",
				"com.android.settings.WirelessSettings");
		intent.setComponent(cm);
		intent.setAction("android.intent.action.VIEW");
		activity.startActivityForResult(intent, 0);
	}

	/**
	 * 检查wifi是否可用
	 * 
	 * @param context
	 * @return
	 */
	public static boolean isWifiConnection(Context context) {
		ConnectivityManager connectivityManager = (ConnectivityManager) context
				.getSystemService(Context.CONNECTIVITY_SERVICE);
		NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
		if (activeNetInfo != null
				&& activeNetInfo.getType() == ConnectivityManager.TYPE_WIFI) {
			return true;
		}
		return false;
	}

	/**
	 * 检查mobile是否可用
	 * 
	 * @param context
	 * @return
	 */
	public static boolean isMobileConnection(Context context) {
		ConnectivityManager manager = (ConnectivityManager) context
				.getSystemService(Context.CONNECTIVITY_SERVICE);
		NetworkInfo networkInfo = manager
				.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
		if (networkInfo != null) {
			return networkInfo.isConnected();
		}
		return false;
	}

	/**
	 * 检查是否有网络
	 * 
	 * @param context
	 * @return
	 */
	public static boolean checkNetConnection(Context context) {
		ConnectivityManager connectivity = (ConnectivityManager) context
				.getSystemService(Context.CONNECTIVITY_SERVICE);
		NetworkInfo activeNetInfo = connectivity.getActiveNetworkInfo();
		if (activeNetInfo != null && activeNetInfo.isConnected()) {
			if (activeNetInfo.getState() == NetworkInfo.State.CONNECTED) {
				return true;
			}
		}
		return false;
	}
}
	 
      再来看一下效果图:
      进入应用,无网络获取数据:
      
 

     更新用户名和地址:

      

   
           
删除缓存信息:

           

           可以了,完成这个功能,当手机没有网络时,也可以让满足用户的视觉体验啦!


****************************************************************************************************************************************************************************************

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值