安卓案例:利用SQLiteOpenHelper操作数据库及表
安卓案例:利用SQLiteOpenHelper操作數據庫及表
一、運行效果
二、涉及知識點
1、利用SQLiteOpenHelper類創建與升級數據庫
這個類是一個抽象類,我們必須繼承該類創建一個子類,實現里面的兩個抽象方法:
(1)public void?onCreate(SQLiteDatabase db);
(2)public void?onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion);
這兩個方法什么時候會調用呢?
如果數據庫不存在,那么就會調用onCreate方法來創建數據庫、表以及視圖。
如果數據庫存在但是沒有升級,什么事情也不做。
如果數據庫存在并且進行了升級,那么就會調用onUpgrade方法來完成升級服務。
2、游標與列表的綁定
數據表查詢的結果放在游標集里,這作為數據源,如何把數據源和展示控件(ListView)綁定到一起呢?這就需要一個適配器——SimpleCursorAdapter(簡單游標適配器)。
3、列表控件
4、上下文菜單?
5、對話框
三、實現步驟
1、創建安卓應用SQLiteOpenHelperDemo
2、主布局資源文件activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
? ? xmlns:tools="http://schemas.android.com/tools"
? ? android:layout_width="match_parent"
? ? android:layout_height="match_parent"
? ? android:padding="15dp"
? ? tools:context="net.hw.sqlite_open_helper_demo.MainActivity">
? ??
? ? <ListView
? ? ? ? android:id="@+id/lv_student"
? ? ? ? android:layout_width="match_parent"
? ? ? ? android:layout_height="wrap_content"/>
? ??
</LinearLayout>
3、繼承SQLiteOpenHelper,創建自定義數據庫打開助手DBHelper
package net.hw.sqlite_open_helper_demo;
?
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;
?
/**
?* Created by Administrator on 2017/12/27.
?*/
?
public class DBHelper extends SQLiteOpenHelper {
? ? /**
? ? ?* 數據庫名
? ? ?*/
? ? private static final String DB_NAME = "student.db";
? ? /**
? ? ?* 數據庫版本號
? ? ?*/
? ? private static final int DB_VERSION = 1;
? ? /**
? ? ?* 表名
? ? ?*/
? ? private static final String TABLE_NAME = "student";
? ? /**
? ? ?* 上下文
? ? ?*/
? ? private Context context;
?
? ? /**
? ? ?* 構造方法
? ? ?*
? ? ?* @param context
? ? ?*/
? ? public DBHelper(Context context) {
? ? ? ? super(context, DB_NAME, null, DB_VERSION);
? ? ? ? this.context = context;
? ? }
?
? ? /**
? ? ?* 創建方法:當數據庫不存在時才調用
? ? ?*
? ? ?* @param db
? ? ?*/
? ? @Override
? ? public void onCreate(SQLiteDatabase db) {
? ? ? ? // 創建表
? ? ? ? createTable(db, TABLE_NAME);
? ? ? ? // 插入記錄
? ? ? ? insertRecords(db);
? ? }
?
? ? /**
? ? ?* 創建表
? ? ?*
? ? ?* @param tableName
? ? ?*/
? ? private void createTable(SQLiteDatabase db, String tableName) {
? ? ? ? // 定義SQL字符串
? ? ? ? String strSQL = "CREATE TABLE " + tableName + "(_id text, name text, gender text, age integer, major text)";
? ? ? ? try {
? ? ? ? ? ? // 執行SQL,創建表
? ? ? ? ? ? db.execSQL(strSQL);
? ? ? ? ? ? // 提示用戶建表成功
? ? ? ? ? ? Toast.makeText(context, "恭喜,表【" + tableName + "】創建成功!", Toast.LENGTH_SHORT).show();
? ? ? ? } catch (SQLException e) {
? ? ? ? ? ? // 提示用戶建表失敗
? ? ? ? ? ? Toast.makeText(context, "遺憾,表【" + tableName + "】創建失敗!", Toast.LENGTH_SHORT).show();
? ? ? ? }
? ? }
?
? ? /**
? ? ?* 插入表記錄
? ? ?*
? ? ?* @param db
? ? ?*/
? ? private void insertRecords(SQLiteDatabase db) {
? ? ? ? // 創建內容值對象
? ? ? ? ContentValues values = new ContentValues();
?
? ? ? ? // 通過鍵值對方式存放記錄信息
? ? ? ? values.put("_id", "1600001");
? ? ? ? values.put("name", "李云龍");
? ? ? ? values.put("gender", "男");
? ? ? ? values.put("age", 19);
? ? ? ? values.put("major", "軟件技術專業");
? ? ? ? // 調用db的插入方法,插入第1條記錄
? ? ? ? db.insert(TABLE_NAME, null, values);
?
? ? ? ? // 通過鍵值對方式存放記錄信息
? ? ? ? values.put("_id", "1600002");
? ? ? ? values.put("name", "張云紅");
? ? ? ? values.put("gender", "女");
? ? ? ? values.put("age", 18);
? ? ? ? values.put("major", "市場營銷專業");
? ? ? ? // 調用db的插入方法,插入第2條記錄
? ? ? ? db.insert(TABLE_NAME, null, values);
?
? ? ? ? // 通過鍵值對方式存放記錄信息
? ? ? ? values.put("_id", "1600003");
? ? ? ? values.put("name", "肖文燕");
? ? ? ? values.put("gender", "女");
? ? ? ? values.put("age", 20);
? ? ? ? values.put("major", "數字媒體專業");
? ? ? ? // 調用db的插入方法,插入第3條記錄
? ? ? ? db.insert(TABLE_NAME, null, values);
?
? ? ? ? // 通過鍵值對方式存放記錄信息
? ? ? ? values.put("_id", "1600004");
? ? ? ? values.put("name", "鄭小剛");
? ? ? ? values.put("gender", "男");
? ? ? ? values.put("age", 18);
? ? ? ? values.put("major", "軟件技術專業");
? ? ? ? // 調用db的插入方法,插入第4條記錄
? ? ? ? db.insert(TABLE_NAME, null, values);
?
? ? ? ? // 通過鍵值對方式存放記錄信息
? ? ? ? values.put("_id", "1600005");
? ? ? ? values.put("name", "唐雨涵");
? ? ? ? values.put("gender", "女");
? ? ? ? values.put("age", 20);
? ? ? ? values.put("major", "機械制造專業");
? ? ? ? // 調用db的插入方法,插入第5條記錄
? ? ? ? db.insert(TABLE_NAME, null, values);
?
? ? ? ? // 通過鍵值對方式存放記錄信息
? ? ? ? values.put("_id", "1600006");
? ? ? ? values.put("name", "王小丫");
? ? ? ? values.put("gender", "女");
? ? ? ? values.put("age", 20);
? ? ? ? values.put("major", "數字媒體專業");
? ? ? ? // 調用db的插入方法,插入第6條記錄
? ? ? ? db.insert(TABLE_NAME, null, values);
?
? ? ? ? // 通過鍵值對方式存放記錄信息
? ? ? ? values.put("_id", "1600007");
? ? ? ? values.put("name", "張廷玉");
? ? ? ? values.put("gender", "男");
? ? ? ? values.put("age", 18);
? ? ? ? values.put("major", "市場營銷專業");
? ? ? ? // 調用db的插入方法,插入第7條記錄
? ? ? ? db.insert(TABLE_NAME, null, values);
?
? ? ? ? // 通過鍵值對方式存放記錄信息
? ? ? ? values.put("_id", "1600008");
? ? ? ? values.put("name", "吳文霞");
? ? ? ? values.put("gender", "女");
? ? ? ? values.put("age", 20);
? ? ? ? values.put("major", "機械制造專業");
? ? ? ? // 調用db的插入方法,插入第8條記錄
? ? ? ? db.insert(TABLE_NAME, null, values);
?
? ? ? ? // 通過鍵值對方式存放記錄信息
? ? ? ? values.put("_id", "1600009");
? ? ? ? values.put("name", "王曉燕");
? ? ? ? values.put("gender", "女");
? ? ? ? values.put("age", 18);
? ? ? ? values.put("major", "數字媒體專業");
? ? ? ? // 調用db的插入方法,插入第9條記錄
? ? ? ? db.insert(TABLE_NAME, null, values);
?
? ? ? ? // 通過鍵值對方式存放記錄信息
? ? ? ? values.put("_id", "1600010");
? ? ? ? values.put("name", "董翔宇");
? ? ? ? values.put("gender", "男");
? ? ? ? values.put("age", 20);
? ? ? ? values.put("major", "市場營銷專業");
? ? ? ? // 調用db的插入方法,插入第10條記錄
? ? ? ? db.insert(TABLE_NAME, null, values);
? ? }
?
? ? /**
? ? ?* 查詢方法
? ? ?*
? ? ?* @param columns
? ? ?* @param selection
? ? ?* @param selectionArgs
? ? ?* @return
? ? ?*/
? ? public Cursor query(String[] columns, String selection, String[] selectionArgs) {
? ? ? ? // 獲取一個只讀數據庫
? ? ? ? SQLiteDatabase db = getReadableDatabase();
? ? ? ? // 執行查詢方法,返回游標
? ? ? ? return db.query(TABLE_NAME, columns, selection, selectionArgs, null, null, null);
? ? }
? ??
? ? public int delete(String whereClause, String[] whereArgs) {
? ? ? ? // 獲取一個可寫數據庫
? ? ? ? SQLiteDatabase db = getWritableDatabase();
? ? ? ? // 執行刪除方法,返回刪除記錄數
? ? ? ? return db.delete(TABLE_NAME, whereClause, whereArgs); ? ??
? ? }
?
? ? /**
? ? ?* 更新方法(課堂練習)
? ? ?*?
? ? ?* @param values
? ? ?* @param whereClause
? ? ?* @param whereArgs
? ? ?* @return
? ? ?*/
? ? public int update(ContentValues values, String whereClause, String[] whereArgs) {
? ? ? ? return 0;
? ? }
?
? ? /**
? ? ?* 插入方法(課堂練習)
? ? ?*?
? ? ?* @param values
? ? ?* @return
? ? ?*/
? ? public int insert(ContentValues values) {
? ? ? ? return 0;
? ? }
?
? ? /**
? ? ?* 升級方法:當數據庫升級時被調用
? ? ?*
? ? ?* @param sqLiteDatabase
? ? ?* @param i
? ? ?* @param i1
? ? ?*/
? ? @Override
? ? public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
? ? ? ? // 暫時不升級數據庫
? ? }
}
4、主界面類MainActivity
package net.hw.sqlite_open_helper_demo;
?
import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
?
public class MainActivity extends Activity {
? ? /**
? ? ?* 編輯菜單項標識
? ? ?*/
? ? private static final int EDIT_MENU_ITEM = 1;
? ? /**
? ? ?* 刪除菜單項標識
? ? ?*/
? ? private static final int DELETE_MENU_ITEM = 2;
? ? /**
? ? ?* 學生列表控件
? ? ?*/
? ? private ListView lvStudent;
? ? /**
? ? ?* 簡單游標適配器
? ? ?*/
? ? private SimpleCursorAdapter adapter;
? ? /**
? ? ?* 游標(數據源)
? ? ?*/
? ? private Cursor cursor;
? ? /**
? ? ?* 當前列表項位置
? ? ?*/
? ? private int position;
? ? /**
? ? ?* 數據庫助手
? ? ?*/
? ? private DBHelper dbHelper;
?
? ? @Override
? ? protected void onCreate(Bundle savedInstanceState) {
? ? ? ? super.onCreate(savedInstanceState);
? ? ? ? // 利用布局資源文件設置用戶界面
? ? ? ? setContentView(R.layout.activity_main);
?
? ? ? ? // 通過資源標識獲得控件實例
? ? ? ? lvStudent = (ListView) findViewById(R.id.lv_student);
?
? ? ? ? // 實例化數據庫助手
? ? ? ? dbHelper = new DBHelper(this);
?
? ? ? ? // 查詢全部表記錄
? ? ? ? cursor = dbHelper.query(null, null, null);
?
? ? ? ? // 實例化簡單游標適配器
? ? ? ? adapter = new SimpleCursorAdapter(
? ? ? ? ? ? ? ? this, // 參數1:上下文
? ? ? ? ? ? ? ? android.R.layout.simple_expandable_list_item_2, // 參數2:列表項模板
? ? ? ? ? ? ? ? cursor, // 參數3:游標(數據源)
? ? ? ? ? ? ? ? new String[] {"name", "gender"}, // 參數4:字段列表
? ? ? ? ? ? ? ? new int[] {android.R.id.text1, android.R.id.text2}, // 參數5:控件標識列表
? ? ? ? ? ? ? ? SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER // 參數6:標志(注冊內容觀察者)
? ? ? ? );
?
? ? ? ? // 給列表控件設置適配器
? ? ? ? lvStudent.setAdapter(adapter);
? ? }
}
運行程序,結果如下:
5、單擊列表項,彈出吐司,顯示該學生詳情
// 給列表控件注冊監聽器
lvStudent.setOnItemClickListener(new AdapterView.OnItemClickListener() {
? ? @Override
? ? public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
? ? ? ? // 游標定位到指定記錄
? ? ? ? cursor.moveToPosition(position);
? ? ? ??
? ? ? ? // 獲取當前記錄各個字段值
? ? ? ? String _id = cursor.getString(cursor.getColumnIndex("_id"));
? ? ? ? String name = cursor.getString(cursor.getColumnIndex("name"));
? ? ? ? String gender = cursor.getString(cursor.getColumnIndex("gender"));
? ? ? ? int age = cursor.getInt(cursor.getColumnIndex("age"));
? ? ? ? String major = cursor.getString(cursor.getColumnIndex("major"));
? ? ? ??
? ? ? ? // 將各個字段值拼接成一個學生記錄信息
? ? ? ? StringBuilder builder = new StringBuilder();
? ? ? ? builder.append("學生詳細信息\n\n");
? ? ? ? builder.append("學號:" + _id + "\n");
? ? ? ? builder.append("姓名:" + name + "\n");
? ? ? ? builder.append("性別:" + gender + "\n");
? ? ? ? builder.append("年齡:" + age + "\n");
? ? ? ? builder.append("專業:" + major + "\n");
? ? ? ? String studentInfo = builder.toString();
? ? ? ??
? ? ? ? // 通過吐司顯示學生信息
? ? ? ? Toast.makeText(MainActivity.this, studentInfo, Toast.LENGTH_SHORT).show();
? ? }
});
此時,運行程序,單擊某一項:
6、創建上下文菜單
/**
?* 創建上下文菜單
?*?
?* @param menu
?* @param v
?* @param menuInfo
?*/
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
? ? super.onCreateContextMenu(menu, v, menuInfo);
? ? // 獲取適配器上下文菜單信息對象
? ? AdapterView.AdapterContextMenuInfo acmi = (AdapterView.AdapterContextMenuInfo) menuInfo;
? ??
? ? // 獲取列表項當前位置
? ? position = acmi.position;
? ? // 游標定位到指定記錄
? ? cursor.moveToPosition(position);
? ? // 獲取當前記錄的姓名信息
? ? String name = cursor.getString(cursor.getColumnIndex("name"));
? ??
? ? // 添加上下文菜單項
? ? menu.add(1, EDIT_MENU_ITEM, 1, "編輯【" + name + "】記錄");
? ? menu.add(1, DELETE_MENU_ITEM, 2, "刪除【" + name + "】記錄");
? ? // 設置上下文菜單標題行圖標
? ? menu.setHeaderIcon(R.mipmap.ic_launcher);
? ? // 設置上下文菜單標題行
? ? menu.setHeaderTitle("表記錄操作"); ? ? ? ?
}
7、在onCreate方法里給列表控件lvStudent注冊上下文菜單
此時,運行程序,長按某一項:
8、完成刪除記錄功能
/**
?* 上下文菜單項選擇事件處理
?*?
?* @param item
?* @return
?*/
@Override
public boolean onContextItemSelected(MenuItem item) {
? ? switch (item.getItemId()) {
? ? ? ? case EDIT_MENU_ITEM:
? ? ? ? ? ? // TODO 課堂練習
? ? ? ? ? ? break;
? ? ? ? case DELETE_MENU_ITEM:
? ? ? ? ? ? // 定義警告對話框生成器
? ? ? ? ? ? AlertDialog.Builder builder = new AlertDialog.Builder(this);
? ? ? ? ? ? // 通過生成器設置,創建警告對話框
? ? ? ? ? ? builder.setIcon(R.mipmap.ic_launcher) // 設置圖標
? ? ? ? ? ? ? ? ? ? .setTitle("刪除表記錄") // 設置標題
? ? ? ? ? ? ? ? ? ? .setMessage("您是否要刪除當前記錄?") // 設置正文
? ? ? ? ? ? ? ? ? ? .setPositiveButton("是", new DialogInterface.OnClickListener() {
? ? ? ? ? ? ? ? ? ? ? ? @Override
? ? ? ? ? ? ? ? ? ? ? ? public void onClick(DialogInterface dialogInterface, int i) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? // 游標定位到當前記錄
? ? ? ? ? ? ? ? ? ? ? ? ? ? cursor.moveToPosition(position);
? ? ? ? ? ? ? ? ? ? ? ? ? ? // 獲取當前記錄的_id
? ? ? ? ? ? ? ? ? ? ? ? ? ? String _id = cursor.getString(cursor.getColumnIndex("_id"));
? ? ? ? ? ? ? ? ? ? ? ? ? ? // 刪除當前記錄
? ? ? ? ? ? ? ? ? ? ? ? ? ? int count = dbHelper.delete("_id = ?", new String[] {_id});
? ? ? ? ? ? ? ? ? ? ? ? ? ? // 判斷是否刪除成功
? ? ? ? ? ? ? ? ? ? ? ? ? ? if (count > 0) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 游標執行重查詢方法
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cursor.requery();
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 刷新列表控件
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? lvStudent.deferNotifyDataSetChanged(); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Toast.makeText(MainActivity.this, "遺憾,記錄刪除失敗!", Toast.LENGTH_SHORT).show();
? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? }) // 設置肯定按鈕
? ? ? ? ? ? ? ? ? ? .setNegativeButton("否", null) // 設置否定按鈕
? ? ? ? ? ? ? ? ? ? .create() // 創建警告對話框
? ? ? ? ? ? ? ? ? ? .show(); // 顯示警告對話框
? ? ? ? ? ? break;
? ? }
? ? return true;
}
運行程序,測試刪除功能:
單擊“刪除【李云龍】記錄”菜單項:
單擊【是】按鈕,看看“李云龍”還在不在?
9、完成編輯記錄功能(課堂練習)
四、課后作業
對教學案例,完成添加記錄和查詢記錄功能。
系統主界面
編輯菜單:
查詢菜單:
排序菜單:
統計菜單:
關于菜單:
原文:https://blog.csdn.net/howard2005/article/details/79457374?
?
總結
以上是生活随笔為你收集整理的安卓案例:利用SQLiteOpenHelper操作数据库及表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: x264 struct学习 1
- 下一篇: 关键帧 关于decode_one_fr