今天说的是数据库,我看了下别人大神的解决,结合我自己实际中用到的给大家讲解下ormlite数据库的使用
这个是需要导入的第三方jar包,
用过goolge的SqliteOpenHelper的都知道开始要继承OrmLiteSqliteOpenHelper这个类(这个谷歌官方的数据库有点类似)
.
重写它的onCreate(SQLiteDatabase sqliteDatabase, ConnectionSource connectionSource)创建数据库方法
和
onUpgrade(SQLiteDatabase
.
database, ConnectionSource connectionSource, int oldVersion, int newVersion)数据库升级方法
onCreate创建数据库时第一次安装你的应用onUpgrade处理数据库表当您升级的升级应用程序到一个新的版本
public class DatabaseHelper extends OrmLiteSqliteOpenHelper { /** 数据库版本号 */ private static final int DATABASE_VERSION = 2; <span style="white-space:pre"> </span>/** 数据库名称 */ <span style="white-space:pre"> </span>public static final String DATABASE_NAME = "fframework.db"; public DatabaseHelper(Context context) { super(context,DATABASE_NAME, null, DATABASE_VERSION); } private static DatabaseHelper mHelper; /** * 三分钟自动释放的 OpenHelper * * @return */ public static DatabaseHelper getOpenHelper() { // resetTimer(); // if(Thread.currentThread() == Looper.getMainLooper().getThread()){ // throw new IllegalArgumentException("主线程不能进行数据库操作!"); // } if (mHelper != null) { return mHelper; } return mHelper = OpenHelperManager.getHelper(FFApplication.app, DatabaseHelper.class); } private static Timer timer; private static int freeTime = 0;
<span style="white-space: pre;"> </span>//计时器,计时数据库在改时间内关闭
private static void resetTimer() { if (timer == null) { timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { freeTime++; if (freeTime > 180) { timer.cancel(); timer = null; freeTime = 0; mHelper.close(); mHelper = null; } } }, 1000, 1000); } else { freeTime = 0; } } <span style="white-space:pre"> </span>//创建数据库,这里创建了三个表 @Override public void onCreate(SQLiteDatabase sqliteDatabase, ConnectionSource connectionSource) { try { TableUtils.createTable(connectionSource, Queue.class); TableUtils.createTable(connectionSource, Table.class); TableUtils.createTable(connectionSource, Sound.class); Dao<Queue, Integer> dao = DaoManager.createDao(connectionSource, Queue.class); Dao<Table, Integer> dao1 = DaoManager.createDao(connectionSource, Table.class); } catch (SQLException e) { Log.e(DatabaseHelper.class.getName(), "Unable to create datbases", e); } } <span style="white-space:pre"> </span>//更新数据库 @Override public void onUpgrade(SQLiteDatabase db, ConnectionSource connectionSource, int oldVer, int newVer) { } }
- @DatabaseTable(tableName="student") tableName 表明
- public class Student {
- public static final String ID="student_id";
- public static final String NAME="student_name";
- public static final String LASTNAME="student_lastname";
- public static final String RESOURCE="student_resource";
- public static final String TEACHER_ID="tacher_id";
- @DatabaseField(generatedId=true,useGetSet=true,columnName=ID)
- private int id;
- @DatabaseField(foreignColumnName=Teacher.ID,foreign=true,foreignAutoCreate=true)
- private Teacher teacher_id;
- @DatabaseField(useGetSet=true,columnName=NAME)
- private String name;
- @DatabaseField(useGetSet=true,columnName=LASTNAME)
- private String lastName;
- @DatabaseField(useGetSet=true,columnName=RESOURCE)
- private double resource;
- 一系列的set get 方法...
cloumnName:指定字段名,不指定则变量名作为字段名 | canBeNull:是否可以为null | |
dataType:指定字段的类型 | defaultValue:指定默认值 | width:指定长度 |
id:指定字段为id | generatedId:指定字段为自增长的id,不能id,generatedIdSequence通用 | foreign 指定这个字段的对象是一个外键,外键值是这个对象的id |
useGetSet:指定ormlite访问变量使用set,get方法默认使用的是反射机制直接访问变量 | throwIfNull,如果空值抛出异常 | persisted:指定是否持久化此变量,默认true |
unique:字段值唯一 | uniqueCombo整列的值唯一 | index:索引 |
uniqueIndex 唯一索引 | foreignAutoRefresh 外键值,自动刷新 | foreignAutoCreate 外键不存在时是否自动添加到外间表中 |
foreignColumnName外键字段指定的外键表中的哪个字段 |
@ForeignCollectionField 表示这个表中的数据在其他表中是外键(其他表的某个字段使用@DatabaseField(foreignColumnName=一个表的id键名,foreign=true)
eager 表示该集合是在初始化这个对象的时候,是否讲对象取出还是在遍历的时候才取出,默认false遍历的时候才取出,size()方法也会引起遍历
这个注解注解的字段只能是ForeignCollection<T> or Collection<T> 对象
TableUtils
接下来介绍TableUtils完成对数据中的表进行创建,删除,清空表格,只要看一下它的静态方法.做过程序的应该都会
Dao<T,V>
包含两个泛型,第一个泛型表DAO操作的类,第二个表示操作类的主键类型
主要方法:
create:插入一条数据
createIfNotExists:如果不存在则插入
createOrUpdate:如果指定id则更新
queryForId:更具id查找
update 查找出数据
refresh的解释:If you want to use other elds in the Account, you must call refresh on the accountDao class to get the Account object lled in.
delte 删除数据
queryBuilder() 创建一个查询生成器:进行复杂查询
deleteBuilder() 创建一个删除生成器,进程复杂条件删除
updateBuilder() 创建修条件生成器,进行复杂条件修改
条件查找器DeleteBuilder,QueryBuilder,UpdateBuilder
查找器是帮助拼接条件语句的.比如查找器中有 where()方法 and()方法 eq()方法 lt()方法 qt()方法 between方法这些方法很直观..很容易都明了
什么意思
最后使用prepare()方法生成条件使用DAO.query || DAO.delete|| DAO.update 方法执行
可以使用查找生成器QueryBuilder 的 orderby limit offset 方法进行排序,分页,
//这块是封装了一个线程,由于操作数据库比较费时,不能放在主线程中,所以写了个线程进行操作数据库,用executTask方法会自动实现Dbtask接口中的两个方法,操作数据库的放到onExecut()方法中不耗时的操作放到onOk()方法中
private static final ExecutorService taskExecutor = Executors .newSingleThreadExecutor(); public static interface DbTask { void onExecut(); void onOK(); } private static class Execution implements Runnable { private DbTask task; public Execution(DbTask task) { this.task = task; } @Override public void run() { task.onExecut(); FFApplication.runOnUiThread(new CallBack(task)); } } private static class CallBack implements Runnable { private DbTask task; public CallBack(DbTask task) { this.task = task; } @Override public void run() { task.onOK(); } } public static void executTask(final DbTask task) { taskExecutor.execute(new Execution(task)); }