android app 讀取本地.db檔案,實現不變資料本地化(附小demo)
今天是正月十三,作為壽星的我依然奮鬥在工作中,醉了。-------------喧囂的成人世界,守住本真的心。
在專案中,有一部分資料,雖然是從介面拿取的,但是這些資料有個特點,就是一般不會再去改變了。對於這樣的資料來說,我是絕對不會每次用都去調介面,請求資料需要時間,需要流量,將大大降低使用者體驗,這個時候,這個時候我們就會把這樣的資料存入到資料庫中,也就是.db檔案,然後每次用的時候讀取資料庫,來獲取資料。大概流程就是這樣。
今天就用一個不經常變動的省市區介面資料為例,簡單介紹下如何將資料存入資料庫,得到.db檔案,然後如何讀取.db檔案。
一:將介面資料,生成.db檔案。
省市區,一般都會在三個接口裡面,因為要用到三級聯動,我們就需要將省市區存入同一個庫的三張表中,以之間的欄位關係,來獲取省市區的聯動。
建立ShengshiquDBHelper類,繼承自SQLiteOpenHelper 。
我們設定庫名為pca2,同時用sql語句建立三張表,分別為省,市,區,這裡一定要注意在 oncreate中 execSQL三張表,我們先要把三張表創建出來,然後依次去請求資料填充三張表。<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>
建立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