1. 程式人生 > >Android開發-SQLite資料庫

Android開發-SQLite資料庫

  之前我們講了如何將資料儲存在檔案中,那麼除了這種方式呢,就是我們常見的大家都知道的將資料儲存在資料庫當中了。

  將資料儲存在資料庫中的優勢:

    1)儲存在資料庫中的資料更加方便操作,比如增、刪、改、查等

    2)可以實現事務的回滾,比如銀行轉賬等

    3)方便維護,可讀性高

    4)資源佔用少,效能高

    5)……

  SQLite資料庫在我們日常生活中隨處不見了,比如我們的手機~現在市場上的手機都是用SQLite資料庫作為資料的儲存的。

  以及我們常看見的智慧家居,也是用SQLite資料庫去記錄資料的。以及我們經常用到的桌面程式,比如QQ、迅雷等。

一、SQLite資料庫概念及優缺點

  SQLite資料庫是一套開源的嵌入式資料庫引擎,它的每個資料庫都是以單個檔案的形式存在

  這些資料以B-Tree的資料結構的形式儲存在磁碟上面。

  SQLite資料庫就是一個很小的、可以直接開啟執行的檔案,而其他的資料庫都是一個大型的應用程式。

  使用SQLite的優勢:

    1、SQLite支援大多數的sql標準語句

      增、刪、改、查、事務等等,所以這裡就不詳細的說這個了……

    2、輕量級

      可以說是袖珍型,然而小小的SQLite卻可以支援高達2TB大小的資料庫

    3、檢索速度快

    4、動態資料模型(弱型別)

      SQLite資料庫支援

        NULL:空值

        INTEGER:整數型

        REAL:浮點型

        TEXT:字串文字

        BLOB:二進位制物件

      5個基本資料型別。

      之所以稱之為“弱型別”,是因為插入資料的時候不管是什麼資料型別都會自動的轉化。

      注意:當INTEGER的約束為PRIMARY KEY時,就必須是整數不會自動轉換,否則就會報錯!

    5、SQLite資料庫在使用前不需要安裝配置,也不需要啟用程序來啟動、關閉資料庫

    6、佔用系統資源少

    7、跨平臺

      它可以在多個作業系統下使用而不需要針對某一個作業系統獨立編寫程式碼,也就是說它在各各作業系統的資料層是相同的;

      同時也是SQLite資料庫內在機制決定的,SQL資料庫是執行在SQLite虛擬機器上面的,

      在虛擬機器上面會直接轉編譯成不同作業系統的資料模型。

  SQLite的缺陷在於:

    1、不支援大型專案

    2、一部分SQL標準語句不支援,但是這些語句一般不會用到……

    3、安全性相對於其他大型資料庫差

      就要比我們的Android手機,只要獲取到root許可權,那麼也就是證明可以為所欲為了……

      那麼Android怎麼來加強它的安全性呢?

        a、提高程式的安全驗證

        b、加強程式碼的嚴謹性

        c、許可權管理

  介於SQLite資料庫的優勢,很多的桌面應用程式都用它來儲存該應用程式的資料;

  當然,我們的Android以及iPhone的產品鏈也幾乎都是運用SQLite資料庫。

二、Android中的實現

   1、使用原生的方法對資料庫進行簡單的操作

    也就是直接寫SQL程式碼

   a、定義一個方法,繼承SQLiteOpenHelper類。並實現onCreate和onUpgrade方法,重寫自定義的方法。

      重寫自定義的方法:

        1)引數有很多,那麼這裡簡單的只需要context引數就好了。

        2)super引數:

          context:上下文

          name:資料庫名稱

          factory:目的建立cursor物件

          version:資料庫版本,一般從1開始

      onCreate方法:

        1)當資料庫第一次建立時使用,如果是其次的就是開啟

        2)適合做表結構的初始化

      onUpgrade方法:

        1)當資料庫的版本升級時使用

        2)適合做表結構的更新

      execSQL:

        要執行的sql語句,這裡適用於增、刪、改

複製程式碼
public class MyOpenHelper extends SQLiteOpenHelper {

