Android本地存儲——SQLite數(shù)據(jù)庫

數(shù)據(jù)庫的創(chuàng)建與升級

Android中專門提供了SQLiteOpenHelper幫助類,幫助我們創(chuàng)建和升級數(shù)據(jù)庫涧衙。SQLiteOpenHelper是一個抽象類哪工,要想使用它,我們必須創(chuàng)建一個自己的幫助類弧哎。并重寫onCreate()onUpgrade()l兩個抽象方法,從而對它進(jìn)行使用雁比。
SQLiteOpenHelper有兩個構(gòu)造方法:

SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory, int version)
SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory, int version,DatabaseErrorHandler errorHandler)
/*
    第一個參數(shù)為Context
    第二個參數(shù)為數(shù)據(jù)庫名,創(chuàng)建數(shù)據(jù)庫時使用此名字
    第三個參數(shù)允許我們在查詢數(shù)據(jù)時返回一個自定義Cursor
    第四個參數(shù)表示數(shù)據(jù)庫當(dāng)前的版本號撤嫩,用于對數(shù)據(jù)庫進(jìn)行升級
    第五個參數(shù)用于處理數(shù)據(jù)庫的異常
*/

SQLiteOpenHelper中的方法:

返回類型 方法
void close() 關(guān)閉所有數(shù)據(jù)庫對象(Close any open database object.)
String getDatabaseName() 獲取使用構(gòu)造函數(shù)時傳入的數(shù)據(jù)庫名
SQLiteDatabase getReadableDatabase() 打開或創(chuàng)建一個只讀的數(shù)據(jù)庫對象
SQLiteDatabase getWritableDatabase() 打開或創(chuàng)建一個可讀寫的數(shù)據(jù)庫對象
abstract void onCreate(SQLiteDatabase db) 當(dāng)數(shù)據(jù)庫創(chuàng)建時調(diào)用
void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) 當(dāng)數(shù)據(jù)庫降級時調(diào)用
void onOpen() 當(dāng)數(shù)據(jù)庫打開時調(diào)用
abstract void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 當(dāng)數(shù)據(jù)庫升級時調(diào)用
void setWriteAheadLoggingEnabled(boolean enabled) 是否打印預(yù)寫式日志

數(shù)據(jù)庫文件通常存放在/data/data/packagename/databases/目錄下

數(shù)據(jù)庫只有在getReadableDatabase()或者getWritableDatabase()被調(diào)用時才真正被打開或創(chuàng)建偎捎。
onCreate()在數(shù)據(jù)庫被創(chuàng)建時調(diào)用,重寫這個方法創(chuàng)建表和表的初始種群

    @Override
    public void onCreate(SQLiteDatabase db){
           db.execSQL(SQL_COMMAND);
            //SQL_COMMAND為sql語句
    }

當(dāng)創(chuàng)建SQLiteOpenHelper對象時序攘,需指定一個version參數(shù)茴她,當(dāng)參數(shù)高于之前的版本號時調(diào)用onUpgrade(),當(dāng)參數(shù)低于之前的版本號時調(diào)用onDowngrade()
代碼實現(xiàn):

public class MyDatabaseHelper extends SQLiteOpenHelper {

    public static final String CREATE_BOOK = "create table Book("
            + "id integer primary key autoincrement, "
            + "author text, "
            + "price real, "
            + "pages integer, "
            + "name text)";
    public static final String CREATE_CATEGORY ="create table Category ("
            +"id integer primary key autoincrement, "
            +"category_name text, "
            +"category_code integer)";

    private Context mContext;

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

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_BOOK);
        db.execSQL(CREATE_CATEGORY);
        Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("drop table if exists Book");
        db.execSQL("drop table if exists Category");
        onCreate(db);
    }
}


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

添加數(shù)據(jù)主要有兩種方法
1.使用execSQL()方法執(zhí)行SQL語句程奠,此方法適用于所有不返回結(jié)果的SQL語句

    String sql = "insert into Book(name,author,pages,price)values(?,?,?,?)",
                            new String[]{"bookname","zsy","200","5.00"};
    db.execSQL(sql);
    //

2.使用insert()方法

    ContentValues values = new ContentValues();
    values.put("name", "The Da Vinci Code");
    values.put("author", "Dan Brown");
    values.put("pages", 454);
    values.put("price", 16.96);
    db.insert("Book", null, values);    

insert()方法接受3個參數(shù)丈牢,第一個是表名,第二個用于在未添加數(shù)據(jù)時給某些可為空的隊列復(fù)制NULL瞄沙,一般用不到此功能己沛,傳入null即可,第三個為ContentValues對象


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

