android SQLite (一)基本操作

最近為了鞏固android基礎(chǔ),復(fù)習(xí)了sqlite數(shù)據(jù)庫這篇。好記性不如爛筆頭,操起鍵盤就是干....

sqlite簡介

SQLite 是一款輕量級的關(guān)系型數(shù)據(jù)庫,它的運算速度非??欤?占用資源很少,通常只需要幾百 K 的內(nèi)存就足夠了,因而特別適合在移動設(shè)備上使用。SQLite 不僅支持標(biāo)準(zhǔn)的 SQL 語法,還遵循了數(shù)據(jù)庫的 ACID 事務(wù),所以只要你以前使用過其他的 關(guān)系型數(shù)據(jù)庫,就可以很快地上手 SQLite。而 SQLite 又比一般的數(shù)據(jù)庫要簡單得多,它甚 至不用設(shè)置用戶名和密碼就可以使用。Android 正是把這個功能極為強大的數(shù)據(jù)庫嵌入到了 系統(tǒng)當(dāng)中,使得本地持久化的功能有了一次質(zhì)的飛躍。

優(yōu)點:

1)零配置,無需安裝和配置
2)儲存在單一磁盤文件中的一個完整數(shù)據(jù)庫
3)數(shù)據(jù)庫文件可以在不同的字節(jié)順序的機器間自由共享
4)支持?jǐn)?shù)據(jù)庫大小至2TB
5)足夠小,全部源代碼大致3萬行C代碼,250k
6)比目前流行的大多數(shù)數(shù)據(jù)庫帶數(shù)據(jù)的操作要快
7)開源

常用的sql基本語句

創(chuàng)建表:
create table  表名 (字段名 數(shù)據(jù)類型,字段名 數(shù)據(jù)類型,字段名 數(shù)據(jù)類型)
插入數(shù)據(jù):
insert into 表名 values(數(shù)據(jù)值,數(shù)據(jù)值,數(shù)據(jù)值)
insert into 表名 (字段1,字段2,字段3) values(數(shù)據(jù)值,數(shù)據(jù)值,數(shù)據(jù)值)
更新數(shù)據(jù):
update 表名 set 字段1 = 數(shù)據(jù)值 where 其他字段 = 數(shù)據(jù)值
刪除數(shù)據(jù):
delete from 表名 where  字段值 = 數(shù)據(jù)值
刪除表:
drop table if exists 表名
增加字段:
alter table 表名 add column 字段  數(shù)據(jù)類型
查詢數(shù)據(jù):
select * from表名 where 查詢的條件表達式  group by 分組的字段 order by 排序的字段 
 //select 后面為* 則返回所有的字段,返回部分字段,只需把*換成需要的字段,多個字段有逗號隔開

創(chuàng)建數(shù)據(jù)庫

android的為我們提供了SQLiteOpenHelper ,繼承這個抽象類類,需要復(fù)寫構(gòu)造方法(一般選構(gòu)造參數(shù)少的那個),onCreate()和onUpgrade()

onCreate

這個方法是用來創(chuàng)建數(shù)據(jù)庫用的;

onUpgrade

這個方法是用來升級數(shù)據(jù)庫用的;

例子如下:

創(chuàng)建一個學(xué)生表

public class MySQLiteHelp extends SQLiteOpenHelper {
    public static final int VERSION = 1;
    private static final String DB_NAME = "my_db.db";
    private static final String CREATE_BOOK = "create table Students (" +
            "id integer primary key autoincrement," +
            "name text," +
            "class text," +
            "year integer," +
            "grade real)";
    private Context mContext;

