Android中的数据库
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
1.1. 什么時(shí)候使用數(shù)據(jù)庫
有大量相似結(jié)構(gòu)的數(shù)據(jù)需要存儲(chǔ)的時(shí)候就可以使用數(shù)據(jù)庫。
1.2. SQLite的簡(jiǎn)介
SQLite是一款輕量級(jí)的數(shù)據(jù)庫。它的設(shè)計(jì)目標(biāo)是嵌入式的,而且目前已經(jīng)在很多嵌入式產(chǎn)品中使用了它。Android系統(tǒng)和iOS系統(tǒng)中都嵌入了SQLite數(shù)據(jù)庫。
1.3. SQLite數(shù)據(jù)庫的創(chuàng)建流程
(1) 定義一個(gè)類繼承SQLiteOpenHelper。?
(2) 添加一個(gè)構(gòu)造函數(shù):
- 1
- 2
- 3
- 4
第2行,調(diào)用父類的構(gòu)造方法。?
參數(shù)1代表上下文,?
參數(shù)2代表數(shù)據(jù)庫的名字,?
參數(shù)3代表游標(biāo)工廠,通常為null,?
參數(shù)4代表數(shù)據(jù)庫版本,從1開始。
(3) 實(shí)現(xiàn)oncreate(),和onUpgrade()方法。
1.4. onCreate()和onUpgrade()方法
onCreate()方法是當(dāng)數(shù)據(jù)庫第一次創(chuàng)建的時(shí)候調(diào)用,這個(gè)方法適合做表結(jié)構(gòu)的初始化,創(chuàng)建表也就是編寫sql語句。
@Override public void onCreate(SQLiteDatabase db) {db.execSQL("create table info(_id integer primary key autoincrement,name varchar(20),phone varchar(20))"); }- 1
- 2
- 3
- 4
- 5
第3行,執(zhí)行sql語句。?
onUpgrade()方法是當(dāng)數(shù)據(jù)庫版本升級(jí)的時(shí)候調(diào)用,一般在方法中做表結(jié)構(gòu)的更新:
- 1
- 2
- 3
- 4
- 5
1.5. 獲取數(shù)據(jù)庫對(duì)象
通過getWritableDatabase()和getReadableDatabase()獲取數(shù)據(jù)庫對(duì)象。
| getWritableDatabase() | 打開或者創(chuàng)建數(shù)據(jù)庫用來讀和寫,如果是第一次就是創(chuàng)建。 |
| getReadableDatabase() | 打開或者創(chuàng)建數(shù)據(jù)庫,和getWritableDatabases()一樣,如果是第一次就是創(chuàng)建,除非發(fā)生某些問題如果磁盤滿了,那么就返回只讀的數(shù)據(jù)庫對(duì)象。 |
2. 使用sql語句增刪改查
缺點(diǎn):?
1.sql語句容易寫錯(cuò);?
2.執(zhí)行sql語句沒有返回值。
2.1. 插入記錄
public void click1(View v){SQLiteDatabase db = myOpenHelper.getWritableDatabase();db.execSQL("insert into info(name,phone) values(?,?)", new Object[]{"張三","1388888"});db.close(); }- 1
- 2
- 3
- 4
- 5
- 6
- 7
第2行,獲取數(shù)據(jù)庫對(duì)象;?
第3行,執(zhí)行sql語句,向info表中插入一條記錄;?
第5行,關(guān)閉數(shù)據(jù)庫。
2.2. 刪除記錄
public void click2(View v){SQLiteDatabase db = myOpenHelper.getWritableDatabase();db.execSQL("delete from info where name=?", new Object[]{"張三"});db.close(); }- 1
- 2
- 3
- 4
- 5
- 6
2.3. 修改數(shù)據(jù)
public void click3(View v){SQLiteDatabase db = myOpenHelper.getWritableDatabase();db.execSQL("update info set phone=? where name=? ",new Object[]{"138888888","張三"});db.close(); }- 1
- 2
- 3
- 4
- 5
- 6
- 7
2.4. 查找
//查找 public void click4(View v){SQLiteDatabase db = myOpenHelper.getReadableDatabase();Cursor cursor = db.rawQuery("select * from info", null);if (cursor!= null&&cursor.getCount()>0) {while(cursor.moveToNext()){//columnIndex代表列的索引 String name = cursor.getString(1);String phone = cursor.getString(2);System.out.println("name:"+name+"----"+phone);}} }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
Cursor游標(biāo)是從第一條數(shù)據(jù)之前開始的?
第5行,cursor.getCount()獲取記錄數(shù);?
第6行,cursor.moveToNext(),將游標(biāo)移動(dòng)到下一條記錄,如果有記錄則返回true,如果沒有則返回false。
3. 使用谷歌封裝好的api增刪改查
優(yōu)點(diǎn):?
???????寫法簡(jiǎn)單,不需要復(fù)雜的sql語句,不容易寫錯(cuò);?
???????有返回值方便開發(fā)者開發(fā)。?
缺點(diǎn):?
???????如果有多張表,使用谷歌封裝的api不容易進(jìn)行查詢。
3.1. 插入記錄
public void click1(View v) {SQLiteDatabase db = myOpenHelper.getWritableDatabase();ContentValues values = new ContentValues();values.put("name", "王五");values.put("phone", "110");long insert = db.insert("info", null, values); db.close();if (insert > 0) {Toast.makeText(getApplicationContext(), "添加成功", 1).show();} else {Toast.makeText(getApplicationContext(), "添加fail", 1).show();} }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
第3行,ContentValues內(nèi)部封裝了一個(gè)map,key是對(duì)應(yīng)列的名字,value對(duì)應(yīng)值;?
第6行,insert()方法返回值代表插入新行的id,如果該返回值數(shù)值大于0,那么久插入成功,其底層就是在組拼sql語句。
3.2. 刪除記錄
public void click2(View v) {SQLiteDatabase db = myOpenHelper.getWritableDatabase();int delete = db.delete("info", "name=?", new String[] { "王五" });db.close();Toast.makeText(getApplicationContext(), "刪除了" + delete + "行", 0).show(); }- 1
- 2
- 3
- 4
- 5
- 6
- 7
第3行delete()方法返回值代表影響的行數(shù)。
3.3. 修改數(shù)據(jù)
public void click3(View v) {SQLiteDatabase db = myOpenHelper.getWritableDatabase();ContentValues values = new ContentValues();values.put("phone", "114");int update = db.update("info", values, "name=?", new String[] { "王五" });db.close();Toast.makeText(getApplicationContext(), "更新了" + update + "行", 0).show(); }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
第5行,update()方法返回值代表更新了多少行。
3.4. 查找
public void click4(View v) {SQLiteDatabase db = myOpenHelper.getReadableDatabase();Cursor cursor = db.query("info", null, null, null, null, null, null);if (cursor != null && cursor.getCount() > 0) {while (cursor.moveToNext()) {String name = cursor.getString(1);String phone = cursor.getString(2);}} }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
第3行,query方法返回查詢到的Cursor,Cursor就是查詢到的結(jié)果集。方法參數(shù)代表的含義:
| table | 查詢的表名 |
| columns | 查詢的列 |
| selection | 查詢條件,一般會(huì)使用占位符如:”name=?” |
| selectionArgs | 查詢條件的參數(shù) |
| groupBy | 分組 |
| orderBy | 排序 desc(降序) asc(升序) |
4. 使用命令行工具 sqlite3
打開cmd命令行工具,輸入adb shell命令掛載到linux空間。?
進(jìn)入data/data目錄下,輸入命令cd data/data。?
ls列出所有目錄:?
?
進(jìn)入我們應(yīng)用的包名目錄下,cd+包名。?
然后進(jìn)入databases目錄下:?
?
打開數(shù)據(jù)庫,sqlite3+數(shù)據(jù)庫名稱:?
?
執(zhí)行sql語句進(jìn)行操作:?
?
改變dos的編碼方式:?
改成gbk編碼方式:chcp 936;?
改成utf-8編碼方式:chcp 65001。
轉(zhuǎn)載于:https://my.oschina.net/u/2884845/blog/740725
總結(jié)
以上是生活随笔為你收集整理的Android中的数据库的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何将sql数据导入到oracle数据库
- 下一篇: android 通讯录字母排序,Andr