今天给大家带来的文章为通过Gson解析json数据并快速保存至数据库的文章。我们要保存是json对象数组,本文中的json数组并非从后台获取,为了演示,直接手动构造。
需要保存到数据库的是手机的品牌和型号。所以,我们需要新建一个bean实体类去保存我们的型号和品牌。在这,我先介绍2个工具,一个是Google官方的Gson解析jar包。
名为Gson.jar,这个百度下载就可以了。另外一个是序列化插件Parcelable。在setting---->>>>plugin----->搜索Parcelable。
好了,下面新建我们的bean,取名DeviceModelBean.java。添加属性后,右键选择Generate--->>>Parcelable,然后快速直接序列化,对bean我们最好养成习惯,先序列化。
package com.mero.wyt_register.bean; import android.os.Parcel; import android.os.Parcelable; /** * Created by chenlei on 2016/10/28. */ public class DeviceModelBean implements Parcelable { public String getBrand() { return brand; } public void setBrand(String brand) { this.brand = brand; } public String getModel() { return model; } public void setModel(String model) { this.model = model; } public String model;//型号 public String brand;//品牌 @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(this.model); dest.writeString(this.brand); } protected DeviceModelBean(Parcel in) { this.model = in.readString(); this.brand = in.readString(); } public static final Parcelable.Creator<DeviceModelBean> CREATOR = new Parcelable.Creator<DeviceModelBean>() { @Override public DeviceModelBean createFromParcel(Parcel source) { return new DeviceModelBean(source); } @Override public DeviceModelBean[] newArray(int size) { return new DeviceModelBean[size]; } }; }
接下来,再看看我们的json字符串的内容。这个字符串是我按照预期目的而构造的。
json字符串内容如下:
String jsonString = "[{\"brand\":\"华为\",\"model\":\"c8818\"},{\"brand\":\"华为\",\"model\":\"Y635\"}," + "{\"brand\":\"华为\",\"model\":\"Y635-CL00\"},{\"brand\":\"华为\",\"model\":\"P8 Lite\"},{\"brand\":\"华为\",\"model\":\"荣耀X2\"}," + "{\"brand\":\"华为\",\"model\":\"荣耀Hol-T00\"},{\"brand\":\"华为\",\"model\":\"荣耀3X畅玩版\"}," + "{\"brand\":\"华为\",\"model\":\"荣耀6\"},{\"brand\":\"华为\",\"model\":\"荣耀4C\"},{\"brand\":\"华为\",\"model\":\"荣耀X3升级版\"}," + "{\"brand\":\"华为\",\"model\":\"C8816\"},{\"brand\":\"华为\",\"model\":\"C8816D\"},{\"brand\":\"华为\",\"model\":\"Mate 7\"},{\"brand\":\"华为\",\"model\":\"荣耀畅玩4C\"}," + "{\"brand\":\"华为\",\"model\":\"荣耀7\"},{\"brand\":\"华为\",\"model\":\"荣耀畅玩4C\"},{\"brand\":\"华为\",\"model\":\"荣耀7\"},{\"brand\":\"华为\",\"model\":\"荣耀4A\"}," + "{\"brand\":\"华为\",\"model\":\"P8\"},{\"brand\":\"华为\",\"model\":\"C2900\"},{\"brand\":\"华为\",\"model\":\"Y320\"}," + "{\"brand\":\"华为\",\"model\":\"C8815\"},{\"brand\":\"华为\",\"model\":\"Mate\"},{\"brand\":\"华为\",\"model\":\"Y600\"}," + "{\"brand\":\"华为\",\"model\":\"荣耀6 Plus\"},{\"brand\":\"华为\",\"model\":\"C8817L\"},{\"brand\":\"华为\",\"model\":\"G5000\"}," + "{\"brand\":\"华为\",\"model\":\"C8817E\"},{\"brand:\":\"华为\",\"model\":\"荣耀6X\"},{\"brand\":\"华为\",\"model\":\"P8 Lite\"}," + "{\"brand\":\"华为\",\"model\":\"Ascend P8\"},{\"brand\":\"华为\",\"model\":\"荣耀畅玩4X\"},{\"brand\":\"华为\",\"model\":\"G629\"},{\"brand\":\"华为\",\"model\":\"G620\"},{\"brand\":\"华为\",\"model\":\"荣耀X2\"}," + "{\"brand\":\"华为\",\"model\":\"荣耀3C\"},{\"brand\":\"华为\",\"model\":\"荣耀6 Plus\"},{\"brand\":\"华为\",\"model\":\"C2800\"},{\"brand\":\"华为\",\"model\":\"2601\"},{\"brand\":\"华为\",\"model\":\"G610S\"}," + "{\"brand\":\"华为\",\"model\":\"Ascend G302D\"},{\"brand\":\"华为\",\"model\":\"Ascend G6\"},{\"brand\":\"华为\",\"model\":\"Ascend G6\"},{\"brand\":\"华为\",\"model\":\"T8950N\"}," + "{\"brand\":\"华为\",\"model\":\"G610\"},{\"brand\":\"华为\",\"model\":\"C8813DQ\"},{\"brand\":\"华为\",\"model\":\"Y618\"},{\"brand\":\"华为\",\"model\":\"G630\"}," + "{\"brand\":\"华为\",\"model\":\"G521\"},{\"brand\":\"华为\",\"model\":\"荣耀畅玩4\"}]";
接下来,咱们就需要把这些属性全部设置到对象数组里去。
java.lang.reflect.Type type = new TypeToken<List<DeviceModelBean>>(){}.getType(); Gson gson = new Gson(); listDeviceModel = gson.fromJson(jsonString,type);上面三行就可以将我们的json数组设置到List<DeviceModelBean>数组里去。在这里说明一下上面的用法,Gson可以通过toJson和fromJson方法分别把对象拆分成json数组和把json数组设置到对象集合中。Type是个接口,位于java.lang.reflect包下。formJson通过传入json字符串数组和type的接口对象从而设置到对象中去。
接下来,我们应该编写数据库帮助类和dao来完成数据库的操作。首先,我们先建立一个数据库帮助类DbHelper.java。
public class DbHelper extends SQLiteOpenHelper { private Context context; private static final String dbName = "bbzs.db"; public DbHelper(Context context){ super(context,dbName,null,1); this.context = context; } //创建表 @Override public void onCreate(SQLiteDatabase db) { String sql1 = "create table if not exists device_model_info(id integer primary key AUTOINCREMENT,model varchar(20),brand varchar(20))"; db.execSQL(sql1); } //删除数据库 public void deleteDb(){ context.deleteDatabase(dbName); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }
然后我们可以写我们的Dao。
dao的完整代码如下:
public class DeviceModelDao { public static final String TAG = "DeviceModelDao"; Context context; SQLiteDatabase db; List<DeviceModelBean> listDeviceModel = null; public DeviceModelDao(Context context){ this.context = context; } //Gson解析数组到对象中去 public List<DeviceModelBean> addObjectToList(){ String jsonString = "[{\"brand\":\"华为\",\"model\":\"c8818\"},{\"brand\":\"华为\",\"model\":\"Y635\"}," + "{\"brand\":\"华为\",\"model\":\"Y635-CL00\"},{\"brand\":\"华为\",\"model\":\"P8 Lite\"},{\"brand\":\"华为\",\"model\":\"荣耀X2\"}," + "{\"brand\":\"华为\",\"model\":\"荣耀Hol-T00\"},{\"brand\":\"华为\",\"model\":\"荣耀3X畅玩版\"}," + "{\"brand\":\"华为\",\"model\":\"荣耀6\"},{\"brand\":\"华为\",\"model\":\"荣耀4C\"},{\"brand\":\"华为\",\"model\":\"荣耀X3升级版\"}," + "{\"brand\":\"华为\",\"model\":\"C8816\"},{\"brand\":\"华为\",\"model\":\"C8816D\"},{\"brand\":\"华为\",\"model\":\"Mate 7\"},{\"brand\":\"华为\",\"model\":\"荣耀畅玩4C\"}," + "{\"brand\":\"华为\",\"model\":\"荣耀7\"},{\"brand\":\"华为\",\"model\":\"荣耀畅玩4C\"},{\"brand\":\"华为\",\"model\":\"荣耀7\"},{\"brand\":\"华为\",\"model\":\"荣耀4A\"}," + "{\"brand\":\"华为\",\"model\":\"P8\"},{\"brand\":\"华为\",\"model\":\"C2900\"},{\"brand\":\"华为\",\"model\":\"Y320\"}," + "{\"brand\":\"华为\",\"model\":\"C8815\"},{\"brand\":\"华为\",\"model\":\"Mate\"},{\"brand\":\"华为\",\"model\":\"Y600\"}," + "{\"brand\":\"华为\",\"model\":\"荣耀6 Plus\"},{\"brand\":\"华为\",\"model\":\"C8817L\"},{\"brand\":\"华为\",\"model\":\"G5000\"}," + "{\"brand\":\"华为\",\"model\":\"C8817E\"},{\"brand:\":\"华为\",\"model\":\"荣耀6X\"},{\"brand\":\"华为\",\"model\":\"P8 Lite\"}," + "{\"brand\":\"华为\",\"model\":\"Ascend P8\"},{\"brand\":\"华为\",\"model\":\"荣耀畅玩4X\"},{\"brand\":\"华为\",\"model\":\"G629\"},{\"brand\":\"华为\",\"model\":\"G620\"},{\"brand\":\"华为\",\"model\":\"荣耀X2\"}," + "{\"brand\":\"华为\",\"model\":\"荣耀3C\"},{\"brand\":\"华为\",\"model\":\"荣耀6 Plus\"},{\"brand\":\"华为\",\"model\":\"C2800\"},{\"brand\":\"华为\",\"model\":\"2601\"},{\"brand\":\"华为\",\"model\":\"G610S\"}," + "{\"brand\":\"华为\",\"model\":\"Ascend G302D\"},{\"brand\":\"华为\",\"model\":\"Ascend G6\"},{\"brand\":\"华为\",\"model\":\"Ascend G6\"},{\"brand\":\"华为\",\"model\":\"T8950N\"}," + "{\"brand\":\"华为\",\"model\":\"G610\"},{\"brand\":\"华为\",\"model\":\"C8813DQ\"},{\"brand\":\"华为\",\"model\":\"Y618\"},{\"brand\":\"华为\",\"model\":\"G630\"}," + "{\"brand\":\"华为\",\"model\":\"G521\"},{\"brand\":\"华为\",\"model\":\"荣耀畅玩4\"}]"; try{ java.lang.reflect.Type type = new TypeToken<List<DeviceModelBean>>(){}.getType(); Gson gson = new Gson(); listDeviceModel = gson.fromJson(jsonString,type); Log.e("TAG",type+""); for(Iterator iterator = listDeviceModel.iterator();iterator.hasNext();){ DeviceModelBean bean = (DeviceModelBean) iterator.next(); Log.e(TAG,bean.getModel()+bean.getBrand()); } }catch (Exception e){ Log.e(TAG,"错误:"+e.getMessage()); } return listDeviceModel; } //插入数据到数据库 public void insertModelToDb(List<DeviceModelBean> listDeviceModel){ try{ DbHelper dbHelper = new DbHelper(context); db = dbHelper.getWritableDatabase(); //开始事务 db.beginTransaction(); Log.e(TAG,listDeviceModel.size()+""); String sql1 = "insert into device_model_info(id,model,brand) values (?,?,?)"; for(DeviceModelBean f :listDeviceModel){ db.execSQL(sql1,new Object[]{null,f.model,f.brand}); } }catch (Exception e){ e.printStackTrace(); }finally { //提交 db.setTransactionSuccessful(); db.endTransaction(); db.close(); } } }
create table if not exists device_model_info(id integer primary key AUTOINCREMENT,model varchar(20),brand varchar(20))
insert into device_model_info(id,model,brand) values (?,?,?)
在代码中的用法为:
//创建数据库和表 DbHelper dbHelper = new DbHelper(MyApplication.getMyApplication()); //插入数据到数据库 DeviceModelDao dao = new DeviceModelDao(MyApplication.getMyApplication()); dao.insertModelToDb(dao.addObjectToList());