    /**
     * 
     * @param context 上下文
     * name 資料庫的名稱
     * factory 目的建立cursor物件
     * version 資料庫版本    從1開始
     */
    public MyOpenHelper(Context context) {
        super(context, "test_1.db", null, 3);
    }

    /**
     * 當資料庫第一次建立是使用
     * 這個方法特別適合做表結構的初始化   建立表就是寫sql語句
     */
    @Override
    public void onCreate(SQLiteDatabase db) {

        db.execSQL("create table test_info(id integer primary key autoincrement,name varchar(20))");
    }

    /**
     * 當資料庫版本升級時使用
     * 這個方法適合做表結構的更新
     */
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        db.execSQL("alter table test_info add phone varchar(20)");
    }

}
複製程式碼

    b、必須要注意資料庫的降級onDowngrade,降級的設計關鍵點

      1)考慮雲端要儲存使用者【自定義資料、行為習慣】。專業術語profile–>>提高使用者黏度

      2)考慮當前的最低版本要求–>>降低維護成本

      3)儘可能本地的資料轉移(所有新版本,都不刪除欄位)–>儘可能把未知變已知

      4)降級很可能會失敗,所以我們一般 try-catch;當降級成功就是try塊的語句,失敗之後就執行catch塊的語句

      5)SQLiteDatabase(執行語句)、oldVersion(老版本號)、newVersion(新版本號)

複製程式碼
/* 模擬從3.0 降低會2.0 */
    @Override
    public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //正常來講大於2.0的,應該有test_info 這張表,且2.0有的欄位,3.0都有
        try {
            //第一、先把test_info 未來的表,改名
            String rename_sql = "alter table test_info rename to test_info_bak";
            db.execSQL(rename_sql);
            Log.i("down", "1.改名成功");
            //第二、建立2.0的表結構
            String sql_message = "create table test_info (id int primary key,tou1  varchar(50),userName varchar(50),
                    lastMessage varchar(50),datetime varchar(50))"; db.execSQL(sql_message); Log.i("down", "2.建立2.0表結構成功"); //第三、把備份的資料,copy到 新建的2.0的表 String sql_copy = "insert into test_info select id,tou1,userName,lastMessage,datetime from test_info_bak"; db.execSQL(sql_copy); Log.i("down", "3.copy到使用者資料到 2.0的表"); //第四、把備份表drop掉 String drop_sql = "drop table if exists test_info_bak"; db.execSQL(drop_sql); Log.i("down", "4.把備份表drop掉"); } catch (Exception e) { //失敗 Log.i("hi", "降級失敗,重新建立"); String sql_drop_old_table = "drop table if exists test_info"; String sql_message = "create table test_info(id integer primary key autoincrement,name varchar(20),phone varchar(20))"; String sql_init_1 = "insert into test_info values (1,'abc','130000')"; String sql_init_2 = "insert into test_info values (2,'abc','134444')"; db.execSQL(sql_drop_old_table); db.execSQL(sql_message); db.execSQL(sql_init_1); db.execSQL(sql_init_2); } }
複製程式碼

    c、建立MyOpenHelper物件

myOpenHelper = new MyOpenHelper(getApplicationContext());

//開啟或是建立資料庫     如果第一次就是建立,其次就是開啟
//SQLiteDatabase sqliteDatabase = myOpenHelper.getWritableDatabase();
//開啟或是建立資料庫     如果第一次就是建立,其次就是開啟     如果磁碟滿了就返回只讀
//SQLiteDatabase sqliteDatabase = myOpenHelper.getReadableDatabase();

    d、增加資料

//獲取資料庫物件
SQLiteDatabase db = myOpenHelper.getWritableDatabase();
//執行新增一條sql語句
db.execSQL("insert into test_info(name,phone) values(?,?)",new Object[]{"zhangsan","138888888"});
//資料庫用完要關閉
db.close();

    e、刪除資料

SQLiteDatabase db = myOpenHelper.getWritableDatabase();
db.execSQL("delete from test_info where name=?",new Object[]{"zhangsan"});
db.close();

    f、修改資料

SQLiteDatabase db = myOpenHelper.getWritableDatabase();
db.execSQL("updata test_info set phone=? where name=?",new Object[]{"13777777777","zhangsan"});
db.close();

    g、查詢資料

