安卓ORMLite数据库框架

以前使用过安卓自带的sqlite数据库,但是是使用原生的方法实现的,最近接触到的项目是使用ORMLite框架实现的,感觉很好用,能够提高开发效率,而事实上,ormlite框架对数据的增删改查也是要优于原生的。

一、Gradle: compile 'com.j256.ormlite:ormlite-android:4.48'

二、创建DataBase

创建名为info.db的数据库 ,我这里只有一张表 基于StudentModel。

public class DatabaseHelper extends OrmLiteSqliteOpenHelper {

    public static final int version = 1;

    private static DatabaseHelper instance;

    private DatabaseHelper(Context context) {
        super(context, "info.db", null, version);
    }

    public static DatabaseHelper getInstance(Context context) {
        if (instance == null) {
            synchronized (DatabaseHelper.class) {
                if (instance == null) {
                    instance = new DatabaseHelper(context);
                }
            }
        }
        return instance;
    }

    public static void release() {
        synchronized (DatabaseHelper.class) {
            instance = null;
        }
    }

    @Override
    public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) {
        try {
            TableUtils.createTable(connectionSource, StudentModel.class);
        } catch (SQLException e) {
        }
    }

    @Override
    public void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) {

    }
}

需要使用Dao层对数据库进行操作,下面是一个封装的Dao方法:
public class DaoProvider {
    private Map<Class,BaseDao> mDaoMap;
    private static DaoProvider ourInstance = new DaoProvider();

    public static DaoProvider getInstance() {
        return ourInstance;
    }

    private DaoProvider() {
        mDaoMap = new HashMap<>();
    }

    public void clear() {
        DatabaseHelper.release();
        mDaoMap.clear();
    }

    public synchronized <T extends BaseDao> T getDao(Class<T> clazz) {
        if (!mDaoMap.containsKey(clazz)) {
            try {
                T dao = clazz.newInstance();
                mDaoMap.put(clazz, dao);
            } catch (Exception e) {
                throw new IllegalStateException("创建dao失败:" + clazz);
            }
        }
        return (T) mDaoMap.get(clazz);
    }

}

三、数据模型(数据表)

新建一个StudentModel.class 

StudentModel类上添加@DatabaseTable(tableName = "student"),标明这是数据库中的一张表。对应的这张表中的每一个字段,需要添加@DatabaseField注解,例如@DatabaseField(columnName = "name"),columnName 标明了字段名,即字段在数据中的列名。

@DatabaseTable (tableName = "student")
public class StudentModel extends BaseModel {
    @DatabaseField (columnName = "name",useGetSet = true)
    private String name;
    @DatabaseField (columnName = "age" ,useGetSet = true)
    private int age;

    @DatabaseField(columnName = "tel",useGetSet = true)
    private String rel;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getRel() {
        return rel;
    }

    public void setRel(String rel) {
        this.rel = rel;
    }
}

这里StudentModel继承了BaseModel,因为我们擦欧洲哦数据库一般有多张表,共同的字段比如create_time、update_time等搞一个父类方便管理。

public class BaseModel implements Serializable {

    public static final String ID = "id";
    public static final String CREATE_TIME = "create_time";
    public static final String UPDATE_TIME = "update_time";
    public static final String DELETED = "deleted";

    @DatabaseField(id = true, useGetSet = true,columnName = ID)
    private String id;

