android Sqlite的简单封装和使用

    xiaoxiao2021-12-14  20

    SQLiteOpenHelper的创建

    如果想通过类继承了SQLiteOpenHelper,然后一次创建多个表,是不能在其它类中连续调用创建表的,第二张表是不能够被创建的,必须要在Helper的类中创建,就是在onCreate时创建表。

    以下代码抽取程序中的部分代码,仅供参考,本人还在学习中,虽然网上已经有很多成熟的框架可以使用,但还是想研究一下,希望高手指教,不喜勿喷!

    Helper类的创建,主要用于生成数据库和表。

    package com.cdl.mydb.db; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; /** * 创建多表数据库 */ public class MultiTableHelper extends SQLiteOpenHelper { private final String TAG = "MultiTableHelper"; private String[] tableNames; private String[] sqls; /** * 初始化构造函数 * * @param context * @param name 数据库名 * @param factory 游标工厂(基本不用) * @param version 版本号 */ public MultiTableHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); } /** * 初始化构造函数 * * @param context * @param dbName 数据库名 * @param version 版本号 * @param tableNames 表名 * @param sqls SQL语句 */ public MultiTableHelper(Context context, String dbName, int version, String[] tableNames, String[] sqls) { this(context, dbName, null, version); this.tableNames = tableNames; this.sqls = sqls; } // 当调用SQLiteDatabase中的getWritableDatabase()函数的时候会检测表是否存在,如果不存在onCreate将被调用创建表,否则将不会在被调用。 @Override public void onCreate(SQLiteDatabase db) { if (db != null) { for (int i = 0; i < tableNames.length; i++) { Log.d(TAG, "tableName =" + tableNames[i]); Log.d(TAG, "sql=" + sqls[i]); db.execSQL("create table if not exists " + tableNames[i] + sqls[i]); } } } // 版本更新 @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.d(TAG, "oldVersion=" + oldVersion); Log.d(TAG, "newVersion=" + newVersion); if (db != null) { // 如果表存在就删除 for (int i = 0; i < tableNames.length; i++) { db.execSQL("drop table if exists" + tableNames[i]); } // 重新初始化 onCreate(db); } } }

    管理类的创建,主要用于实现数据库的增删改查和一些常用的操作的封装方法

    package com.cdl.mydb.DBManager import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; /** * 数据库管理类 * Created by chen on 2016/11/29. */ public class DBManager { private final String TAG = "DBManager"; private Context context; private SQLiteDatabase mSQLiteDatabase; private SQLiteOpenHelper mSQLiteOpenHelper; private Cursor mCursor; private StringBuffer mSqlBuffer; private boolean isSqlSuccessed = false; public DBManager(Context context) { super(); this.context = context; mSqlBuffer = new StringBuffer(); } /** * 创建多表数据库 * * @param dbName 数据库名称 * @param version 数据库版本 * @param tableNames 数据库表名 * @param sqls sql语句 */ public void create(String dbName, int version, String[] tableNames, String[] sqls) { if (isSqlSuccessed || sqls.length > 0) { for (int i = 0; i < sqls.length; i++) { if (!isLegalSql(sqls[i])) { Log.e(TAG, "Sql语句不合法"); } } if (mSQLiteOpenHelper == null) { mSQLiteOpenHelper = new MultiTableHelper(context, dbName, version, tableNames, sqls); } } else { Log.e(TAG, "Sql语句不合法"); } } /** * 创建单表数据库 * * @param dbName 数据库名称 * @param version 数据库版本 * @param tableName 数据库表名 * @param sql sql语句 */ public void create(String dbName, int version, String tableName, String sql) { if (isSqlSuccessed || isLegalSql(sql)) { mSQLiteOpenHelper = new SingleTableHelper(context, dbName, version, tableName, sql); } else { Log.e(TAG, "Sql语句不合法"); } } /** * 是否为合法Sql语句 */ private boolean isLegalSql(String sql) { if (sql != null && sql.length() > 1) { if ("(".equals(sql.charAt(0) + "") && ")".equals(sql.charAt(sql.length() - 1) + "")) { return true; } } return false; } /** * 添加主键 */ public DBManager addPrimaryKey() { mSqlBuffer.append("_id integer primary key autoincrement,"); return this; } /** * 创建TEXT型字段 * * @param key 字段名 */ public DBManager addText(String key) { mSqlBuffer.append(key + " text,"); return this; } /** * 创建BLOB型字段 * * @param key 字段名 */ public DBManager addBlob(String key) { mSqlBuffer.append(key + " blob,"); return this; } /** * 创建INTEGER型字段 * * @param key 字段名 */ public DBManager addInteger(String key) { mSqlBuffer.append(key + " integer,"); return this; } /** * 获取SQL语句 */ public String getSql() { String sql = null; if (mSqlBuffer.length() > 0) { sql = mSqlBuffer.toString(); sql = sql.substring(0, sql.length() - 1); sql = "(" + sql + ")"; Log.i(TAG, "getSql: " + sql); mSqlBuffer = new StringBuffer(); isSqlSuccessed = true; } return sql; } /** * 执行一条sql语句 * * @param sql */ public void mExecSQL(String sql) { mSQLiteDatabase = mSQLiteOpenHelper.getWritableDatabase(); mSQLiteDatabase.execSQL(sql); closeAll(); } /** * 增加数据 * * @param tableName 表名 * @param nullColumnHack 非空字段名 * @param values 数据源 */ public void mInsert(String tableName, String nullColumnHack, ContentValues values) { mSQLiteDatabase = mSQLiteOpenHelper.getWritableDatabase(); mSQLiteDatabase.insert(tableName, nullColumnHack, values); closeAll(); } /** * 删除数据 * * @param tableName 表名 * @param whereClause (eg:"_id=?") * @param whereArgs (eg:new String[] { "01" } ) */ public void mDelete(String tableName, String whereClause, String[] whereArgs) { mSQLiteDatabase = mSQLiteOpenHelper.getWritableDatabase(); mSQLiteDatabase.delete(tableName, whereClause, whereArgs); closeAll(); } /** * 更新 * * @param tableName * @param values * @param whereClause * @param whereArgs */ public void mUpdate(String tableName, ContentValues values, String whereClause, String[] whereArgs) { mSQLiteDatabase = mSQLiteOpenHelper.getWritableDatabase(); mSQLiteDatabase.update(tableName, values, whereClause, whereArgs); closeAll(); } /** * 更新 * * @param tableName 表名 * @param values 更新的数据 * @param whereClause 更新的条件(eg:_id = 01) */ public void mUpdate(String tableName, ContentValues values, String whereClause) { mSQLiteDatabase = mSQLiteOpenHelper.getWritableDatabase(); mSQLiteDatabase.update(tableName, values, whereClause, null); closeAll(); } /** * 查询 * * @param tableName * @param columns * @param selection * @param selectionArgs * @param groupBy * @param having * @param orderBy * @return mCursor 游标 */ public Cursor mQuery(String tableName, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy) { mSQLiteDatabase = mSQLiteOpenHelper.getWritableDatabase(); mCursor = mSQLiteDatabase.query(tableName, columns, selection, selectionArgs, groupBy, having, orderBy); return mCursor; } /** * 查询全部(查询后需要在调用的类中手动调用closeAll()方法来关闭全部函数) * * @param tableName 表名 * @param orderBy 排序方式(asc升序,desc降序) * @return mCursor 游标 */ public Cursor mQueryAll(String tableName, String orderBy) { mSQLiteDatabase = mSQLiteOpenHelper.getWritableDatabase(); mCursor = mSQLiteDatabase.query(tableName, null, null, null, null, null, orderBy); return mCursor; } /** * 从数据库中删除表 * * @param tableName 表名 */ public void mDropTable(String tableName) { mSQLiteDatabase = mSQLiteOpenHelper.getWritableDatabase(); mSQLiteDatabase.execSQL("drop table if exists " + tableName); Log.e(TAG, "已删除" + tableName + "表"); closeAll(); } /** * 删除表中的全部数据 * * @param tableName 表名 */ public void mDeleteTable(String tableName) { mSQLiteDatabase = mSQLiteOpenHelper.getWritableDatabase(); mSQLiteDatabase.execSQL("delete from " + tableName); Log.e(TAG, "已清空" + tableName + "表"); closeAll(); } /** * 判断某张表是否存在 * * @param tableName 表名 * @return true 存在 */ public boolean isTableExist(String tableName) { boolean result = false; if (tableName == null) { return false; } try { mSQLiteDatabase = mSQLiteOpenHelper.getReadableDatabase(); String sql = "select count(*) as c from sqlite_master where type ='table' and name ='" + tableName.trim() + "' "; mCursor = mSQLiteDatabase.rawQuery(sql, null); if (mCursor.moveToNext()) { int count = mCursor.getInt(0); if (count > 0) { result = true; } } } catch (Exception e) { Log.e(TAG, tableName + "表不存在"); } closeAll(); return result; } /** * 获取表中有多少条数据 * * @param tableName * @return */ public int getDataNum(String tableName) { mSQLiteDatabase = mSQLiteOpenHelper.getWritableDatabase(); mCursor = mSQLiteDatabase.query(tableName, null, null, null, null, null, null); int num = mCursor.getCount(); closeAll(); return num; } /** * 数据库是否存在要查询的这条数据 * * @param tableName 表名 * @param columnName 需要查询字段 * @param data 需要查询数据 * @return */ public boolean hasThisData(String tableName, String columnName, String data) { boolean result = false; mSQLiteDatabase = mSQLiteOpenHelper.getWritableDatabase(); mCursor = mSQLiteDatabase.query(tableName, null, null, null, null, null, null); while (mCursor.moveToNext()) { String columnValues = mCursor.getString(mCursor.getColumnIndex(columnName)); // 有这条数据 if (data.equals(columnValues)) { result = true; break; } } closeAll(); return result; } /** * 关闭全部 */ public void closeAll() { if (mCursor != null && !mCursor.isClosed()) { mCursor.close(); } else { Log.e(TAG, "closeAll: mCursor已关闭"); } if (mSQLiteOpenHelper != null) { mSQLiteOpenHelper.close(); } else { Log.e(TAG, "closeAll: mSQLiteOpenHelper已关闭"); } if (mSQLiteDatabase != null && mSQLiteDatabase.isOpen()) { mSQLiteDatabase.close(); } else { Log.e(TAG, "closeAll: mSQLiteDatabase已关闭"); } } }

    实现类的创建,主要用于根据不同的数据库真正的实现对表数据的增删改查和一些复杂方法的封装

    package com.shkefu.sichouelu.db; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.util.Log; import com.shkefu.sichouelu.bean.GridViewInfo; import java.util.ArrayList; /** * GridView数据库 */ public class GridViewDB { private final String TAG = "GridViewDB"; public static final String TABLE_HOME_PAGE = "home_page_table"; public static final String TABLE_MY_PAGE = "my_page_table"; private String dbName = "GridView.db";// 数据库名 private String tableName;// 表名 private int version = 1;// 版本号 private DBManager mDBManager; private ArrayList<GridViewInfo> localDataInfos = new ArrayList<GridViewInfo>(); public GridViewDB(Context context, String tableName) { mDBManager = new DBManager(context); String sql = mDBManager.addPrimaryKey().addText("menu_id").addText("menu_logo").addText("menu_url").addText("grid_index").addText("more").getSql(); String[] tables = {TABLE_HOME_PAGE, TABLE_MY_PAGE}; String[] slqs = {sql, sql}; mDBManager.create(dbName, version, tables, slqs); this.tableName = tableName; } public static GridViewDB init(Context context, String tableName) { return new GridViewDB(context, tableName); } /** * 增加新数据 * * @param contentValues 数据源 */ public void addData(ContentValues contentValues) { mDBManager.mInsert(tableName, "menu_id", contentValues); Log.i(TAG, "delData:增加了一条数据 "); } /** * 删除一条数据 * * @param menu_id */ public void delData(String menu_id) { mDBManager.mDelete(tableName, "menu_id=?", new String[]{menu_id}); Log.i(TAG, "delData:删除了一条数据 "); } /** * 清空表中的内容 */ public void delTable() { mDBManager.mDeleteTable(tableName); } /** * 是否是空表 * * @return true 是空表 */ public boolean isEmptyTable() { if (mDBManager.getDataNum(tableName) > 0) { return false; } return true; } /** * 数据库是否存在要查询的这条数据 * * @param columnName 查询的字段 * @param data 查询的数据 * @return */ public boolean hasThisData(String columnName, String data) { return mDBManager.hasThisData(tableName, columnName, data); } /** * 本地数据库是否存在这条MenuID * * @param data 查询的数据 * @return true 有这条数据 */ public boolean hasThisMenuID(String data) { return mDBManager.hasThisData(tableName, "menu_id", data); } /** * 修改一条数据的内容 * * @param values 数据 * @param whereclause 条件 */ public void modifyData(ContentValues values, String whereclause) { mDBManager.mUpdate(tableName, values, whereclause); Log.i(TAG, "modifyData: 修改了一条数据"); } /** * 查询本地数据库的全部数据 * * @return */ public ArrayList<GridViewInfo> findAllData() { localDataInfos.clear(); Cursor cursor = mDBManager.mQueryAll(tableName, "menu_id asc"); while (cursor.moveToNext()) { String menu_id = cursor.getString(cursor.getColumnIndex("menu_id")); String menu_logo = cursor.getString(cursor.getColumnIndex("menu_logo")); String menu_url = cursor.getString(cursor.getColumnIndex("menu_url")); GridViewInfo gridViewInfo = new GridViewInfo(); gridViewInfo.setMenu_id(menu_id); gridViewInfo.setMenu_logo(menu_logo); gridViewInfo.setMenu_url(menu_url); localDataInfos.add(gridViewInfo); } mDBManager.closeAll(); return localDataInfos; } } 最后对数据源做操作时,这个类已经脱离了对数据库基础方法的使用,只需要对我们平时使用的常用方法做逻辑处理就可以了,不在需要考虑针对数据库做其它判断了。这样在编写代码时提高了代码的复用性和逻辑结构清晰性。以下代码只是对服务器返回的一个监听处理,并不是一个完整的类,最后通过对数据源的处理,实现了与服务器数据与本地数据的同步。

    private Listener<String> listener = new Listener<String>() { @Override public void onResponse(String response) { Log.i(TAG, "gridview response = " + response); try { homepageInfos.clear(); mypageInfos.clear(); JSONObject jsonObject = new JSONObject(response); if (jsonObject.has("mobileState")) { String mobileState = jsonObject.getString("mobileState"); switch (mobileState) { case "0":// 成功 //创建数据库和表 homepageDb = new GridViewDB(context, GridViewDB.TABLE_HOME_PAGE); JSONArray homepageArray = jsonObject.getJSONArray("Homepagelist"); //如果服务器没有返回数据 if (homepageArray.length() <= 0) { Log.e(TAG, "首页列表没有返回数据"); //清空表 homepageDb.delTable(); } else { for (int i = 0; i < homepageArray.length(); i++) { GridViewInfo gridViewInfo = new GridViewInfo(); JSONObject mJsonObject = homepageArray.getJSONObject(i); Log.i(TAG, "mJsonObject =" + mJsonObject.toString()); if (mJsonObject.has("menu_logo")) { menu_logo = mJsonObject.getString("menu_logo"); gridViewInfo.setMenu_logo(menu_logo); } if (mJsonObject.has("menu_url")) { menu_url = mJsonObject.getString("menu_url"); gridViewInfo.setMenu_url(menu_url); } if (mJsonObject.has("menu_id")) { menu_id = mJsonObject.getString("menu_id"); //补位 if (menu_id.length() == 1) { menu_id = "0" + menu_id; } gridViewInfo.setMenu_id(menu_id); } homepageInfos.add(gridViewInfo); } if (homepageInfos.size() > 0) { Log.v(TAG, "首页列表有返回数据"); //本地没有数据 if (homepageDb.isEmptyTable()) { for (int i = 0; i < homepageInfos.size(); i++) { menu_logo = homepageInfos.get(i).getMenu_logo(); menu_url = homepageInfos.get(i).getMenu_url(); menu_id = homepageInfos.get(i).getMenu_id(); mValues = new ContentValues(); mValues.clear(); mValues.put("menu_id", menu_id); mValues.put("menu_logo", menu_logo); mValues.put("menu_url", menu_url); //添加新数据 homepageDb.addData(mValues); } } else { //本地数据库有数据 for (int i = 0; i < homepageInfos.size(); i++) { menu_id = homepageInfos.get(i).getMenu_id(); menu_logo = homepageInfos.get(i).getMenu_logo(); menu_url = homepageInfos.get(i).getMenu_url(); mValues = new ContentValues(); mValues.clear(); mValues.put("menu_id", menu_id); mValues.put("menu_logo", menu_logo); mValues.put("menu_url", menu_url); //本地数据库有本条数据 if (homepageDb.hasThisMenuID(menu_id)) { //更新数据 homepageDb.modifyData(mValues, "menu_id = " + menu_id); } else { //添加新数据 homepageDb.addData(mValues); } } localDataInfos.clear(); localDataInfos = homepageDb.findAllData(); boolean result = false; for (int i = 0; i < localDataInfos.size(); i++) { String menu_id_local = localDataInfos.get(i).getMenu_id(); Log.v(TAG, "menu_id_local=" + menu_id_local); for (int j = 0; j < homepageInfos.size(); j++) { String menu_id_homepage = homepageInfos.get(j).getMenu_id(); Log.v(TAG, "menu_id_homepage=" + menu_id_homepage); //本地数据库是否有服务器上的这条数据 if (menu_id_local.equals(menu_id_homepage)) { result = true; break; } } //本地数据库没有服务器上的这条数据 if (!result) { //删除本地数据库中的这条数据 homepageDb.delData(menu_id_local); } result = false; } } } } mypageDb = new GridViewDB(context, GridViewDB.TABLE_MY_PAGE); JSONArray mypageArray = jsonObject.getJSONArray("Mypagelist"); //如果服务器没有返回数据 if (mypageArray.length() <= 0) { Log.e(TAG, "我的列表没有返回数据"); //清空表 mypageDb.delTable(); } else { for (int i = 0; i < mypageArray.length(); i++) { GridViewInfo gridViewInfo = new GridViewInfo(); JSONObject mJsonObject = mypageArray.getJSONObject(i); Log.i(TAG, "mJsonObject =" + mJsonObject.toString()); if (mJsonObject.has("menu_logo")) { String menu_logo = mJsonObject.getString("menu_logo"); gridViewInfo.setMenu_logo(menu_logo); } if (mJsonObject.has("menu_url")) { String menu_url = mJsonObject.getString("menu_url"); gridViewInfo.setMenu_url(menu_url); } if (mJsonObject.has("menu_id")) { String menu_id = mJsonObject.getString("menu_id"); //补位 if (menu_id.length() == 1) { menu_id = "0" + menu_id; } gridViewInfo.setMenu_id(menu_id); } mypageInfos.add(gridViewInfo); } if (mypageInfos.size() > 0) { Log.v(TAG, "我的列表有返回数据"); //本地没有数据 if (mypageDb.isEmptyTable()) { for (int i = 0; i < mypageInfos.size(); i++) { menu_logo = mypageInfos.get(i).getMenu_logo(); menu_url = mypageInfos.get(i).getMenu_url(); menu_id = mypageInfos.get(i).getMenu_id(); mValues = new ContentValues(); mValues.clear(); mValues.put("menu_id", menu_id); mValues.put("menu_logo", menu_logo); mValues.put("menu_url", menu_url); //添加新数据 mypageDb.addData(mValues); } } else { //本地数据库有数据 for (int i = 0; i < mypageInfos.size(); i++) { menu_id = mypageInfos.get(i).getMenu_id(); menu_logo = mypageInfos.get(i).getMenu_logo(); menu_url = mypageInfos.get(i).getMenu_url(); mValues = new ContentValues(); mValues.clear(); mValues.put("menu_id", menu_id); mValues.put("menu_logo", menu_logo); mValues.put("menu_url", menu_url); //本地数据库有本条数据 if (mypageDb.hasThisMenuID(menu_id)) { //更新数据 mypageDb.modifyData(mValues, "menu_id = " + menu_id); } else { //添加新数据 mypageDb.addData(mValues); } } localDataInfos.clear(); localDataInfos = mypageDb.findAllData(); boolean result = false; for (int i = 0; i < localDataInfos.size(); i++) { String menu_id_local = localDataInfos.get(i).getMenu_id(); Log.v(TAG, "menu_id_local=" + menu_id_local); for (int j = 0; j < mypageInfos.size(); j++) { String menu_id_homepage = mypageInfos.get(j).getMenu_id(); Log.v(TAG, "menu_id_homepage=" + menu_id_homepage); //本地数据库是否有服务器上的这条数据 if (menu_id_local.equals(menu_id_homepage)) { result = true; break; } } //本地数据库没有服务器上的这条数据 if (!result) { //删除本地数据库中的这条数据 mypageDb.delData(menu_id_local); } result = false; } } } } break; default: Log.e(TAG, "mobileState =" + mobileState); break; } } } catch (JSONException e) { e.printStackTrace(); UIUtils.showToast(context, StatusCode.JSON_EXCEPTION); } } };

    转载请注明原文地址: https://ju.6miu.com/read-964189.html

    最新回复(0)