Android 快速开发系列 ORMLite 框架最佳实践

转载请标明出处:,,本文出自【张鸿洋的博客】

上一篇已经对ORMLite框架做了简单的介绍:Android ORMLite 框架的入门用法~~本篇将介绍项目可能会使用到的一些用法,也为我们的使用ORMLite框架总结出一个较合理的用法。

通过上一篇的了解,我们使用ORMLite,需要自己写一个DatabaseHelper去继承OrmLiteSqliteOpenHelper,下面我们首先给出一个我认为比较靠谱的Helper的写法:

1、DatabaseHelperpackage com.zhy.zhy_ormlite.db;import java.sql.SQLException;import java.util.HashMap;import java.util.Map;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper;import com.j256.ormlite.dao.Dao;import com.j256.ormlite.support.ConnectionSource;import com.j256.ormlite.table.TableUtils;import com.zhy.zhy_ormlite.bean.Article;import com.zhy.zhy_ormlite.bean.Student;import com.zhy.zhy_ormlite.bean.User;public class DatabaseHelper extends OrmLiteSqliteOpenHelper{private static final String TABLE_NAME = "sqlite-test.db";private Map<String, Dao> daos = new HashMap<String, Dao>();private DatabaseHelper(Context context){super(context, TABLE_NAME, null, 4);}@Overridepublic void onCreate(SQLiteDatabase database,ConnectionSource connectionSource){try{TableUtils.createTable(connectionSource, User.class);TableUtils.createTable(connectionSource, Article.class);TableUtils.createTable(connectionSource, Student.class);} catch (SQLException e){e.printStackTrace();}}@Overridepublic void onUpgrade(SQLiteDatabase database,ConnectionSource connectionSource, int oldVersion, int newVersion){try{TableUtils.dropTable(connectionSource, User.class, true);TableUtils.dropTable(connectionSource, Article.class, true);TableUtils.dropTable(connectionSource, Student.class, true);onCreate(database, connectionSource);} catch (SQLException e){e.printStackTrace();}}private static DatabaseHelper instance;/** * 单例获取该Helper * * @param context * @return */public static synchronized DatabaseHelper getHelper(Context context){context = context.getApplicationContext();if (instance == null){synchronized (DatabaseHelper.class){if (instance == null)instance = new DatabaseHelper(context);}}return instance;}public synchronized Dao getDao(Class clazz) throws SQLException{Dao dao = null;String className = clazz.getSimpleName();if (daos.containsKey(className)){dao = daos.get(className);}if (dao == null){dao = super.getDao(clazz);daos.put(className, dao);}return dao;}/** * 释放资源 */@Overridepublic void close(){super.close();for (String key : daos.keySet()){Dao dao = daos.get(key);dao = null;}}}1、整个DatabaseHelper使用单例只对外公布出一个对象,保证app中只存在一个SQLite Connection , 参考文章:

2、我们对每个Bean创建一个XXXDao来处理当前Bean的数据库操作,当然真正去和数据库打交道的对象,通过上面代码中的getDao(T t)进行获取

getDao为一个泛型方法,会根据传入Class对象进行创建Dao,并且使用一个Map来保持所有的Dao对象,只有第一次调用时才会去调用底层的getDao()。

2、Bean的Daopackage com.zhy.zhy_ormlite.db;import java.sql.SQLException;import android.content.Context;import com.j256.ormlite.dao.Dao;import com.zhy.zhy_ormlite.bean.User;public class UserDao{private Context context;private Dao<User, Integer> userDaoOpe;private DatabaseHelper helper;public UserDao(Context context){this.context = context;try{helper = DatabaseHelper.getHelper(context);userDaoOpe = helper.getDao(User.class);} catch (SQLException e){e.printStackTrace();}}/** * 增加一个用户 * @param user */public void add(User user){try{userDaoOpe.create(user);} catch (SQLException e){e.printStackTrace();}}//…other operations}我们的所有的XXXDao遵循以上的风格~

好了,基本了解了我们的代码的结构~~ps:如果觉得不合理可以留言指出,如果觉得不能接收,直接忽略。。。

3、ORMLite外键引用

现在我们有两张表一张User,一张Article;

Article中当然需要存储User的主键,作为关联~~那么在ORMLite中如何做到呢?

可能有人会直接在Article中声明一个int类型userId属性,当作普通属性处理搞定,这种做法并没有做,但是没有体现出面向对象的思想。

面向对象是这样的:Article属于某个User

类这么定义:

package com.zhy.zhy_ormlite.bean;import com.j256.ormlite.field.DatabaseField;import com.j256.ormlite.table.DatabaseTable;@DatabaseTable(tableName = "tb_article")public class Article{@DatabaseField(generatedId = true)private int id;@DatabaseFieldprivate String title;@DatabaseField(canBeNull = true, foreign = true, columnName = "user_id")private User user;public int getId(){return id;}public void setId(int id){this.id = id;}public String getTitle(){return title;}public void setTitle(String title){this.title = title;}public User getUser(){return user;}public void setUser(User user){this.user = user;}@Overridepublic String toString(){return "Article [id=" + id + ", title=" + title + ", user=" + user+ "]";}}不会去定义一个int类型的userId,而是直接定义一个User成员变量,表示本Article属于该User;

然后在User user属性上添加:@DatabaseField(canBeNull = true, foreign = true, columnName = "user_id")

canBeNull -表示不能为null;foreign=true表示是一个外键;columnName 列名

“人无完人金无足赤”,只要是人就不会是完美的,

Android 快速开发系列 ORMLite 框架最佳实践

相关文章:

你感兴趣的文章:

标签云: