zoukankan      html  css  js  c++  java
  • Android数据库框架-----ORMLite关联表的使用

    上一篇已经对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
                    + "]";
        }
    
    }
    @ForeignCollectionField
    private 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类中包含的有。更多的用法,去官方文档查看,源码中提供了文档;

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

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

  • 相关阅读:
    jquery获得url的get参数
    WampServer更改或重置数据库密码
    phpexcel乱码问题
    5kcrm增加权限管理中的模块(签到统计)
    windows关于定时执行的php脚本
    php 中引入邮箱服务 , 利用第三方的smtp邮件服务
    thinkphp 多个字段的不同关系的查询条件实现 .
    redis与memcached有什么区别
    MYSQL语句大全
    使用HttpClient工具类发起Restful API调用
  • 原文地址:https://www.cnblogs.com/zhangqie/p/7261943.html
Copyright © 2011-2022 走看看