android Sqlite的简单封装和使用

本文介绍了如何在Android中创建SQLiteOpenHelper子类,并在onCreate中创建数据库表。此外,还讨论了如何构建Helper类生成数据库和表,管理类进行数据库的增删改查封装,以及实现类对具体数据库操作的细化封装。这是一个学习和理解Android SQLite数据库操作的基础教程。
摘要由CSDN通过智能技术生成

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 = 
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一个简单的基于AndroidSqlite数据库的操作封装,它有如下的好处:便捷地创建表和增添表字段灵活的数据类型处理通过操作对象来insert或者update表记录支持多种查询方式,支持多表自定义的复杂查询,支持分页查询支持事务快速开始:    1. 设计表:@Table(name="t_user") public class UserModel {     @Table.Column(name="user_id",type=Column.TYPE_INTEGER,isPrimaryKey=true)     public Integer userId;     @Table.Column(name="user_name",type=Column.TYPE_STRING,isNull=false)     public String userName;     @Table.Column(name="born_date",type=Column.TYPE_TIMESTAMP)     public Date bornDate;     @Table.Column(name="pictrue",type=Column.TYPE_BLOB)     public byte[] pictrue;     @Table.Column(name="is_login",type=Column.TYPE_BOOLEAN)     public Boolean isLogin;     @Table.Column(name="weight",type=Column.TYPE_DOUBLE)     public Double weight; }2. 初始化对象:SQLiteDatabase db = context.openOrCreateDatabase("test.db", Context.MODE_PRIVATE, null); DbSqlite dbSqlite = new DbSqlite(db); IBaseDao userDAO = DaoFactory.createGenericDao(dbSqlite, UserModel.class);3. 创建表:userDAO.createTable(); 4. Insert 记录:UserModel user = new UserModel(); user.userName = "darcy"; user.isLogin = true; user.weight = 60.5; user.bornDate = new Date(); byte[] picture = {0x1,0x2,0x3,0x4}; user.pictrue = picture; userDAO.insert(user);5. Update 记录:UserModel user = new UserModel(); user.weight = 88.0; userDAO.update(user, "user_name=?", "darcy");6. 查询://单条结果查询 UserModel user = userDAO.queryFirstRecord("user_name=?", "darcy"); //一般查询 List userList = userDAO.query("user_name=? and weight > ?", "darcy" , "60"); //分页查询 PagingList pagingList = userDAO.pagingQuery(null, null, 1, 3);7. 事务支持:DBTransaction.transact(mDb, new DBTransaction.DBTransactionInterface() {         @Override         public void onTransact() {             // to do                 } };8. 更新表(目前只支持添加字段)@Table(name="t_user" , version=2) //修改表版本 public class UserModel {     //members above...     //new columns     @Table.Column(name="new_column_1",type=Column.TYPE_INTEGER)     public Integer newColumn;     @Table.Column(name="new_column_2",type=Column.TYPE_INTEGER)     public Integer newColumn2; } userDAO.updateTable();缺点和不足:还没支持多对一或者一多的关系没支持联合主键没支持表的外键设计其他...实例:SqliteLookup(Android内查看Sqlite数据库利器): https://github.com/YeDaxia/SqliteLookup 标签:SQLiteUtils
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值