    @DatabaseField(format = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", columnName = CREATE_TIME, useGetSet = true)
    private Date createTime;

    @DatabaseField(format = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", columnName = UPDATE_TIME, useGetSet = true)
    private Date updateTime;

    @DatabaseField(columnName = DELETED,useGetSet = true)
    private int deleted;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public Date getCreateTime() {
        return copyDate(createTime);
    }

    public void setCreateTime(Date createTime) {
        this.createTime = copyDate(createTime);
    }

    public Date getUpdateTime() {
        return copyDate(updateTime);
    }

    public void setUpdateTime(Date updateTime) {
        this.updateTime = copyDate(updateTime);
    }

    public int getDeleted() {
        return deleted;
    }

    public void setDeleted(int deleted) {
        this.deleted = deleted;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        BaseModel baseModel = (BaseModel) o;

        return id != null ? id.equals(baseModel.id) : baseModel.id == null;

    }

    @Override
    public int hashCode() {
        return id != null ? id.hashCode() : 0;
    }

    public  Date copyDate(Date date) {
        return date == null ? null : new Date(date.getTime());
    }
}

四、Model的Dao

对应StudentModel的StudentDao,我这里只实现了查询方法,比如insert等方法在BaseDao中实现

public class StudentDao extends BaseDao<StudentModel>{
    public StudentDao() throws SQLException {
        super();
    }

    public List<StudentModel> queryAll( ) {
        try {
            return getDao().queryBuilder().query();
        } catch (SQLException e) {
        }
        return null;
    }

}
BaseDao:为了方便使用,通过上下文的工具类AppContextUtils.getContext()来获得context

public class BaseDao<T extends BaseModel> {
    protected DatabaseHelper mHelper;
    protected Dao<T, String> mDao;

    public BaseDao() throws SQLException {
        try {
            mHelper = DatabaseHelper.getInstance(AppContextUtils.getContext());
            mDao = mHelper.getDao(getTClass());
        }catch (SQLException e){
            e.printStackTrace();
        }
    }

    public SQLiteDatabase getDb() {
        return mHelper.getWritableDatabase();
    }

    public FieldType[] getStableTableColumn() {
        TableInfo tableInfo = null;
        FieldType[] fieldTypes = null;
        try {
            tableInfo = new TableInfo(getDao().getConnectionSource(), (BaseDaoImpl)getDao(), getTClass());
            fieldTypes = tableInfo.getFieldTypes();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return fieldTypes;
    }

    public boolean addColumn(String tableName, String columnName, String columnSpec) {
        mHelper.getWritableDatabase().execSQL(String.format("ALTER TABLE %s ADD %s %s", tableName, columnName, columnSpec));
        return true;
    }

    public String[] getColumns(String tableName) {
        Cursor cursor = mHelper.getWritableDatabase().rawQuery(String.format("select * from %s where id=1", tableName), null);
        String[] columnNames = cursor.getColumnNames();
        return columnNames;
    }

    public Dao<T, String> getDao() {
        return mDao;
    }

    public boolean isExist(T model) throws SQLException {
        if (model == null || model.getId() == null) {
            return false;
        } else {
            return mDao.queryForId(model.getId()) != null;
        }
    }

    public int add(T model) throws SQLException {
        if (model.getId() == null) {
            model.setId(UUID.randomUUID().toString());
        }
        if (model.getCreateTime() == null) {
            model.setCreateTime(new Date());
        }
        if (model.getUpdateTime() == null) {
            model.setUpdateTime(new Date());
        }

        return mDao.create(model);
    }

    public synchronized Dao.CreateOrUpdateStatus addOrUpdate(T model) throws SQLException {
        if (isExist(model)) {
            return new Dao.CreateOrUpdateStatus(false, true, update(model));
        } else {
            return new Dao.CreateOrUpdateStatus(true, false, add(model));
        }
    }

    public int delete(T model) throws SQLException {
        return mDao.delete(model);
    }

    public int deleteById(String id) throws SQLException {
        return mDao.deleteById(id);
    }

    public int update(T model) throws SQLException {
        model.setUpdateTime(new Date());
        return mDao.update(model);
    }

    public long querySize() throws SQLException {
        return mDao.countOf();
    }

    public T query(String id) throws SQLException {
        return mDao.queryForId(id);
    }

    public List<T> queryAll() throws SQLException {
        return mDao.queryForAll();
    }

    protected Class<T> getTClass() {
        return  (Class<T>) ((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    }
}


AppContextUtils:需要在使用前调用init方法

public class AppContextUtils {
    private static Context sAppContext;
    private static long millTime = 0L;

    private AppContextUtils() {
    }

    public static void init(Context ctx) {
        sAppContext = ctx.getApplicationContext();
    }

    public static Context getContext() {
        return sAppContext;
    }

    public static Context getContext(Context context) {
        return context != null?context:sAppContext;
    }

    public static long getMafInitMilTime() {
        return millTime;
    }

    public static void setMafInitMilTime(long setMillTime) {
        millTime = setMillTime;
    }
}

五、数据操作

铺垫了这么多,都是为了方便数据库扩展,接下来的方法就是对数据库进行操作

public class DatabaseService {

    private StudentDao studentDao;
    private static DatabaseService sInstance;

    private DatabaseService(){
        studentDao = DaoProvider.getInstance().getDao(StudentDao.class);
    }

    public static synchronized DatabaseService getInstance() {
        if (sInstance == null) {
                sInstance = new DatabaseService();
        }
        return sInstance;
    }

    public void reSet(){
        studentDao = null;
        sInstance = null;
    }

    public boolean insertOrUpdateMeeting(StudentModel meetingModel) {
        try {
            Dao.CreateOrUpdateStatus createOrUpdateStatus = studentDao.addOrUpdate(meetingModel);
            return createOrUpdateStatus.getNumLinesChanged() == 1;
        } catch (SQLException e) {
        }
        return false;
    }

    public List<StudentModel> search() {
            return  studentDao.queryAll();
    }
}

在MainActivity调用
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    private Button mBtnAdd;
    private Button mBtnSearch;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mBtnAdd = (Button)findViewById(R.id.button);
        mBtnAdd.setOnClickListener(this);
        mBtnSearch = (Button)findViewById(R.id.button2);
        mBtnSearch.setOnClickListener(this);
        AppContextUtils.init(MainActivity.this);
    }

    @Override
    public void onClick(View view) {
        if (view==mBtnAdd){
            StudentModel studentModel  = new StudentModel();
            studentModel.setName("swd");
            DatabaseService.getInstance().insertOrUpdateMeeting(studentModel);
            return;
        }
        if (view == mBtnSearch){
            List<StudentModel> studentModels = new ArrayList<StudentModel>();
            studentModels = DatabaseService.getInstance().search();
            studentModels.clear();
        }
    }
}

关于数据库更新

关于Android数据库升级的实践(以ormlite为例) 点击打开链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值