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 =