Android数据库框架-----ORMLite关联表的使用

来源:互联网 发布:声音模拟软件下载 编辑:程序博客网 时间:2024/05/29 03:15

上一篇已经对ORMLite框架做了简单的介绍:Android数据库框架-----ORMLite 的基本用法~~本篇将介绍项目可能会使用到的一些用法,也为我们的使用ORMLite框架总结出一个较合理的用法。

 

本文主要介绍两表相互关联的使用,如同外键,相互的查询功能;

创建 User和Article类

@DatabaseTable(tableName = "tb_user")public class User {    @DatabaseField(generatedId = true)    private int id;    @DatabaseField(columnName = "name")    private String name;    @ForeignCollectionField    private Collection<Article> articles;    public Collection<Article> getArticles()    {        return articles;    }    public void setArticles(Collection<Article> articles)    {        this.articles = articles;    }    public User()    {    }    public int getId()    {        return id;    }    public void setId(int id)    {        this.id = id;    }    public String getName()    {        return name;    }    public void setName(String name)    {        this.name = name;    }    @Override    public String toString()    {        return "User [id=" + id + ", name=" + name + ", articles=" + articles                + "]";    }}

@ForeignCollectionFieldprivate Collection<Article> articles;
每个User关联一个或多个Article,如果我在User中声明一个Collection<Article> articles,我能否在查询User的时候,一并能够获取到articles的值。
@DatabaseTable(tableName = "tb_article")public class Article{    @DatabaseField(generatedId = true)    private int id;    @DatabaseField    private String title;    @DatabaseField(canBeNull = true, foreign = true, columnName = "user_id", foreignAutoRefresh = true)    private User user;    public int getId()    {        return id;    }    public void setId(int id)    {        this.id = id;    }    public String getTitle()    {        return title;    }    public void setTitle(String title)    {        this.title = title;    }    public User getUser()    {        return user;    }    public void setUser(User user)    {        this.user = user;    }    @Override    public String toString()    {        return "Article [id=" + id + ", title=" + title + ", user=" + user                + "]";    }}

在user属性的注解上:@DatabaseField(canBeNull = true, foreign = true, columnName = "user_id", foreignAutoRefresh = true)

添加foreignAutoRefresh =true,这样;当调用queryForId时,拿到Article对象则直接携带了user;

 

 DatabaseHelpe.java

public class DatabaseHelper extends OrmLiteSqliteOpenHelper{    private static final String TABLE_NAME = "sqlite-test.db";    private Map<String, Dao> daos = new HashMap<String, Dao>();    private DatabaseHelper(Context context)    {        super(context, TABLE_NAME, null, 4);    }    @Override    public void onCreate(SQLiteDatabase database,            ConnectionSource connectionSource)    {        try        {            TableUtils.createTable(connectionSource, User.class);            TableUtils.createTable(connectionSource, Article.class);        } catch (SQLException e)        {            e.printStackTrace();        }    }    @Override    public void onUpgrade(SQLiteDatabase database,            ConnectionSource connectionSource, int oldVersion, int newVersion)    {        try        {            TableUtils.dropTable(connectionSource, User.class, true);            TableUtils.dropTable(connectionSource, Article.class, true);            onCreate(database, connectionSource);        } catch (SQLException e)        {            e.printStackTrace();        }    }    private static DatabaseHelper instance;    /**     * 单例获取该Helper     *      * @param context     * @return     */    public static synchronized DatabaseHelper getHelper(Context context)    {        context = context.getApplicationContext();        if (instance == null)        {            synchronized (DatabaseHelper.class)            {                if (instance == null)                    instance = new DatabaseHelper(context);            }        }        return instance;    }    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;        }    }}

Userdao操作类

