1. 程式人生 > >Android 使用sqlite時 可以用到的2個工具類

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