如果想通过类继承了SQLiteOpenHelper,然后一次创建多个表,是不能在其它类中连续调用创建表的,第二张表是不能够被创建的,必须要在Helper的类中创建,就是在onCreate时创建表。
以下代码抽取程序中的部分代码,仅供参考,本人还在学习中,虽然网上已经有很多成熟的框架可以使用,但还是想研究一下,希望高手指教,不喜勿喷!
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已关闭"); } } }
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); } } };