1. 程式人生 > >Android開發-SQLite從資原始檔中資料庫複製到SD到增刪改查-AndroidStudio

Android開發-SQLite從資原始檔中資料庫複製到SD到增刪改查-AndroidStudio

覺得博文有用,請點贊,請評論,請關注,謝謝!~

最近換工作了,新專案接觸到一些新的知識點,跟大家逐一分享~~

首先是SQLite,專案中需要把一個本地幾十兆的本地資料庫放在專案中,實現只用json傳遞少量資料,卻可以實現複雜資料查詢顯示的功能。

我分兩塊來說,一個使用SQLiteStudio建立一個數據庫,另一個是Android如何把這個資料放在SD下並且實現增刪改查。

1、使用SQLiteStudio建立一個數據庫:





2、Android如何把這個資料放在SD下並且實現增刪改查:




接下來看一下程式碼,和除錯資訊:

package com.iwanghang.readsqlite;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

public class MainActivity extends AppCompatActivity {

    private String TAG = "MainActivity";
    private SQLiteDatabase db;
    private String baoName = "com.iwanghang.readsqlite"; // 包名
    private String dbName = "iwanghang.db"; // 資料庫名
    File dbFile = new File("/data"
            + Environment.getDataDirectory().getAbsolutePath()
            + "/" + baoName + "/databases/");
    String dbPath = "/data"
            + Environment.getDataDirectory().getAbsolutePath()
            + "/" + baoName + "/databases/" + dbName;// 要把你raw檔案的db儲存到sdcard中

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

        initPublicDB(); // 初始化資料庫 記得修改3個位置 baoName dbName R.raw.iwanghang
        initSQLite(); // 建立或開啟資料庫
        createTable(); // 建立使用者登入資訊表單
        userDataSave(); // 使用者資訊儲存
        queryData(); // 查詢表資訊(userlogintable表)
        initTable(); // 遍歷表名
        userDataUpdateNative("123456789"); // 使用者資訊更新
        queryData(); // 查詢表資訊(userlogintable表)(updata以後再查一次)

    }

    /**
     * 初始化資料庫
     */
    private void initPublicDB() {
        if (!dbFile.exists()) { // 如果資料夾不存在,則建立新的資料夾
            dbFile.mkdirs();
        }
        if (!(new File(dbPath).exists())) {  //判斷資料庫檔案是否存在,若不存在則執行匯入,否則直接開啟資料庫
            Log.v(TAG, "匯入資料庫到/" + baoName + "/databases/");
            InputStream is = getResources().openRawResource(R.raw.iwanghang); // 要匯入的資料庫
            FileOutputStream fos = null;
            try {
                fos = new FileOutputStream(dbPath);
                byte[] buffer = new byte[1024];
                int count = 0;
                while ((count = is.read(buffer)) > 0) {
                    fos.write(buffer, 0, count);
                }
                fos.flush();
                fos.close();
                is.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        Log.v(TAG, "初始化資料庫 = " + (new File(dbPath).exists()));
    }

    /**
     * 建立或開啟資料庫
     */
    private void initSQLite() {
        db = openOrCreateDatabase(dbName, Context.MODE_PRIVATE, null);
        Log.v(TAG, "db = " + db.getPath().toString());
    }

    /**
     * 建立使用者登入資訊表單(userlogintable)
     */
    private void createTable(){
        // 建立表SQL語句
        /**
         * 表名 userlogintable
         * uid; // 主鍵並且自動增加)
         * uname; // 姓名
         * usex; // 性別
         * ubirth; // 生日
         * uidcard; // 身份證號
         * uphone; // 手機號
         */
        db.execSQL("CREATE TABLE userlogintable(uid integer primary key autoincrement," +
                "uname text," +
                "usex text," +
                "ubirth text," +
                "uidcard text," +
                "uphone text)");
    }

    /**
     * 使用者資訊儲存
     */
    private void userDataSave() {
        // 例項化常量值
        ContentValues cValue = new ContentValues();
        cValue.put("uname","iwh");
        cValue.put("usex","男");
        cValue.put("ubirth","1987-05-30");
        cValue.put("uidcard","2XXXXX19870530XXXX");
        cValue.put("uphone","13800138000");
        // 呼叫insert()方法插入資料
        db.insert("userlogintable",null,cValue);
    }

    /**
     * 查詢表資訊(userlogintable表)
     */
    private void queryData() {
        // 判斷表是否存在
        Boolean result = false;
        result = checkColumnExists("userlogintable");
        Log.v(TAG,"userlogintable表存在情況: " + result);
        if (result == false){
            return;
            //createTable(); // 建立 userlogintable表(使用者登入資訊表)
        }

        // 查詢獲得遊標
        Cursor cursor = db.query("userlogintable",null,null,null,null,null,null);
        // 判斷遊標是否為空
        if(cursor.moveToFirst()){
            // 遍歷遊標
            for(int i=0;i<cursor.getCount();i++){
                cursor.move(i);
                int uid = cursor.getInt(0);// 獲得ID
                String uname = cursor.getString(1);
                String usex = cursor.getString(2);
                String ubirth = cursor.getString(3);
                String uidcard = cursor.getString(4);
                String uphone = cursor.getString(5);

                Log.v(TAG, " userlogintable = uid:" + uid +
                        ",uname:" + uname +
                        ",usex:" + usex +
                        ",ubirth:" + ubirth +
                        ",uidcard:" + uidcard +
                        ",uphone:" + uphone);
            }
        }
        cursor.close(); // 關閉遊標,釋放資源
    }

    /**
     * 判斷表是否存在
     * @param tableName 表名
     * @return
     */
    private boolean checkColumnExists(String tableName) {
        Boolean result = false;
        String sql = "select count(*) as c from sqlite_master where type ='table' and name ='" + tableName + "';";
        Cursor cursor = db.rawQuery(sql, null);
        if(cursor.moveToNext()){
            int count = cursor.getInt(0);
            if(count>0){
                result = true;
            }
        }
        cursor.close(); // 關閉遊標,釋放資源
        Log.i(TAG, "判斷表是否存在 result = " + result);
        return result ;
    }

    /**
     * 遍歷表名
     */
    private void initTable() {
        // 遍歷出表名
        Cursor cursor = db.rawQuery("select name from sqlite_master where type='table';", null);
        while (cursor.moveToNext()) {
            String name = cursor.getString(0);
            Log.i(TAG, "遍歷出表名 = " + name);
        }
        cursor.close(); // 關閉遊標,釋放資源
    }

    /**
     * 使用者資訊更新
     */
    private void userDataUpdateNative(String uphone) {
        // 例項化常量值
        ContentValues cValue = new ContentValues();
        cValue.put("uphone",uphone);
        // 呼叫update()方法更新資料
        //db.update("userlogintable",cValue,"name=? AND age=?",new String[]{"xiadong","20"});
        String[] args = {String.valueOf("iwh")};
        db.update("userlogintable", cValue, "uname=?",args);
    }
}



轉載請註明出處:http://blog.csdn.net/iwanghang/article/details/73478091



歡迎移動開發愛好者交流
瀋陽或周邊城市公司有意開發Android,請與我聯絡
聯絡方式

微信:iwanghang
QQ:413711276
郵箱:[email protected]



覺得博文有用,請點贊,請評論,請關注,謝謝!~