安卓数据库ORMLite框架总结

/*---------------------------------------- *-描述--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

安卓数据库ORMLite框架总结的相关文章

Android—Ormlite框架简单的操作数据库

大家在Android项目中或多或少的都会使用数据库,为了提高我们的开发效率,当然少不了数据库ORM框架了,尤其是某些数据库操作特别频繁的app:本篇博客将详细介绍ORMLite的简易用法. 下面开始介绍ORMLite的入门用法~ 1.下载 ORMLite Jar 首先去ORMLite官网下载jar包,对于Android为:ormlite-android-5.0.jar 和 ormlite-core-5.0.jar : ps:访问不了的朋友,文章末尾会把jar.源码.doc与本篇博客例子一起打包提

[BUG集] android 安卓项目中ORMLITE框架 Must specify one of id, generatedId, and generatedIdSequence with Id

使用ORM框架ORMLITE有一段时间,今天在操作一个对象的时候,重新运行报错如下: Must specify one of id, generatedId, and generatedIdSequence with Id 翻译:意思大概也就是必须要有其中一个  id  / generatedId / generatedIdSequence 再上下我的对象的源码: @DatabaseField(columnName = PaymentTempUploadTable.COLUMN_ID, id =

Android ORMLite 框架的入门用法

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/39121377 大家在Android项目中或多或少的都会使用数据库,为了提高我们的开发效率,当然少不了数据库ORM框架了,尤其是某些数据库操作特别频繁的app:本篇博客将详细介绍ORMLite的简易用法. 下面开始介绍ORMLite的入门用法~ 1.下载 ORMLite Jar 首先去ORMLite官网下载jar包,对于Android为:ormlite-android-4.48.

Android 快速开发系列 ORMLite 框架的使用

上一篇已经对ORMLite框架做了简单的介绍:Android ORMLite 框架的入门用法~~本篇将介绍项目可能会使用到的一些用法,也为我们的使用ORMLite框架总结出一个较合理的用法. 通过上一篇的了解,我们使用ORMLite,需要自己写一个DatabaseHelper去继承OrmLiteSqliteOpenHelper,下面我们首先给出一个我认为比较靠谱的Helper的写法: 1.DatabaseHelper package com.zhy.zhy_ormlite.db; import

Android 数据库ORM框架GreenDao学习心得及使用总结&lt;一&gt;

Android 数据库ORM框架GreenDao学习心得及使用总结<一> 转: http://www.it165.net/pro/html/201401/9026.html 最近在对开发项目的性能进行优化.由于项目里涉及了大量的缓存处理和数据库运用,需要对数据库进行频繁的读写.查询等操作.因此首先想到了对整个项目的数据库框架进行优化. 原先使用android本身内置的sqllite,也就是用的最基本的SQLiteOpenHelper方法,这种方法对自己来说比较方便易懂.但是在使用过程中感觉很繁

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

上一篇已经对ORMLite框架做了简单的介绍:Android ORMLite 框架的入门用法~~本篇将介绍项目可能会使用到的一些用法,也为我们的使用ORMLite框架总结出一个较合理的用法. 通过上一篇的了解,我们使用ORMLite,需要自己写一个DatabaseHelper去继承OrmLiteSqliteOpenHelper,下面我们首先给出一个我认为比较靠谱的Helper的写法: 1.DatabaseHelper [java] view plaincopy package com.zhy.z

[iOS]数据库第三方框架FMDB详细讲解

[iOS]数据库第三方框架FMDB详细讲解 初识FMDB iOS中原生的SQLite API在进行数据存储的时候,需要使用C语言中的函数,操作比较麻烦.于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.PlausibleDatabase.sqlitepersistentobjects等. FMDB是一款简洁.易用的封装库.因此,在这里推荐使用第三方框架FMDB,它是对libsqlite3框架的封装,用起来的步骤与SQLite使用类似,并且它对于多线程的并发操作进行了处理,所以

数据库逆向框架代码生成工具:MyBatis Generator的使用

MyBatis Generator的详细介绍http://mybatis.github.io/generator/index.html MyBatis Generator  With Maven http://mybatis.github.io/generator/running/runningWithMaven.html 1前言 前段时间根据工作需要,使用Spring+Mybatis完成了一个功能模块,领导推荐了MyBatis Generator(以下简称为MBG),可以逆向生成持久层的基本代

“Zhuang.Data”轻型数据库访问框架(二)框架的入口DbAccessor对象

目录: “Zhuang.Data”轻型数据库访问框架(一)开篇介绍 “Zhuang.Data”轻型数据库访问框架(二)框架的入口DbAccessor对象 先来看一段代码 DbAccessor dba = DbAccessor.Create(); var dt = dba.QueryDataTable("select * from sys_product where productid=#Id#",new {Id=1}); Console.WriteLine(DataTableUtil.