public class UserDao{    private Context context;    private Dao<User, Integer> userDaoOpe;    private DatabaseHelper helper;    public UserDao(Context context)    {        this.context = context;        try        {            helper = DatabaseHelper.getHelper(context);            userDaoOpe = helper.getDao(User.class);        } catch (SQLException e)        {            e.printStackTrace();        }    }    /**     * 增加一个用户     *      * @param user     * @throws SQLException     */    public void add(User user)     {        /*//事务操作        TransactionManager.callInTransaction(helper.getConnectionSource(),                new Callable<Void>()                {                    @Override                    public Void call() throws Exception                    {                        return null;                    }                });*/        try        {            userDaoOpe.create(user);        } catch (SQLException e)        {            e.printStackTrace();        }    }    public User get(int id)    {        try        {            return userDaoOpe.queryForId(id);        } catch (SQLException e)        {            e.printStackTrace();        }        return null;    }}
ArticleDao操作类
public class ArticleDao{    private Dao<Article, Integer> articleDaoOpe;    private DatabaseHelper helper;    @SuppressWarnings("unchecked")    public ArticleDao(Context context)    {        try        {            helper = DatabaseHelper.getHelper(context);            articleDaoOpe = helper.getDao(Article.class);        } catch (SQLException e)        {            e.printStackTrace();        }    }    /**     * 添加一个Article     *      * @param article     */    public void add(Article article)    {        try        {            articleDaoOpe.create(article);        } catch (SQLException e)        {            e.printStackTrace();        }    }    /**     * 通过Id得到一个Article     *      * @param id     * @return     */    @SuppressWarnings("unchecked")    public Article getArticleWithUser(int id)    {        Article article = null;        try        {            article = articleDaoOpe.queryForId(id);            helper.getDao(User.class).refresh(article.getUser());        } catch (SQLException e)        {            e.printStackTrace();        }        return article;    }    /**     * 通过Id得到一篇文章     *      * @param id     * @return     */    public Article get(int id)    {        Article article = null;        try        {            article = articleDaoOpe.queryForId(id);        } catch (SQLException e)        {            e.printStackTrace();        }        return article;    }    /**     * 通过UserId获取所有的文章     *      * @param userId     * @return     */    public List<Article> listByUserId(int userId)    {        try        {            QueryBuilder<Article, Integer> articleBuilder = articleDaoOpe                    .queryBuilder();            QueryBuilder userBuilder = helper.getDao(User.class).queryBuilder();            articleBuilder.join(userBuilder);                                    /*Where<Article, Integer> where = articleBuilder.where();            where.eq("user_id", 1);            where.and();            where.eq("title", "ORMLite数据库");                        return where.query();*/                        // 或者             /*return articleDaoOpe.queryBuilder().//                    where().//                    eq("user_id", 1).and().//                    eq("title", "ORMLite数据库").query();*/                         //复杂的查询            /*where.or(                    //                    where.and(//                            where.eq("user_id", 1), where.eq("name", "xxx")),                    where.and(//                            where.eq("user_id", 2), where.eq("name", "yyy")));*/            return articleDaoOpe.queryBuilder().where().eq("user_id", userId)                    .query();        } catch (SQLException e)        {            e.printStackTrace();        }        return null;    }}

条件查询QueryBuilder的使用

用于where查询,在ArticleDao类中包含的有。更多的用法,去官方文档查看,源码中提供了文档;

 

提示:运行测试时,要先添加数据,源码未做错误处理  源码点击下载

 

不足之处请留言指正!有问题的可以给我留言!谢谢!


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 医院多收钱了怎么办 学生总是转笔怎么办 吃错东西呕吐怎么办 手腕筋扭伤了怎么办 右膝盖内侧疼痛怎么办 膝盖关节腔积液怎么办 小孩玩游戏花钱怎么办 初三玩手机上瘾怎么办 无线网有感叹号怎么办 台式电脑网络感叹号怎么办 忘记发红包密码怎么办 电信诈骗被骗后怎么办 C小孩讨厌上学怎么办 军训来大姨妈怎么办 夏天军训来月经怎么办 军训遇到大姨妈怎么办 长春市图书馆读者证怎么办 济宁图书馆怎么办读者卡 海南省图书馆读者证怎么办 小孩子特别能吃怎么办 小孩吃不下去药怎么办 小孩不肯去上学怎么办 初中没有团员证怎么办 入团申请书丢了怎么办 刚成立单位社保怎么办 老年人耳鸣怎么办小妙招 老人血压高200怎么办 老人晕车后难受怎么办 老人头晕心里慌怎么办 老人憋的慌怎么办 老人厌食没胃口怎么办 老年人心里整天疑心病怎么办 一个人疑心太重怎么办 我疑心病很重怎么办 老人疑心病太重怎么办 心理有问题该怎么办 老人得了妄想病怎么办 小学生没做作业怎么办 孩子完不成作业怎么办 敏感多疑怎么办很痛苦 老年人脾气越来越古怪怎么办