    public MySQLiteHelp(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
        this.mContext = context;
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        sqLiteDatabase.execSQL(CREATE_BOOK);
        Toast.makeText(mContext,"創(chuàng)建成功!",Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }
}

然后實例化MySQLiteHelp這個類,并調(diào)用getWritableDatabase()方法。

//第一個參數(shù)上下文,第二個參數(shù)數(shù)據(jù)庫名字,第三個參數(shù)允許我們在查詢數(shù)據(jù)的時候返回一個自定義的Cursor,一般傳null,第四個參數(shù)傳入數(shù)據(jù)庫版本
mySQLiteHelp = new MySQLiteHelp(this,MySQLiteHelp.DB_NAME,null,1);
//創(chuàng)建或者打開一個數(shù)據(jù)庫,如果數(shù)據(jù)庫存在就打開,沒有就創(chuàng)建
mySQLiteHelp.getWritableDatabase();

打開File Explorer查看數(shù)據(jù)庫是否創(chuàng)建成功;目錄在data/data/[包名]/databases


image.png

這里需要講下 SQLite的數(shù)據(jù)類型和getWritableDatabase()與getReadableDatabase()的區(qū)別

SQLite的數(shù)據(jù)類型只有5種:

1,null(數(shù)據(jù)值為空)
2,integer(整型)
3,real(浮點型數(shù)據(jù))
4,text(字符串,數(shù)據(jù)庫編碼【utf-8,utf-16be或者utf-16le】存放)
5,blob(只是一個數(shù)據(jù)塊,完全按照輸入存放)

getWritableDatabase()與getReadableDatabase()的區(qū)別

getWritableDatabase取得的實例不是僅僅具有寫的功能,而是同時具有讀和寫的功能同樣的;

getReadableDatabase取得的實例也是具對數(shù)據(jù)庫進行讀和寫的功能。

兩者的區(qū)別在于getWritableDatabase取得的實例是以讀寫的方式打開數(shù)據(jù)庫,如果打開的數(shù)據(jù)庫磁盤滿了,此時只能讀不能寫,此時調(diào)用了getWritableDatabase的實例,那么將會發(fā)生錯誤(異常)

getReadableDatabase取得的實例是先調(diào)用getWritableDatabase以讀寫的方式打開數(shù)據(jù)庫,如果數(shù)據(jù)庫的磁盤滿了,此時返回打開失敗,繼而用getReadableDatabase的實例以只讀的方式去打開數(shù)據(jù)庫

操作數(shù)據(jù)庫

操作數(shù)據(jù)庫的類不是SQLiteOpenHelper ,而是SQLiteDatabase,這個對象是通過調(diào)用getWritableDatabase方法返回的對象;
下面來演示下操作數(shù)據(jù)庫的增刪改查

添加數(shù)據(jù)

ps:db 是一個SQLiteDatabase對象;
調(diào)用db.execSQL(String sql)方法;

 String sql = "insert into Students (name,class,year,grade) values ('小明','一年級',8,98)";
 db.execSQL(sql);

這里我用sqlite expert professional 這個工具打開數(shù)據(jù)庫,查看數(shù)據(jù)是否插入成功

image.png

其實SQLiteDatabase還為我們提供了更加簡單的一種方法插入數(shù)據(jù);
調(diào)用 db.insert();

  ContentValues values = new ContentValues();
                values.put("name","小紅");
                values.put("class","一年級");
                values.put("year",7);
                values.put("grade",100);
                db.insert("Students",null,values);
image.png

更新數(shù)據(jù)

我們來將小明的分?jǐn)?shù)偷偷的改成100

使用sql語法的如下:
String sql = "update Students set grade = 100 where name = '小明' ";
                db.execSQL(sql);
android內(nèi)置語法:

我們來把小明的分?jǐn)?shù)偷偷的改成60

    ContentValues values1 = new ContentValues();
                values1.put("grade",60);
                db.update("Students",values1,"name = ?",new String[]{"小明"});

db.update的方法需要傳入四個參數(shù),第一個是表名,第二個是需要修改的值,第三個是條件,第四個是符合條件的值


image.png

刪除數(shù)據(jù)

我們來將小明的數(shù)據(jù)刪除點;

sql語法:
 String sql = "delete from Students where name = '小明' ";
 db.execSQL(sql);

將小明的數(shù)據(jù)刪除了,這樣他爸媽就不知道了。


image.png
android內(nèi)置語法:
//這里三個參數(shù),第一個是表名,第二個是條件,第三個是符合條件的值
db.delete("Students","name = ?",new String[]{"小明"});

查詢數(shù)據(jù)

sql語句:

查詢數(shù)據(jù)這里不能用:db.execSQL(sql),
這里需要換一個方法:db.rawQuery()

