数据存储之 SQLite 数据库操作(二)
生活随笔
收集整理的這篇文章主要介紹了
数据存储之 SQLite 数据库操作(二)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
上一講我們講解了SQLite數據庫的創建[數據存儲之 SQLite 數據庫操作(一)],還有更新的操作,這一講我們來講解一下數據庫的增刪改查,這邊的程序是對上一個程序進行修改,建議結合上一講內容進行學習。
1.?SQLiteDatabase介紹?
1. 在 SQLiteOpenHelper 類中,調用getWritableDatabase()方法也會完成創建或者打開數據庫的操作主要是用來讀和寫,它返回的類型是 :SQLiteDatabase,下面我們就來看一下這個類的介紹
查看其 API介紹 ?? 這個類主要是用來管理數據庫,它有一些方法來完成創建,刪除,執行SQL語句,還有執行其他相同數據庫管理的任務。 查看相關方法
?? 可以發現這個類里面的方法很多都是用來維護數據庫的,類似查詢等。 ?? 查看這個 public void execSQL (String sql, Object[] bindArgs) 方法用來執行一個SQL語句,在這個方法說明中,Android建議我們使用以下這種方式來進行對數據庫的增刪改查的。 ?? insert(String, String, ContentValues) ?? insertOrThrow(String, String, ContentValues) ?? insertWithOnConflict(String, String, ContentValues, int) 同理還有其他操作數據庫的操作,詳情請參考api文檔
???【備注】:這種對數據庫的操作方式是 Android 官方給我們建議的,我們會在下一講中介紹這種方式,在這一講中,下面的例子操作數據庫的方式主要是使用數據庫的 SQL語句。
2. 程序實現
package?com.android.sqlitedemo.db;?? ?? import?android.content.Context;?? import?android.database.sqlite.SQLiteDatabase;?? import?android.database.sqlite.SQLiteOpenHelper;?? ?? public?class?DBOpenHelper?extends?SQLiteOpenHelper?{?? ?? ????private?static?String?name?=?"mydb.db";?//?表示數據庫的名稱?? ????private?static?int?version?=?1;?//?表示數據庫的版本號?? ?? ????public?DBOpenHelper(Context?context)?{?? ????????super(context,?name,?null,?version);?? ????????//?TODO?Auto-generated?constructor?stub?? ????}?? ?? ????//?當數據庫創建的時候,是第一次被執行,完成對數據庫的表的創建?? ????@Override?? ????public?void?onCreate(SQLiteDatabase?db)?{?? ????????//?TODO?Auto-generated?method?stub?? ????????//?SQLite?數據創建支持的數據類型:?整型數據,字符串類型,日期類型,二進制的數據類型?? ????????//?數據庫這邊有一個特點,就是SQLite數據庫中文本類型沒有過多的約束,也就是可以把布爾類型的數據存儲到文本類型中,這樣也是可以的?? ????????String?sql?=?"create?table?person(id?integer?primary?key?autoincrement,name?varchar(64),address?varchar(64),sex?varchar(8))";?? ????????db.execSQL(sql);?//?完成數據庫的創建?? ????}?? ?? ????@Override?? ????public?void?onUpgrade(SQLiteDatabase?db,?int?oldVersion,?int?newVersion)?{?? ????????//?TODO?Auto-generated?method?stub?? ????}?? ?? }?? 3. PersonService.java 定義增刪改查接口 [java]?view plaincopy package?com.android.sqlitedemo.service;?? ?? import?java.util.List;?? import?java.util.Map;?? ?? ?? /**? ?*?定義好增刪改查接口? ?*?@author?xukunhui? ?*? ?*/?? public?interface?PersonService?{?? ?? ????public?boolean?addPersion(Object[]?params);??? ?????? ????public?boolean?deletePerson(Object[]?params);?? ?????? ????public?boolean?updatePerson(Object[]?params);?? ?????? ????//使用?Map<String,?String>?做一個封裝,比如說查詢數據庫的時候返回的單條記錄?? ????public?Map<String,?String>?viewPerson(String[]?selectionArgs);?? ?????? ????//使用?List<Map<String,?String>>?做一個封裝,比如說查詢數據庫的時候返回的多條記錄?? ????public?List<Map<String,?String>>?listPersonMaps(String[]?selectionArgs);?? }?? 4. PersonDao.java 實現增刪改查功能 [java]?view plaincopy package?com.android.sqlitedemo.dao;?? ?? import?java.util.ArrayList;?? import?java.util.HashMap;?? import?java.util.List;?? import?java.util.Map;?? ?? import?android.content.Context;?? import?android.database.Cursor;?? import?android.database.sqlite.SQLiteDatabase;?? ?? import?com.android.sqlitedemo.db.DBOpenHelper;?? import?com.android.sqlitedemo.service.PersonService;?? ?? ?? /**? ?*?數據庫的訪問工具類? ?*?實現定義好的增刪改查接口? ?*?@author?xukunhui? ?*? ?*/?? public?class?PersonDao?implements?PersonService?{?? ?? ????//獲得?helper對象用來操縱數據庫?? ????private?DBOpenHelper?helper?=?null;?? ????public?PersonDao(Context?context)?{?? ????????helper?=?new?DBOpenHelper(context);?? ????}?? ?? ????/**? ?????*?下面四個方法實現對數據庫的增刪改查功能?? ?????*/?? ?????? ????@Override?? ????public?boolean?addPersion(Object[]?params)?{?? ????????boolean?flag?=?false;?? ????????SQLiteDatabase?database?=?null;?? ????????try?{?? ????????????//這里面問好表示占位符,所以要需要傳入所有的占位符的值,傳入值有這個方法中的參數傳遞?? ????????????String?sql?=?"insert?into?person(name,address,sex)?values(?,?,?)";?? ????????????database?=?helper.getWritableDatabase();?//實現對數據庫寫的操作?? ????????????database.execSQL(sql,?params);?? ????????????flag?=?true;?? ????????}?catch?(Exception?e)?{?? ????????????e.printStackTrace();?? ????????}?finally?{?? ????????????if(database?!=?null)?{?? ????????????????database.close();?? ????????????}?? ????????}?? ????????return?flag;?? ????}?? ?? ????@Override?? ????public?boolean?deletePerson(Object[]?params)?{?? ????????boolean?flag?=?false;?? ????????SQLiteDatabase?database?=?null;?? ????????try?{?? ????????????String?sql?=?"delete?from?person?where?id?=???";?? ????????????database?=?helper.getWritableDatabase();?? ????????????database.execSQL(sql,?params);?? ????????????flag?=?true;?????????????? ????????}?catch?(Exception?e)?{?? ????????????e.printStackTrace();?? ????????}?finally?{?? ????????????if(database?!=?null)?{?? ????????????????database.close();?? ????????????}?? ????????}?? ????????return?flag;?? ????}?? ?? ????@Override?? ????public?boolean?updatePerson(Object[]?params)?{?? ????????boolean?flag?=?false;?? ????????SQLiteDatabase?database?=?null;?? ????????try?{?? ????????????String?sql?=?"update?person?set?name?=??,?address?=??,?sex?=???where?id?=???";?? ????????????database?=?helper.getWritableDatabase();?? ????????????database.execSQL(sql,?params);?? ????????????flag?=?true;?? ????????}?catch?(Exception?e)?{?? ????????????e.printStackTrace();?? ????????}?finally?{?? ????????????if(database?!=?null)?{?? ????????????????database.close();?? ????????????}?? ????????}?? ????????return?flag;?? ????}?? ?? ????//根據Id號來查詢,查詢的每一行數據返回用?Map?集合來存儲?? ????@Override?? ????public?Map<String,?String>?viewPerson(String[]?selectionArgs)?{?? ????????Map<String,?String>?map?=?new?HashMap<String,?String>();?? ????????SQLiteDatabase?database?=?null;?? ????????try?{?? ????????????String?sql?=?"select?*?from?person?where?id?=???";?? ????????????database?=?helper.getReadableDatabase();?//查詢讀取數據,查詢結果使用Map來存儲?? ????????????//聲明一個游標,這個是行查詢的操作,支持原生SQL語句的查詢?? ????????????Cursor?cursor?=?database.rawQuery(sql,?selectionArgs);?//ID所在行查詢????????????? ????????????int?colums?=?cursor.getColumnCount();//獲得數據庫的列的個數?? ????????????//cursor.moveToNext()?移動到下一條記錄?? ????????????while(cursor.moveToNext()){?? ????????????????for(int?i?=?0;?i?<?colums;?i++)?{?? ????????????????????String?cols_name?=?cursor.getColumnName(i);?//提取列的名稱?? ????????????????????String?cols_value?=?cursor.getString(cursor.getColumnIndex(cols_name));?//根據列的名稱提取列的值?? ????????????????????//數據庫中有寫記錄是允許有空值的,所以這邊需要做一個處理?? ????????????????????if(cols_value?==?null)?{?? ????????????????????????cols_value?=?"";?? ????????????????????}?? ????????????????????map.put(cols_name,?cols_value);?? ????????????????}?? ????????????}?? ????????}?catch?(Exception?e)?{?? ????????????e.printStackTrace();?? ????????}?finally?{?? ????????????if(database?!=?null){?? ????????????????database.close();?? ????????????}?? ????????}?? ????????return?map;?? ????}?? ?? ????//多條記錄?用?List<Map<String,?String>>?來封裝,每一行產生一個?Map集合來裝載這一行的數據?? ????//這樣就有多個Map值,然后放入List中.?? ????@Override?? ????public?List<Map<String,?String>>?listPersonMaps(String[]?selectionArgs)?{?? ????????List<Map<String,?String>>?list?=?new?ArrayList<Map<String,String>>();?? ????????SQLiteDatabase?database?=?null;?? ????????try?{?? ????????????String?sql?=?"select?*?from?person?";?//這個是查詢表中所有的內容,所以就不需要傳入的這個參數值了?? ????????????database?=?helper.getReadableDatabase();?? ????????????Cursor?cursor?=?database.rawQuery(sql,?selectionArgs);?? ????????????int?colums?=?cursor.getColumnCount();?? ????????????while(cursor.moveToNext())?{?? ????????????????Map<String,?String>?map?=?new?HashMap<String,?String>();?? ????????????????for(int?i?=?0;?i?<?colums;?i++)?{?? ????????????????????String?cols_name?=?cursor.getColumnName(i);?? ????????????????????String?cols_value?=?cursor.getString(cursor.getColumnIndex(cols_name));?? ????????????????????if(cols_name?==?null)?{?? ????????????????????????cols_value?=?"";???? ????????????????????}?? ????????????????????map.put(cols_name,?cols_value);?? ????????????????}?? ????????????????list.add(map);?? ????????????}?? ????????}?catch?(Exception?e)?{?? ????????????//?TODO:?handle?exception?? ????????}?finally?{?? ????????????if(database?!=?null){?? ????????????????database.close();?? ????????????}?? ????????}?? ????????return?list;?? ????}???? }?? 5. 主程序文件 MainActivity.java 文件 [java]?view plaincopy package?com.android.sqlitedemo;?? ?? import?java.util.List;?? import?java.util.Map;?? ?? import?com.android.sqlitedemo.dao.PersonDao;?? import?com.android.sqlitedemo.db.DBOpenHelper;?? import?com.android.sqlitedemo.service.PersonService;?? ?? import?android.os.Bundle;?? import?android.app.Activity;?? import?android.util.Log;?? import?android.view.Menu;?? import?android.view.View;?? import?android.view.View.OnClickListener;?? import?android.widget.Button;?? ?? public?class?MainActivity?extends?Activity?{?? ?? ????private?Button?button1;?? ????private?Button?button2;?? ????private?Button?button3;?? ????private?Button?button4;?? ????private?Button?button5;?? ????private?Button?button6;?? ?????? ????private?static?final?String?TAG?=?"MainActivity";?? ????@Override?? ????protected?void?onCreate(Bundle?savedInstanceState)?{?? ????????super.onCreate(savedInstanceState);?? ????????setContentView(R.layout.activity_main);?? ????????initComponent();?? ????????button1.setOnClickListener(new?OnClickListener()?{?? ?????????????? ????????????@Override?? ????????????public?void?onClick(View?v)?{?? ????????????????//?TODO?Auto-generated?method?stub?? ????????????????DBOpenHelper?helper?=?new?DBOpenHelper(MainActivity.this);?? ????????????????//調用?getWritableDatabase()或者?getReadableDatabase()其中一個方法將數據庫建立?? ????????????????helper.getWritableDatabase();?? ????????????}?? ????????});?? ????????button2.setOnClickListener(new?OnClickListener()?{?? ?????????????? ????????????@Override?? ????????????public?void?onClick(View?v)?{?? ????????????????//?TODO?Auto-generated?method?stub?? ????????????????PersonService?service?=?new?PersonDao(MainActivity.this);?? ????????????????//Object[]?params?=?{"張三","北京","男"};?? ????????????????Object[]?params?=?{"李四","上海","男"};?//新增加一條記錄?? ????????????????boolean?flag?=?service.addPersion(params);?? ????????????????Log.i(TAG,?"--->"?+?flag);?? ????????????}?? ????????});?? ????????button3.setOnClickListener(new?OnClickListener()?{????????????? ????????????@Override?? ????????????public?void?onClick(View?v)?{?? ????????????????PersonService?service?=?new?PersonDao(MainActivity.this);?? ????????????????Object[]?params?=?{1};?? ????????????????//將ID為1的記錄刪除?? ????????????????boolean?flag?=?service.deletePerson(params);?? ????????????????Log.i(TAG,?"---->"?+?flag);?? ????????????}?? ????????});?? ????????button4.setOnClickListener(new?OnClickListener()?{?? ?????????????? ????????????@Override?? ????????????public?void?onClick(View?v)?{?? ????????????????//?TODO?Auto-generated?method?stub?? ????????????????//將ID為3的這一條記錄修改?? ????????????????PersonService?service?=?new?PersonDao(MainActivity.this);?? ????????????????Object[]?params?=?{"AHuier",?"廈門",?"男",?"3"};?? ????????????????boolean?flag?=?service.updatePerson(params);?? ????????????????Log.i(TAG,?"--->"?+?flag);?? ????????????}?? ????????});?? ????????button5.setOnClickListener(new?OnClickListener()?{?? ?????????????? ????????????@Override?? ????????????public?void?onClick(View?v)?{?? ????????????????//查詢ID為3的單條記錄?? ????????????????PersonService?service?=?new?PersonDao(MainActivity.this);?? ????????????????String[]?seleStrings?=?{"3"};?? ????????????????Map<String,?String>?map?=?service.viewPerson(seleStrings);?? ????????????????Log.i(TAG,?"------查詢單條記錄-->?"?+?map.toString());?? ????????????}?? ????????});?? ????????button6.setOnClickListener(new?OnClickListener()?{?? ?????????????? ????????????@Override?? ????????????public?void?onClick(View?v)?{?? ????????????????//查詢多條記錄,這里我們不需要傳遞參數,所以可以參數可以置為null?? ????????????????PersonService?service?=?new?PersonDao(MainActivity.this);?? ????????????????List<Map<String,?String>>?list?=?service.listPersonMaps(null);?? ????????????????Log.i(TAG,?"---查詢所有記錄--->>?"?+?list.toString());?? ????????????}?? ????????});?? ????}?? ?? ????@Override?? ????public?boolean?onCreateOptionsMenu(Menu?menu)?{?? ????????//?Inflate?the?menu;?this?adds?items?to?the?action?bar?if?it?is?present.?? ????????getMenuInflater().inflate(R.menu.main,?menu);?? ????????return?true;?? ????}?? ?????? ????private?void?initComponent(){?? ????????button1?=?(Button)findViewById(R.id.button1);?? ????????button2?=?(Button)findViewById(R.id.button2);?? ????????button3?=?(Button)findViewById(R.id.button3);?? ????????button4?=?(Button)findViewById(R.id.button4);?? ????????button5?=?(Button)findViewById(R.id.button5);?? ????????button6?=?(Button)findViewById(R.id.button6);?? ????}?? ?? }??
1.?SQLiteDatabase介紹?
1. 在 SQLiteOpenHelper 類中,調用getWritableDatabase()方法也會完成創建或者打開數據庫的操作主要是用來讀和寫,它返回的類型是 :SQLiteDatabase,下面我們就來看一下這個類的介紹
查看其 API介紹 ?? 這個類主要是用來管理數據庫,它有一些方法來完成創建,刪除,執行SQL語句,還有執行其他相同數據庫管理的任務。 查看相關方法
?? 可以發現這個類里面的方法很多都是用來維護數據庫的,類似查詢等。 ?? 查看這個 public void execSQL (String sql, Object[] bindArgs) 方法用來執行一個SQL語句,在這個方法說明中,Android建議我們使用以下這種方式來進行對數據庫的增刪改查的。 ?? insert(String, String, ContentValues) ?? insertOrThrow(String, String, ContentValues) ?? insertWithOnConflict(String, String, ContentValues, int) 同理還有其他操作數據庫的操作,詳情請參考api文檔
???【備注】:這種對數據庫的操作方式是 Android 官方給我們建議的,我們會在下一講中介紹這種方式,在這一講中,下面的例子操作數據庫的方式主要是使用數據庫的 SQL語句。
2. 程序實現
1. 布局文件 activity_main.xml 這里就不貼出來,主要幾個按鈕的定義
2. DBOpenHelper.java 用來對數據庫進行創建和更新,上一講對這個文件有詳細講解,如有不懂,建議查看上一講內容。
[java]?view plaincopy3. 程序執行結果如下:
1. 界面如下
2. 點擊"建立數據庫"按鈕后執行"插入數據"按鈕
3. 點擊"刪除數據"按鈕
4. 點擊"修改數據"按鈕
5. 點擊"查詢單條記錄"按鈕 和 點擊"查詢多條記錄"按鈕返回結果
總結
以上是生活随笔為你收集整理的数据存储之 SQLite 数据库操作(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据存储之 SQLite 数据库操作(一
- 下一篇: 数据存储之 SQLite 数据库操作(三