複製程式碼
SQLiteDatabase db = myOpenHelper.getWritableDatabase();

        Cursor cursor = db.rawQuery("select * from test_info", null);

        if(cursor!=null&&cursor.getCount()>0){
            while(cursor.moveToNext()){
                //columnIndex代表列的索引
                String name = cursor.getString(1);
                String phone = cursor.getString(2);
            }
        }
複製程式碼

  2、使用Google封裝好的api對資料進行簡單操作

    Google工程師給我們封裝好了的一些方法讓我們直接呼叫,但是其實在底層也就是將這些字串進行拼接成完整的sql語句。

    a、增加資料

      ContentValues  內部封裝好的一個map集合,map集合是以<key,value>的形式儲存資料的。

      insert引數說明

        table:表名

        key:對應列的名字

        value:對應的值

      put引數說明

        key:增加的列名字

        value:對應的值

複製程式碼
//獲取資料庫物件
SQLiteDatabase db = myOpenHelper.getWritableDatabase();
/**
* table 表名
* ContentValues 內部封裝了一個map 
* key:對應列的名字   
* value:對應值
*/
ContentValues values = new ContentValues();
values.put("name", "wangwu");
values.put("phone", "120");
//返回值代表插入新行的id
long insert = db.insert("test_info", null, values);//底層就是在拼接SQL語句
//資料庫用完要關閉
db.close();

if(insert>0){
    Toast.makeText(getApplicationContext(), "新增成功!", 3000).show();
}else{
    Toast.makeText(getApplicationContext(), "新增失敗!", 3000).show();
}
複製程式碼

    b、刪除資料

      delete引數說明

        table:表名

        whereClause:要刪除的是哪一列,根據什麼刪除

        whereArgs:這裡返回的是一個數組物件,根據刪除列的值

SQLiteDatabase db = myOpenHelper.getWritableDatabase();
//根據Google封裝好的api刪除
int delete = db.delete("test_info", "name=?", new String[]{"wangwu"});
db.close();
Toast.makeText(getApplicationContext(), "刪除了"+delete+"行", 2000).show();

    c、修改資料

      update引數說明

        table:表名

        value:就是ContentValues中的value

        whereClause:要修改的是哪一列,根據什麼修改

        whereArgs:這裡返回的是一個數組物件,根據修改列的值

複製程式碼
SQLiteDatabase db = myOpenHelper.getWritableDatabase();

//根據Google封裝好的api修改 ContentValues value = new ContentValues(); value.put("phone", "110"); //代表更新了多少行 int updata = db.update("test_info", value, "name=?", new String[]{"wangwu"}); db.close(); Toast.makeText(getApplicationContext(), "更新了"+updata+"行", 2000).show();
複製程式碼

    d、查詢資料

      query引數說明

        table:表名

        columns:查詢的列

        selection:根據什麼查詢

        selectionArgs:查詢的條件的值

        groupBy:分組

        having:查詢條件,這裡要區分having與where的區別!

        orderBy:排序

      moveToNext():遍歷資料表中的資料

      cursor:Google工程師封裝好的指標物件,用於遍歷集合下標

複製程式碼
SQLiteDatabase db = myOpenHelper.getWritableDatabase();
        
/**
 * 根據Google封裝好的api查詢
* columns 代表你要查詢的列
* selection  根據什麼查詢phone
*/
Cursor cursor = db.query("test_info", new String[]{"phone"}, "name=?", new String[]{"wangwu"}, null, null, null);

if(cursor!=null&&cursor.getCount()>0){
     while(cursor.moveToNext()){
          String phone = cursor.getString(0);
          System.out.println("phone:" + phone);
     }
}
複製程式碼

  3、使用原生方法與封裝好的api方法的優缺點

    a、原生方法優點

      1)可以更加靈活運用sql語句

      2)程式碼量可以減少,效率更高

   b、原生方法缺點

      1)容易寫錯sql程式碼

      2)不好維護

    c、封裝好的優點

      1)不用直接寫sql語句,減少了錯誤的概率

      2)方便維護

    d、封裝好的缺點

      1)使程式更加笨重,效率低

      2)不方便資料的操作,不能靈活運用資料的操作語句

    不管是使用哪一種方法,都有它的好處和壞處,所以在實際開發中視實際情況而定,想用什麼方法也都是可行的。

    建議:比較小型的程式推薦使用封裝好的api,比較簡單,可以提高開發效率

       比較大型的程式推薦使用原生方法,比較靈活,也可以提高程式效率

