Android開發-SQLite從資原始檔中資料庫複製到SD到增刪改查-AndroidStudio
阿新 • • 發佈:2019-02-19
覺得博文有用,請點贊,請評論,請關注,謝謝!~
最近換工作了,新專案接觸到一些新的知識點,跟大家逐一分享~~
首先是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]
覺得博文有用,請點贊,請評論,請關注,謝謝!~