/*---------------------------------------- *-描述--ORMLite框架使用总结. *-描述--S1.相关理论描述 * >>ORMlite通过Java注解的方式来建立起与数据库的映射关系,在Android面向数据库开发中,是一个比较 * 流行的开源框架,方便操作而且功能强大 * >>ORMLite的优缺点 * 优点:轻量级、使用简单、封装完善、文档全面 * 缺点:基于反射,效率较低,缺少中文翻译文档 * >> *-描述--S2.添加到项目 * >>添加库文件到项目libs下,添加为库 * ormlite-android-5.0.jar、ormlite-android-5.0-sources.jar * ormlite-core-5.0、ormlite-core-5.0-sources.jar * >>继承OrmLiteSqliteOpenHelper类定义数据库帮助类(XXXHelper) * 可以在程序被安装时创建或者升级数据库 * onCreate(SQLiteDatabase sqliteDatabase, ConnectionSource connectionSource) * onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) * >>定义实体类Bean,代表一张表(XXXModel) * @DatabaseTable:表示定义了一个数据表,如果不指定名字,在Android中会以类名作为表名, * 如packageInfo就是SQLite数据库中的表名,我们也可以指定表名,@DatabaseTable(tableName = * "tb_package") * @DatabaseField:表示定义了数据中的一个字段,id表示数据中的一个主键,如果指定为generatedId, * 表示自动增长id,我们不需要给它赋值。其他字段,可以使用columnName来指定字段名,canBeNull表 * 示是否为空,这些赋值可以按照以下来指定-(id = true, canBeNull = false)(columnName = "name") * @DatabaseField 常用注解: * columnName 指定字段名,不指定则变量名作为字段名 * canBeNull 字段是否能被分配null值。默认是true。如果你设置成false,那么你每次在数据库中 * 插入数据是都必须为这个字段提供值。 * dataType 指定字段的类型 * defaultValue 当我们在表中创建新的记录时的一个字段的默认值。默认情况下是没有这个值的 * width 字段的宽度,主要用于字符串字段。默认是0 * id 这个字段是否是id,默认是false。在一个class中只有一个成变量可以有这个值。id字段是一条 * 记录的唯一标识而且是必需的,只能在generatedId和 generatedIdSequence其中选一个。 * generatedId 字段是否自动增加。默认为false。类中的一个成员变量设置了这个值,它告诉数据库 * 每添加一条新记录都自动增加id。当一个有generatedid的对象被创建时使用Dao.create()方法 * ,数据库将为记录生成一个id,它会被返回并且被create方法设置进对象。 * generatedIdSequence 序列编号的名字,这个值在生成的时候会被使用。和generatedId相似,但是 * 你能够指定使用的序列名称。默认是没有的。 * foreign 指定这个字段的对象是一个外键,外键值是这个对象的id * persisted 指定是否持久化此变量,默认true * foreignAutoCreate 外键不存在时是否自动添加到外间表中 * foreignColumnName 外键字段指定的外键表中的哪个字段 * @ForeignCollectionField常用注解 * eager 表示该集合是在初始化这个对象的时候,是否讲对象取出还是在遍历的时候才取出,默认false * 遍历的时候才取出,size()方法也会引起遍历 * columnName * orderColumnName * foreignFieldName * >>数据库的增删查改(XXXDao) * 插入操作 * create:插入一条数据 * createIfNotExists:如果不存在则插入 * createOrUpdate:如果存在则更新 * 查询操作 * 首先调用xxxDao.queryBuilder();获得该Dao下的QueryBuilder对象 * 接下来设置QueryBuilder的查询条件 * 最后通过QueryBuilder的query方法获得List对象 * 删除和更改操作 * 与查询操作类似,ORMLite同样为我们提供了一系列的方法,同时也提供了复杂删除,复杂更 * 改的DeleteBuilder和UpdateBuilder,其用法与QueryBuilder相似 * 主要方法 * create 插入一条数据 * createIfNotExists 如果不存在则插入 * createOrUpdate 如果指定id则更新 * queryForId 更具id查找 * update 查找出数据 * delete 删除数据 * queryBuilder() 创建一个查询生成器:进行复杂查询 * deleteBuilder() 创建一个删除生成器,进程复杂条件删除 * updateBuilder() 创建修条件生成器,进行复杂条件修改 * 参考:https://www.zybuluo.com/flyouting/note/6996 *-描述--深入部分 * ORMLite外键引用 * 关联一个集合 * 参考: * http://blog.csdn.net/lmj623565791/article/details/39122981 * http://www.jianshu.com/p/05782b598cf0 * https://bng86.gitbooks.io/android-third-party-/content/ormlite.html *-描述--B1.None. * 官方网站: * http://ormlite.com/ * http://ormlite.com/releases/ * https://github.com/j256/ormlite-android * 参考文档: * http://blog.csdn.net/lmj623565791/article/details/39121377 * http://blog.csdn.net/lmj623565791/article/details/39122981 * http://www.jianshu.com/p/05782b598cf0 * https://bng86.gitbooks.io/android-third-party-/content/ormlite.html *---------------------------------------------------------------------------*/
/** * Created by envy15 on 2016/8/2. * 创建数据库表项 * 对于类中的每个需要存储的成员变量,都需要添加@DatabaseField注解 *///tableName表示创建该表的表名,不带该配置表示使用类名作为表名@DatabaseTable(tableName = "model_table")public class TestModel implements Serializable { //private final String TEST_MODEL_ID = "id"; private final String TEST_MODEL_TITLE = "modelTitle"; private final String TEST_MODEL_URL = "modelUrl"; private final String TEST_MODEL_DETAIL = "modelDetail"; private final String TEST_MODEL_COUNT = "modelCount"; private final String TEST_MODEL_STATE = "modelStatus"; private final String TEST_MODEL_ITEM = "modelItem"; //id = true 配置为主键,generatedId = true 主键自动增长 @DatabaseField(generatedId = true) public int id; //存储的成员变量添加@DatabaseField注解 @DatabaseField(columnName = TEST_MODEL_TITLE) public String modelTitle; @DatabaseField(columnName = TEST_MODEL_URL) public String modelUrl; @DatabaseField(columnName = TEST_MODEL_DETAIL) public String modelDetail; @DatabaseField(columnName = TEST_MODEL_COUNT) public int modelCount; @DatabaseField(columnName = TEST_MODEL_STATE,defaultValue = "0") public int modelStatus; //canBeNull -表示不能为null;foreign=true表示是一个外键;columnName 列名// @DatabaseField(canBeNull = true, foreign = true, columnName = TEST_MODEL_ITEM) private TestItem testItem; //以下注释未调试// //@ForeignCollectionField 表示这个表中的数据在其他表中是外键// //成员变量items的类型必须要么是ForeignCollection<T>要么是Collection<T>// @ForeignCollectionField(eager = false)// public ForeignCollection<TestItem> items; // // 外部对象字段// @DatabaseField(foreign = true, foreignAutoRefresh = true)// public PackageInfo mPackage;//// @DatabaseField(foreign = true, foreignAutoRefresh = true)// public Photographer photographer;// /**// * 这里需要注意的是:属性类型只能是ForeignCollection<T>或者Collection<T>// * 如果需要懒加载(延迟加载)可以在@ForeignCollectionField加上参数eager=false// * 这个属性也就说明一个部门对应着多个用户// */// @ForeignCollectionField(eager = true)// public ForeignCollection<Img> imgs; public TestModel() { } public TestModel(String modelTitle, String modelDetail) { this.modelTitle = modelTitle; this.modelDetail = modelDetail; } public TestModel(String modelTitle, String modelDetail, int modelStatus) { this.modelTitle = modelTitle; this.modelDetail = modelDetail; this.modelStatus = modelStatus; } public int getModelId() { return id; } public void setModelId(int modelId) { this.id = modelId; } public String getModelTitle() { return modelTitle; } public void setModelTitle(String modelTitle) { this.modelTitle = modelTitle; } public String getModelUrl() { return modelUrl; } public void setModelUrl(String modelUrl) { this.modelUrl = modelUrl; } public String getModelDetail() { return modelDetail; } public void setModelDetail(String modelDetail) { this.modelDetail = modelDetail; } public int getModelCount() { return modelCount; } public void setModelCount(int modelCount) { this.modelCount = modelCount; } public int getModelStatus() { return modelStatus; } public void setModelStatus(int modelStatus) { this.modelStatus = modelStatus; } public TestItem getTestItem() { return testItem; } public void setTestItem(TestItem testItem) { this.testItem = testItem; } @Override public String toString() { return "TestModel{" + "id=" + id + ", modelTitle=‘" + modelTitle + ‘\‘‘ + ", modelUrl=‘" + modelUrl + ‘\‘‘ + ", modelDetail=‘" + modelDetail + ‘\‘‘ + ", modelCount=" + modelCount + ", modelStatus=" + modelStatus + ‘}‘; }}
/** * Created by envy15 on 2016/8/2. * 定义数据访问对象,对指定的表进行增删改查操作 * */public class ModelDao { private Dao<TestModel, Integer> modelDao; private DBHelper dbHelper; /** * 构造方法 * 获得数据库帮助类实例,通过传入Class对象得到相应的Dao * @param context */ public ModelDao(Context context) { try { dbHelper = DBHelper.getHelper(context); modelDao = dbHelper.getDao(TestModel.class); } catch (SQLException e) { e.printStackTrace(); } } /** * 添加一条记录 * @param model */ public void add(TestModel model) { try { //LogUtil.infoE(this,"model:"+(model==null)+" modelDao:"+(modelDao==null)); modelDao.create(model); } catch (SQLException e) { e.printStackTrace(); } } /** * 删除一条记录 * @param model */ public void delete(TestModel model) { try { modelDao.delete(model); } catch (SQLException e) { e.printStackTrace(); } } /** * 更新一条记录 * @param model */ public void update(TestModel model) { try { modelDao.update(model); } catch (SQLException e) { e.printStackTrace(); } } /** * 查询一条记录 * @param id * @return */ public TestModel queryForId(int id) { TestModel model = null; try { model = modelDao.queryForId(id); } catch (SQLException e) { e.printStackTrace(); } return model; } /** * 根据模型查询匹配的记录 * @param model * @return */ public List<TestModel> queryForModel(TestModel model) { List<TestModel> mModel = null; try { mModel = modelDao.queryForMatching(model); //queryForMatching/queryForMatchingArgs查询结果一样 //mModel = modelDao.queryForMatchingArgs(model); } catch (SQLException e) { e.printStackTrace(); } return mModel; } /** * 根据模型Key-Value查询匹配的记录 * @param var1 key * @param var2 value * @return */ public List<TestModel> queryForKey(String var1, Object var2) { List<TestModel> mModel = null; try { mModel = modelDao.queryForEq(var1,var2); } catch (SQLException e) { e.printStackTrace(); } return mModel; } /** * 其他查询测试 * @param model * @return * 参考: * http://blog.csdn.net/quanjin24k/article/details/11620803 * http://www.cnblogs.com/vanezkw/archive/2012/08/15/2640290.html * http://ormlite.com/javadoc/ormlite-core/doc-files/ormlite_2.html#Class-Setup * http://www.ithao123.cn/content-8115868.html */ //public List<TestModel> queryForModel1(Map<String, Object> mMap) { public List<TestModel> queryForModel1(TestModel model) { List<TestModel> mModel = null; try { //根据Model查询 //mModel = modelDao.queryForMatching(model); //通过Key-Value查询 //mModel = modelDao.queryForEq("modelTitle","setModelTitle"); //mModel = modelDao.queryForEq("modelStatus",3);// //根据多个key-value参数查询(Map集合)// Map<String, Object> mMap = new HashMap<String, Object>();// mMap.put("modelStatus",3);// mMap.put("modelTitle","setModelTitle");// mModel = modelDao.queryForFieldValues(mMap);// mModel = modelDao.queryForFieldValuesArgs(mMap); //带排序的查询 mModel = modelDao.queryBuilder().orderBy("id",false).where().eq("modelStatus",3) .and().eq("modelTitle","setModelTitle").query();// //通过SQL语句排序查询结果// mModel = modelDao.queryBuilder().orderByRaw("sql-statement").where().eq("modelStatus",3)// .and().eq("modelTitle","setModelTitle").query(); //SQL语句查询 //modelDao.queryRaw("select * from data where id = 2"); } catch (SQLException e) { e.printStackTrace(); } return mModel; } /** * 查询所有记录 * @return */ public List<TestModel> queryForAll() { List<TestModel> models = new ArrayList<TestModel>(); try { models = modelDao.queryForAll(); } catch (SQLException e) { e.printStackTrace(); } return models; }}
/** * Created by envy15 on 2016/8/2. * 可以在程序被安装时创建或者升级数据库 * 需要实现:一个用于生成数据库,一个用于升级数据库 * onCreate(SQLiteDatabase sqliteDatabase, ConnectionSource connectionSource) * onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) */public class DBHelper extends OrmLiteSqliteOpenHelper { /** * 数据库名字 */ private static final String DB_NAME = "testModel.db"; /** * 数据库版本 */ private static final int DB_VERSION = 1; /** * 用来存放Dao的地图 */ private Map<String, Dao> daos = new HashMap<>(); private static DBHelper instance; /** * 构造方法 * @param context */ public DBHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); } /** * 这里创建表 */ @Override public void onCreate(SQLiteDatabase sqliteDatabase, ConnectionSource connectionSource) { // 创建表 try { TableUtils.createTable(connectionSource, TestModel.class); } catch (SQLException e) { e.printStackTrace(); } } /** * 这里进行更新表操作 */ @Override public void onUpgrade(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource, int oldVersion, int newVersion) { try { TableUtils.dropTable(connectionSource, TestModel.class, true); onCreate(sqLiteDatabase, connectionSource); } catch (SQLException e) { e.printStackTrace(); } } /** * 获取单例 * @param context * @return */ public static synchronized DBHelper getHelper(Context context) { context = context.getApplicationContext(); if (instance == null) { synchronized (DBHelper.class) { if (instance == null) { instance = new DBHelper(context); } } } return instance; } /** * 获取单例-数据库存贮SD目录下 * @param context * @return */ public static synchronized DBHelper getHelper(Context context,String path) { context = new DatabaseContext(context, path); if (instance == null) { synchronized (DBHelper.class) { if (instance == null) { instance = new DBHelper(context); } } } return instance; } /** * 通过类来获得指定的Dao */ 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; } /** * 释放资源 */ @Override public void close() { super.close(); for (String key : daos.keySet()) { Dao dao = daos.get(key); dao = null; } }}
public void initDatas() { //测试程序 LogUtil.infoD(this, "initViews"); LogUtil.infoE(this, "OrmLiteStartTime:"+System.currentTimeMillis()+""); TestModel testModel1 = new TestModel("setModelTitle","setModelDetail1",1); TestModel testModel2 = new TestModel("setModelTitle","setModelDetail2",2); TestModel testModel3 = new TestModel("setModelTitle","setModelDetail3",3); TestModel testModel4 = new TestModel("setModelTitle","setModelDetail4",4); TestModel testModel5 = new TestModel("setModelTitle","setModelDetail5",5); ModelDao modelDao = new ModelDao(this); //LogUtil.infoE(this,"testModel:"+(testModel==null)+" modelDao:"+(modelDao==null)); //数据库的插入操作测试 modelDao.add(testModel1); modelDao.add(testModel2); modelDao.add(testModel3); modelDao.add(testModel4); modelDao.add(testModel5); //先查询一条记录(根据ID),更改后存贮到数据库 testModel = modelDao.queryForId(5); testModel.setModelStatus(8); modelDao.update(testModel); //删除操作,删除是通过testModel ID删除 testModel.setModelId(6); modelDao.delete(testModel); //数据库的查询操作测试 List<TestModel> testModelList = modelDao.queryForAll(); for(int i=0;i<testModelList.size();i++) { LogUtil.infoE(this, testModelList.get(i).toString()); } //条件查询,根据TestModel参数匹配,TestModel设置几个参数匹配几个参数 TestModel testModel6 = new TestModel(); testModel6.setModelTitle("setModelTitle"); List<TestModel> testModelList1 = modelDao.queryForModel1(testModel6); for(int i=0;i<testModelList1.size();i++) { LogUtil.infoE(this, "条件查询"+testModelList1.get(i).toString()); } LogUtil.infoE(this, "OrmLiteStartEnd:"+System.currentTimeMillis()+"");}
时间: 2024-10-12 14:41:36