三、總結

  1、使用SQLite的優缺點

  2、資料庫的升級和降級(*****)

  3、使用原生方法對資料庫進行簡單操作

  4、使用Google封裝好的api對資料庫進行簡單操作

  5、各自的優缺點

  6、Android和iPhone產品鏈的資料層是一樣的

  ps:感興趣的同學可以想想微信:

    在客戶端的SQLite是怎麼去實現的?

    在後臺伺服器使用什麼去實現的,又是如何實現的?

    那麼又要做到這些資料的互動呢?

    又是怎樣去優化的呢?

相關推薦

Android開發-SQLite資料庫

  之前我們講了如何將資料儲存在檔案中,那麼除了這種方式呢,就是我們常見的大家都知道的將資料儲存在資料庫當中了。   將資料儲存在資料庫中的優勢:     1)儲存在資料庫中的資料更加方便操作,比如增、刪、改、查等     2)可以實現事務的回滾,比如銀行轉賬等     3)方便維護,可讀性高     4)資

Android開發資料庫sqlite)的檢視及一些問題的解決方法

最近在學習Android中的Sqlite遇到一些問題,這裡做一下總結。 一、建立資料庫 首先你要新建一個使用Sqlite的APP,開發工具Ecplise、AndroidStudio都可,這裡以後者AS為例。如果你沒有現成的程式,可以用博主的這個、 檔名

Android開發 SQLite 通過.db檔案匯入已有資料庫

那,如果想要用一個已有的資料庫怎麼辦? 因為Android系統下的資料庫是存放在/data/data/com.*.*(package name)/目錄下,所以我們可以這樣:1.將.db檔案放到專案原始碼的res/raw目錄下; 2.用FileInputStream讀取原資料; 3.用FileOutPutSt

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

覺得博文有用,請點贊,請評論,請關注,謝謝!~最近換工作了,新專案接觸到一些新的知識點,跟大家逐一分享~~首先是SQLite,專案中需要把一個本地幾十兆的本地資料庫放在專案中,實現只用json傳遞少量資料,卻可以實現複雜資料查詢顯示的功能。我分兩塊來說,一個使用SQLiteS

[報告和原始碼分享] 基於AndroidSQLite資料庫的手機音樂播放器

本文就Android系統上一款音樂播放器應用程式的設計與實現進行討論。Android是一個開源的系統,它底層是基於Linux的作業系統,本論文的音樂播放器採用了Android開源系統技術,利用Java語言和Eclipse編輯工具對播放器進行編寫。同時給出了詳細的系統設計過程、部分介面圖及主要功能執行

Android 原生SQLite資料庫操作實戰

建立DB工具類 MyDBHelper.java(建立資料庫的操作) package com.amos.android_db; import android.content.Context; import android.database.sqlite.SQLiteDatabase;

androidSQLite資料庫操作通訊錄示例

SQLite資料庫操作通訊錄示例 PersonSQLiteOpenHelper.java package com.itheima.person; import android.content.Context; import android.database.sq

Android 使用Sqlite資料庫時,插入了資料,不報錯,但查詢不到

Android 使用Sqlite資料庫時,插入了資料,不報錯,但查詢不到 (初學者)今天寫安卓的時候遇見這麼一個問題,我覺得挺有趣的,就是cursor查詢時,用cursor.getString(1),這種居然不能精確定位到行位置(可能是從0開始?有時間再細糾一下),得用cur

Android 使用SQLite資料庫使用Cursor(遊標)來進行操作

Android 使用的資料庫是SQLite資料庫,對於資料庫記錄的操作,可以使用Cursor(遊標)來進行。1. 關於 Cursor在你理解和使用 Android Cursor 的時候你必須先知道關於 Cursor 的幾件事情:Cursor 是每行的集合。使用 moveTo

