今天是正月十三,作为寿星的我依然奋斗在工作中,醉了。-------------喧嚣的成人世界,守住本真的心。
在项目中,有一部分数据,虽然是从接口拿取的,但是这些数据有个特点,就是一般不会再去改变了。对于这样的数据来说,我是绝对不会每次用都去调接口,请求数据需要时间,需要流量,将大大降低用户体验,这个时候,这个时候我们就会把这样的数据存入到数据库中,也就是.db文件,然后每次用的时候读取数据库,来获取数据。大概流程就是这样。
今天就用一个不经常变动的省市区接口数据为例,简单介绍下如何将数据存入数据库,得到.db文件,然后如何读取.db文件。
一:将接口数据,生成.db文件。
省市区,一般都会在三个接口里面,因为要用到三级联动,我们就需要将省市区存入同一个库的三张表中,以之间的字段关系,来获取省市区的联动。
创建ShengshiquDBHelper类,继承自SQLiteOpenHelper 。
<span style="font-size:18px;"> // 数据库版本号
private static final int DATABASE_VERSION = 1;
// 数据库名
public static final String DATABASE_NAME = "pca2.db";
// 个人信息数据表名,
public static final String TABLE_NAME = "area";
// 建表语句-province
public static final String CREATE_Tables = "create table "
+ "if not exists "
+ "province"
+ " (_id INTEGER NOT NULL PRIMARY KEY,"
+ " name varchar(200),"
+ " pid INTEGER,"
+ " levelid INTEGER"
+ ")";
// 建表语句-city
public static final String CREATE_Tables2 = "create table "
+ "if not exists "
+ "city"
+ " (_id INTEGER NOT NULL PRIMARY KEY,"
+ " name varchar(200),"
+ " pid INTEGER,"
+ " levelid INTEGER"
+ ")";
// 建表语句-area
public static final String CREATE_Tables3 = "create table "
+ "if not exists "
+ "area"
+ " (_id INTEGER NOT NULL PRIMARY KEY,"
+ " name varchar(200),"
+ " pid INTEGER,"
+ " levelid INTEGER"
+ ")";
public ShengshiquDBHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_Tables);
db.execSQL(CREATE_Tables2);
db.execSQL(CREATE_Tables3);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);
}
public boolean deleteDatabase(Context context) {
return context.deleteDatabase(DATABASE_NAME);
}</span>
我们设置库名为pca2,同时用sql语句创建三张表,分别为省,市,区,这里一定要注意在 oncreate中 execSQL三张表,我们先要把三张表创建出来,然后依次去请求数据填充三张表。
创建ShengshiquDBManager
<span style="font-size:18px;">private ShengshiquDBHelper helper;
private SQLiteDatabase db;
private Context mContext;
public ShengshiquDBManager(Context context) {
this.mContext = context;
helper = new ShengshiquDBHelper(context);
// 因为getWritableDatabase内部调用了mContext.openOrCreateDatabase(mName, 0,
// mFactory);
// 所以要确保context已初始化,我们可以把实例化DBManager的步骤放在Activity的onCreate里
db = helper.getWritableDatabase();
}
//添加信息到数据库
public void addShengshiqu(ShengshiquBean bean) {
db.execSQL("insert into " + helper.TABLE_NAME + " values(?,?,?,?)",
new Object[]{bean.getId(), bean.getName(), bean.getPid(), bean.getLevelid()});
Log.i("LOG", "加入数据库成功");
}
public void deletePerson() {
helper.deleteDatabase(mContext);
}
</span>
我们从接口获取到的数据,将去存入了对象中,通过dbManager将数据添加到数据库中。
创建activity 分三次来分别请求省市区 ,将省市区接口数据分别放入三张表中。
<span style="font-size:18px;">private TextView tv;
private ArrayList<ShengshiquBean> listBeans;
private RequestQueue queue;
private ShengshiquDBManager dbManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
queue = Volley.newRequestQueue(MainActivity.this);
dbManager = new ShengshiquDBManager(MainActivity.this);
tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
requestFuWuList();
}
});
}
/**
* 获取省市区,levelid = 1,2,3 分别为省市区接口
*/
private void requestFuWuList() {
String url = "接口的url levelid=3";
Log.i("LOG", "" + url);
listBeans = new ArrayList<>();
StringRequest request = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
@Override
public void onResponse(String s) {
try {
JSONObject object = new JSONObject(s);
int ec = object.getInt("ec");
if (ec == 200) {
JSONArray objectArray = object.getJSONArray("data");
int length = objectArray.length();
for (int i = 0; i < length; i++) {
Gson gson = new Gson();
ShengshiquBean bean = gson.fromJson(objectArray.get(i).toString(), ShengshiquBean.class);
listBeans.add(bean);
}
for (int i = 0; i < listBeans.size(); i++) {
dbManager.addShengshiqu(listBeans.get(i));
Log.i("LOG", "插入成功");
}
Log.i("LOG", listBeans.size() + "获取的数量");
} else {
String em = object.getString("em");
Toast.makeText(MainActivity.this, em, Toast.LENGTH_SHORT).show();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
}
});
queue.add(request);
}</span>
改变接口读取内容的同时,别忘了要将ShengshiquDBHelper 中的表名改成和接口相对应的。
这样三次我们的省市区数据库就创建完成了。
我们来拿取.db文件
找到你的模拟器 data/data/你项目的包名/databases 目录下
拿到我们的.db文件,导出。
原创文章,转载请注明出处:http://blog.csdn.net/qq_33078541?viewmode=contents
以上我们就成功拿到我们的库文件了,就是这个.db文件。
二.下面我们来说下,这个文件怎么去读取。
在需要使用的项目res目录下,创建raw文件夹,将我们获取到的.db文件放入这个目录下。
放入下面,就是将数据放入本地了。
下面我们来看看如何使用这个库文件
<span style="font-size:18px;">public static final String DB_NAME = "pca2.db";
public static final String PACKAGE_NAME = "com.tdotapp.wjwy";
public static final String DB_PATH = "/data"
+ Environment.getDataDirectory().getAbsolutePath() + "/" + PACKAGE_NAME;
private SQLiteDatabase database;</span>
<span style="font-size:18px;">public void openDatabase() {
this.database = this.openDatabase(DB_PATH + "/" + DB_NAME);
}</span>
<span style="font-size:18px;">/**
* du读取本地的地区数据库
*
* @param dbfile
* @return
*/
private SQLiteDatabase openDatabase(String dbfile) {
try {
file = new File(dbfile);
if (!file.exists()) {
InputStream is = context.getResources().openRawResource(R.raw.pca2);
FileOutputStream fos = new FileOutputStream(dbfile);
byte[] buffer = new byte[BUFFER_SIZE];
int count = 0;
while ((count = is.read(buffer)) > 0) {
fos.write(buffer, 0, count);
fos.flush();
}
fos.close();
is.close();
}
database = SQLiteDatabase.openOrCreateDatabase(dbfile, null);
return database;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
}
return null;
}</span>
这样我们就读取到本地的数据库了。如果需要将数据转换成对象或者对象集合,读取数据库的时候做相应转换即可。
如果你喜欢我的博客,请关注我~
demo下载:
http://download.csdn.net/detail/qq_33078541/9437650