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 欢迎..