String sql1 = "select * from Students where name = '小紅' ";
                //第一個參數(shù)為select語句;第二個參數(shù)為select語句中占位符參數(shù)的值,如果select語句沒有使用占位符,該參數(shù)可以設(shè)置為null
                Cursor cursor = db.rawQuery(sql1, null);
                if (cursor.moveToFirst()){
                    do {
                        String name = cursor.getString(cursor.getColumnIndex("name"));
                        String class_ = cursor.getString(cursor.getColumnIndex("class"));
                        int year = cursor.getInt(cursor.getColumnIndex("year"));
                        double grade = cursor.getDouble(cursor.getColumnIndex("grade"));
                        Log.d(TAG, "name: "+name);
                        Log.d(TAG, "name: "+class_);
                        Log.d(TAG, "name: "+year);
                        Log.d(TAG, "name: "+grade);
                    }while (cursor.moveToNext());

                }
                cursor.close();

執(zhí)行完查詢語句返回一個Cursor數(shù)據(jù)類型。他是一個提供了隨機讀寫訪問數(shù)據(jù)庫查詢結(jié)果集的接口。Cursor并不是線程安全,因此在多線程中訪問的時候需要手動進行同步,避免線程出現(xiàn)問題。
常用的Cursor函數(shù)有:
close() 關(guān)閉游標(biāo),釋放資源
copyStringToBuffer(int columnIndex, CharArrayBuffer buffer) 在緩沖區(qū)中檢索請求的列的文本,將將其存儲
getColumnCount() 返回所有列的總數(shù)
getColumnIndex(String columnName) 返回指定列的名稱,如果不存在返回-1
getColumnIndexOrThrow(String columnName) 從零開始返回指定列名稱,如果不存在將拋出IllegalArgumentException 異常。
getColumnName(int columnIndex) 從給定的索引返回列名
getColumnNames() 返回一個字符串?dāng)?shù)組的列名
getCount() 返回Cursor 中的行數(shù)
moveToFirst() 移動光標(biāo)到第一行
moveToLast() 移動光標(biāo)到最后一行
moveToNext() 移動光標(biāo)到下一行
moveToPosition(int position) 移動光標(biāo)到一個絕對的位置
moveToPrevious() 移動光標(biāo)到上一行

android內(nèi)置語法:
/**
     * 第一個參數(shù):表名
     * 第二個參數(shù):要查詢的字段名
     * 第三個參數(shù):要查詢的條件字段
     * 第四個參數(shù):要查詢的條件字段對應(yīng)的值
     * 第五個參數(shù):分組的字段
     * 第六個參數(shù):篩選的字段
     * 第七個參數(shù):排序的字段
     * 返回值:游標(biāo)
      Cursor cursor = db.query("Students",null,null,null,null,null,null);
     */

獲取了游標(biāo)Cursor 之后的操作與上面一樣。
android的基本操作就這樣了,下次有時候?qū)懸幌聰?shù)據(jù)庫的升級和優(yōu)化部分。等我把github弄好我再吧代碼上傳

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,901評論 25 709
  • 簡介:SQLite是輕量級嵌入式數(shù)據(jù)庫引擎,它支持 SQL 語言,并且只利用很少的內(nèi)存就有很好的性能。此外它還是開...
    當(dāng)幸福來敲門58閱讀 2,406評論 0 1
  • 我很想你。 現(xiàn)在是2017年6月5日08:39分。 鈴聲響起,這個時間有的同學(xué)們依舊趴在桌面閉目養(yǎng)神。大屏幕播放著...
    瘦十斤斤閱讀 135評論 1 0
  • 文 | 壹百 阿城《棋王》可這象棋,始終是處在一種機敏的運動之中,兜捕對手,逼向死角,不能疏忽。 匯道禪于一爐,神...
    填clipaul閱讀 795評論 0 2
  • ? 男人靠不住。這幾乎是所有婚姻失敗的女人在痛徹心扉后的血淚總結(jié)。此言當(dāng)然不夠客觀,但無數(shù)前車之鑒明晃晃地提醒...
    Ann_栗子閱讀 275評論 0 0

友情鏈接更多精彩內(nèi)容