Android 使用sqlite时 可以用到的2个工具类

package com.xu.my.util.database;

/**
 * Created by xuguang on 14-11-30.
 */
public class Column {
    public static enum Constraint {
        UNIQUE("UNIQUE"),
        NOT("NOT"),
        NULL("NULL"),
        CHECK("CHECK"),
        FOREIGN_KEY("FOREIGN KEY"),
        PRIMARY_KEY("PRIMARY KEY");

        private String value;

        private Constraint(String value) {
            this.value = value;
        }

        @Override
        public String toString() {
            return value;
        }
    }

    public static enum DataType {
        NULL, INTEGER, REAL, TEXT, BLOB
    }

    private String mColumnName;

    private Constraint mConstraint;

    private DataType mDataType;

    public Column(String mColumnName, DataType mDataType, Constraint mConstraint) {
        this.mColumnName = mColumnName;
        this.mDataType = mDataType;
        this.mConstraint = mConstraint;
    }

    public String getmColumnName() {
        return mColumnName;
    }

    public Constraint getmConstraint() {
        return mConstraint;
    }

    public DataType getmDataType() {
        return mDataType;
    }
}


这个Column类封装了 sqlite3 存储数据的类型  和 存储数据的约束条件


sqlite3存储数据的类型
NULL:标识一个NULL值
INTERGER:整数类型
REAL:浮点数
TEXT:字符串
BLOB:二进制数

sqlite3存储数据的约束条件
Sqlite常用约束条件如下:
PRIMARY KEY - 主键:
1)主键的值必须唯一,用于标识每一条记录,如学生的学号
2)主键同时也是一个索引,通过主键查找记录速度较快
3)主键如果是整数类型,该列的值可以自动增长
NOT NULL - 非空:
约束列记录不能为空,否则报错
UNIQUE - 唯一:
除主键外,约束其他列的数据的值唯一
CHECK - 条件检查:
约束该列的值必须符合条件才可存入
DEFAULT - 默认值:
列数据中的值基本都是一样的,这样的字段列可设为默认值

这没有外键约束是因为 在sqlite3会解析外键约束但是不会去执行它,我们如果要在sqlite 里建立外键 需要写3个触发器 insert updata delete 操作之前的触发器



SQLiteTable.java :

package com.xu.my.util.database;

import android.database.sqlite.SQLiteDatabase;
import android.provider.BaseColumns;

import java.util.ArrayList;

/**
 * Created by xuguang on 14-11-30.
 */
public class SQLiteTable {
    String mTableName;

    ArrayList<Column> mColumnsDefinitions = new ArrayList<Column>();

    public String getmTableName(){
        return mTableName;
    }

    /**
     * aotu add primary key BaseColumns._ID
     *
     * @param mTableName
     */
    public SQLiteTable(String mTableName){
        this.mTableName=mTableName;
        mColumnsDefinitions.add(new Column(BaseColumns._ID,
                Column.DataType.INTEGER,
                Column.Constraint.PRIMARY_KEY));
    }

    public SQLiteTable addColum(Column columnsDefinition){
        mColumnsDefinitions.add(columnsDefinition);
        return  this;
    }

    public SQLiteTable addColum(String columnName,Column.DataType dataType){
        mColumnsDefinitions.add(new Column(columnName,dataType,null));
        return this;
    }

    public SQLiteTable addColumn(String columnName, Column.Constraint constraint,
                                 Column.DataType dataType) {
        mColumnsDefinitions.add(new Column(columnName, dataType, constraint));
        return this;
    }

    public void create(SQLiteDatabase db){
        String formatter = " %s";
        StringBuilder stringBuilder= new StringBuilder();
        stringBuilder.append("CREATE TABLE IF NOT EXISTS");
        stringBuilder.append(mTableName);
        stringBuilder.append("(");
        int columnCount = mColumnsDefinitions.size();
        int index = 0;
        for(Column columnDefinition : mColumnsDefinitions){
            stringBuilder.append(columnDefinition.getmColumnName()).append(
                    String.format(formatter,columnDefinition.getmDataType().name()));
            Column.Constraint constraint=columnDefinition.getmConstraint();

            if(constraint != null){
                stringBuilder.append(String.format(formatter,constraint.toString()));
            }

            if(index < columnCount-1){
                stringBuilder.append(",");
            }
            index++;
        }
        stringBuilder.append(");");
        db.execSQL(stringBuilder.toString());
    }

    public void delete(final SQLiteDatabase db) {
        db.execSQL("DROP TABLE IF EXISTS " + mTableName);
    }
}


这个SQLiteTable类是用来键表的 里面create 就是建立表

如果我们要建立表就可以这样:

public static final SQLiteTable TABLE = new SQLiteTable(TABLE_NAME)
                .addColum(ID, Column.DataType.INTEGER)
                .addColum(CATEGORY,Column.DataType.INTEGER)
                .addColum(JSON,Column.DataType.TEXT);
        }

TABLE.create(db);

这里需要提醒的是: sqlite

REATE TABLE IF NOT EXISTS
这条建表语句是 当表不存在时就创建. 如果我们使用
REATE TABLE
如果有这张表 这个会返回错误.


Android studio交流QQ群: 375815591 欢迎..


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值