1.使用execSQL()方法
2.使用updata()方法

    SQLiteDatabase db = dbHelper.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put("price", 10.99);
    db.update("Book", values, "name=?", new String[]{"The Da Vinci Code"});

updata()接受4個參數(shù)

  1. 表名
  2. ContentValues對象距境,要更新的數(shù)據(jù)裝在這里
  3. 4.約束更新一行或幾行的數(shù)據(jù)泛粹,不指定的話默認(rèn)更新所有行

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

1.使用execSQL()方法
2.使用delete()方法

    SQLiteDatabase db = dbHelper.getWritableDatabase();
    db.delete("Book", "pages > ?", new String[]{"500"});

delete()接收三個參數(shù)

  1. 表名
  2. 3.約束刪除某一行或某幾行的數(shù)據(jù),默認(rèn)刪除所有行

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

1.使用execSQL()方法
2.使用inquery()方法

query()方法參數(shù) 對應(yīng)SQL部分 描述
table from_table_name 指定查詢的表名
columns select column1, column2 指定查詢的列名
selection where column = value 指定where的拘束條件
selectionArgs - 為where中的占位符提供具體的值
groupBy group by column 指定需要group by的列
having having column = value 對 group by 后的結(jié)果進(jìn)一步約束
orderBy order by column1, column2 指定查詢結(jié)果的排序方式

代碼示例:

SQLiteDatabase db = dbHelper.getWritableDatabase();
Cursor cursor = db.query("Book",null,null,null,null,null,null);
if(cursor.moveToFirst()){
    do{
     String name = cursor.getString(cursor.getColumnIndex("name"));
     String author = cursor.getString(cursor.getColumnIndex("author"));
       int pages = cursor.getInt(cursor.getColumnIndex("pages"));
     double price = cursor.getDouble(cursor.getColumnIndex("price"));
        }while(cursor.moveToNext());
    }
cursor.close();

不管你如何執(zhí)行查詢肮疗,都會返回一個 Cursor晶姊,這是 Android 的 SQLite 數(shù)據(jù)庫游標(biāo),使用游標(biāo)伪货,你可以:

  • 通過使用 getCount() 方法得到結(jié)果集中有多少記錄们衙;
  • 通過 moveToFirst(), moveToNext(), 和 isAfterLast() 方法遍歷所有記錄钾怔;
  • 通過 getColumnNames() 得到字段名;
  • 通過 getColumnIndex() 轉(zhuǎn)換成字段號蒙挑;
  • 通過 getString()宗侦,getInt() 等方法得到給定字段當(dāng)前記錄的值;
  • 通過 requery() 方法重新執(zhí)行查詢得到游標(biāo)忆蚀;
  • 通過 close() 方法釋放游標(biāo)資源矾利;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市馋袜,隨后出現(xiàn)的幾起案子男旗,更是在濱河造成了極大的恐慌,老刑警劉巖欣鳖,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件察皇,死亡現(xiàn)場離奇詭異,居然都是意外死亡泽台,警方通過查閱死者的電腦和手機(jī)什荣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來怀酷,“玉大人稻爬,你說我怎么就攤上這事⊥梢溃” “怎么了桅锄?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長笔横。 經(jīng)常有香客問我,道長咐吼,這世上最難降的妖魔是什么吹缔? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮锯茄,結(jié)果婚禮上厢塘,老公的妹妹穿的比我還像新娘。我一直安慰自己肌幽,他們只是感情好晚碾,可當(dāng)我...
    茶點故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著喂急,像睡著了一般格嘁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上廊移,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天糕簿,我揣著相機(jī)與錄音探入,去河邊找鬼。 笑死懂诗,一個胖子當(dāng)著我的面吹牛蜂嗽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播殃恒,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼植旧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了离唐?” 一聲冷哼從身側(cè)響起病附,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎侯繁,沒想到半個月后胖喳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡贮竟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年丽焊,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咕别。...
    茶點故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡技健,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出惰拱,到底是詐尸還是另有隱情雌贱,我是刑警寧澤,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布偿短,位于F島的核電站欣孤,受9級特大地震影響喜颁,放射性物質(zhì)發(fā)生泄漏遣铝。R本人自食惡果不足惜捉捅,卻給世界環(huán)境...
    茶點故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一抽减、第九天 我趴在偏房一處隱蔽的房頂上張望鬓长。 院中可真熱鬧车猬,春花似錦玻佩、人聲如沸谐鼎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鉴扫,卻和暖如春赞枕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工鹦赎, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留谍椅,地道東北人。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓古话,卻偏偏與公主長得像雏吭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子陪踩,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,455評論 2 359

推薦閱讀更多精彩內(nèi)容