今天说的是数据库,我看了下别人大神的资料,结合我自己实际中用到的给大家讲解下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;
//计时器,计时数据库在改时间内关闭
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;
}
}
/创建数据库,这里创建了三个表
@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);
}
}
//更新数据库
@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 方法进行排序,分页,
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));
}