日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

数据存储之 SQLite 数据库操作(二)

發布時間:2025/3/15 数据库 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据存储之 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. 程序實現

1. 布局文件 activity_main.xml 這里就不貼出來,主要幾個按鈕的定義

2. DBOpenHelper.java 用來對數據庫進行創建和更新,上一講對這個文件有詳細講解,如有不懂,建議查看上一講內容。

[java]?view plaincopy
  • 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);??
  • ????}??
  • ??
  • }??
  • 3. 程序執行結果如下:

    1. 界面如下


    2. 點擊"建立數據庫"按鈕后執行"插入數據"按鈕


    3. 點擊"刪除數據"按鈕


    4. 點擊"修改數據"按鈕


    5. 點擊"查詢單條記錄"按鈕 和 點擊"查詢多條記錄"按鈕返回結果


    原文地址:?http://blog.csdn.net/ahuier/article/details/10418147

    總結

    以上是生活随笔為你收集整理的数据存储之 SQLite 数据库操作(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。