android 数据库使用之OrmLite

今天说的是数据库,我看了下别人大神的解决,结合我自己实际中用到的给大家讲解下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) {
	}

}


  1. @DatabaseTable(tableName="student")  tableName 表明  
  2. public class Student {  
  3.     public static final String ID="student_id";  
  4.     public static final String NAME="student_name";  
  5.     public static final String LASTNAME="student_lastname";  
  6.     public static final String RESOURCE="student_resource";   
  7.     public static final String TEACHER_ID="tacher_id";  
  8.     @DatabaseField(generatedId=true,useGetSet=true,columnName=ID)     
  9.     private int id;  
  10.     @DatabaseField(foreignColumnName=Teacher.ID,foreign=true,foreignAutoCreate=true)  
  11.     private Teacher teacher_id;  
  12.     @DatabaseField(useGetSet=true,columnName=NAME)    
  13.     private String name;  
  14.     @DatabaseField(useGetSet=true,columnName=LASTNAME)  
  15.     private String lastName;  
  16.     @DatabaseField(useGetSet=true,columnName=RESOURCE)  
  17.     private double  resource;  
  18.  一系列的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));
 }



郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。