1. 程式人生 > >android app 讀取本地.db檔案,實現不變資料本地化(附小demo)

android app 讀取本地.db檔案,實現不變資料本地化(附小demo)

今天是正月十三,作為壽星的我依然奮鬥在工作中,醉了。-------------喧囂的成人世界,守住本真的心。

在專案中,有一部分資料,雖然是從介面拿取的,但是這些資料有個特點,就是一般不會再去改變了。對於這樣的資料來說,我是絕對不會每次用都去調介面,請求資料需要時間,需要流量,將大大降低使用者體驗,這個時候,這個時候我們就會把這樣的資料存入到資料庫中,也就是.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