AndroidSQLite資料庫的簡單使用

建立WFDBHelper類,該類繼承於SQLiteOpenHelper類,改寫onCreate方法。 package com.liu_weifeng.wf; import android.content.Context; import android.database.Cursor; impo

android學習十一(androidSQLite資料庫的使用)

       SQLite是一款輕量級的關係型資料庫,它運算速度快,佔用資源少,通常只需要幾百k的記憶體就夠了,支援標準的sql語法和資料庫的ACID事務。在android中為了能夠更加方便的管理資料庫,專門提供了一個SQLiteOpenHelper幫助類,藉助這個類就可以

Android使用SQLite資料庫

一. 簡介 SQLite資料庫是一個輕量級的DBMS(資料庫管理系統)。SQLite使用單個檔案儲存資料,Android標準庫包含SQLite庫以及配套使用的一些Java輔助類。主要特點:輕量級,單一檔案,跨平臺,開源。 二. Android中SQL

android開發SQlite最簡單總結

最近這幾天一直在研究android的sqlite,由於前期有SQL Serevice的基礎所有理解起來比較容易,但還是發現很多使用上的問題!!!! 首先介紹一下SQLite,sqlite是一個小的資料庫,操作簡單,不用登陸,支援標準的sql語句,就這樣結束了,還是很好理解

原創:Androidsqlite資料庫需上傳伺服器,進行更新儲存

專案背景: Android的sqlite資料庫,需要上傳伺服器,進行更新儲存; 專案技術:  1. socket通訊 1.1 伺服器與客戶端均採用多執行緒(必須的,因Android UI裡面進行網路資料請求的時候,socket不能在主執行緒); 參考:http:/

AndroidSQLite資料庫基本用法詳解(極簡潔)

    Android操作SQLite資料庫(極簡潔,極易懂) 本篇原始碼地址: 原始碼裡面有詳細註釋,切記要修改一下gradle的版本號為本地gradle版本號,否則AndroidStduio會自行下載,浪費時間。 一、成品效果圖 Android

iOS開發-SQLite資料庫在App專案中的設定及使用

在iOS開發中,除了UI頁面以外使用最多的估計是資料物件的儲存了~比如聊天記錄、通訊錄和通訊記錄、瀏覽記錄等等。我們要根據不同的使用方式去對這些資料儲存並使用。常用的有:①沙盒機制 ②屬性列表plist ③SQLite ④CoreData,本文介紹的就是基礎的SQLite

視覺化操作AndroidSQLite資料庫

        android移動裝置開發資料庫為SQLite,SQLite雖然不如Oracle或者MySql功能強大,但它輕量級,畢竟手機你不能期待它功能強大到哪種程度,除非未來手機記憶體能大到我們滿足為止。         SQLite能不能像我們用PLSql一樣視覺化嗎?當然可以,下面我就介紹一下,我

AndroidSQLite資料庫的簡單使用

File file = new File(“hah.txt”); //只是建立了一個物件file, file指向了hah.txt這個檔案,hah.txt這個檔案可能存在,也可能不存在。如果檔案不存在,則不會被建立。 必須要有檔案輸出流對檔案進行了寫的操作,檔案才會被建立。 遊標:在訪問資料庫中表結構時,想

Android基礎 =======SQLite資料庫的總結

在學習Android第一行程式碼的時候,由於電腦卡,執行安卓虛擬機器卡,所以一直沒有系統學習這方面內容,每次都是看一遍書就過了,現在還是一樣的電腦,用的真機測試,發現真機也可以匯出資料庫表,所以就做了一些demo來系統的學習一下SQLite資料庫的使用。

Android SQLiteOpenHelper Sqlite資料庫的建立與開啟

Android Sqlite資料庫是一個怎樣的資料庫? 答:是一種嵌入式小型裝置,移動裝置,的資料庫,應用在穿戴裝置(例如:智慧手錶,計算手環 等等),移動裝置(例如:Android系統型別的手機 等等),屬於嵌入式關係型資料庫。 在Android開發過程中