android Sqlite Orm 实现方式

来源:互联网 发布:现货原油分析软件 编辑:程序博客网 时间:2024/05/22 03:08

前言

一直想对数据库的操作进行一个用法整理,翻开现在比较火的GreenDao,里面已经被封装的看不出来最基本CRUD语法了,当然不是说GreenDao不好,至少对初学者来说不太好,学习就应该依序渐进,知其然知其所以然才好。这篇参照某大神blog,加上自己理解整理而来,属于较早期的数据库操作模式。希望对初学者有好的帮助

添加了数据库可视化插件debug_db,方便查看。

这里写图片描述

1. 什么是ORM

对象关系映射(英语:(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换[1] 。从效果上说,它其实是创建了一个可在编程语言里使用的–“虚拟对象数据库”。简单的理解为对象和数据库表字段的简单映射关系

2. 下载 android ORMLite Jar

http://ormlite.com/releases/
这里写图片描述
在这两版的基础进行操作
依赖jar

3. 配置Bean类

使用不同注解来标示表属性,(字段名,字段类型,主键,外键 etc)

@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                + "]";    }}

4. 编写DAO类

一般写法就是Dao 和 Bean 对应,dao是对具体表操作的封装,而Bean则是表的映射

package dragger2.nuoyuan.com.myapplication.db;import android.content.Context;import com.j256.ormlite.dao.Dao;import java.sql.SQLException;import java.util.List;import dragger2.nuoyuan.com.myapplication.bean.Student;public class StudentDao {    private Context context;    private Dao<Student, Integer> userDaoOpe;    private DatabaseHelper helper;    public StudentDao(Context context) {        this.context = context;        try {            helper = DatabaseHelper.getHelper(context);            userDaoOpe = helper.getDao(Student.class);        } catch (SQLException e) {            e.printStackTrace();        }    }    /**     * 增加一个用户     *     * @param student     * @throws SQLException     */    public void add(Student student) {        try {            userDaoOpe.create(student);        } catch (SQLException e) {            e.printStackTrace();        }    }    public Student get(int id) {        try {            return userDaoOpe.queryForId(id);        } catch (SQLException e) {            e.printStackTrace();        }        return null;    }    public List<Student> queryAll() {        try {            return userDaoOpe.queryForAll();        } catch (SQLException e) {            e.printStackTrace();        }        return null;    }}

对数据库操作需要用到Sqlite提供的底层Api SQLiteOpenHelper 的帮助,OrmLiteSqliteOpenHelper已经在SQLiteOpenHelper的基础上做了二次封装,我们直接继承OrmLiteSqliteOpenHelper类实现 onCreate(SQLiteDatabase database,ConnectionSource connectionSource)
和 onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) ,来进行数据库的操作以及数据库的升级操作
然后使用单例公布出一个创建实例的方法,getHelper用于获取我们的操作数据库的OpenHelper 实例。

5. 测试

由于测试使用Context环境,无法用AndroidStudo中单元测试来测,推荐在Eclipse中进行尝试测试,需要在Eclipse中配置测试环境

package dragger2.nuoyuan.com.myapplication;import com.j256.ormlite.dao.Dao;import java.sql.SQLException;import java.util.List;import dragger2.nuoyuan.com.myapplication.bean.Article;import dragger2.nuoyuan.com.myapplication.bean.Student;import dragger2.nuoyuan.com.myapplication.bean.User;import dragger2.nuoyuan.com.myapplication.db.ArticleDao;import dragger2.nuoyuan.com.myapplication.db.DatabaseHelper;import dragger2.nuoyuan.com.myapplication.db.StudentDao;import dragger2.nuoyuan.com.myapplication.db.UserDao;import dragger2.nuoyuan.com.myapplication.utils.L;public class TestUtils {    public void testAddArticle() {        User u = new User();        u.setName("000");        new UserDao(MyApp.context).add(u);        Article article = new Article();        article.setTitle("hello world");        article.setUser(u);        new ArticleDao(MyApp.context).add(article);    }    public void testGetArticleById() {        Article article = new ArticleDao(MyApp.context).get(1);        L.e(article.getUser() + " , " + article.getTitle());    }    public void testGetArticleWithUser() {        Article article = new ArticleDao(MyApp.context).getArticleWithUser(1);        L.e(article.getUser() + " , " + article.getTitle());    }    public void testListArticlesByUserId() {        List<Article> articles = new ArticleDao(MyApp.context).listByUserId(1);        L.e(articles.toString());    }    public void testGetUserById() {        User user = new UserDao(MyApp.context).get(1);        L.e(user.getName());        if (user.getArticles() != null)            for (Article article : user.getArticles()) {                L.e(article.toString());            }    }    public void testAddStudent() throws SQLException {        Dao dao = DatabaseHelper.getHelper(MyApp.context).getDao(Student.class);        Student student = new Student();        student.setDao(dao);        student.setName("杨卫超");        student.create();    }    public String querystudentDao() throws SQLException {        Student user = new StudentDao(MyApp.context).get(1);        return user.toString();    }}

查看效果

这里写图片描述

注:ORMLite还提供了一些基类ORMLiteBaseActivity,ORMLiteBaseService之类的,便于数据库操作的,这里不做考虑,毕竟项目中很大可能自己也需要继承自己的BaseActvity之类的。

简单的使用到此,ORMLITE 对象映射到表分析

源码下载: http://pan.baidu.com/s/1geRTRBt

引用
Orm入门 http://blog.csdn.net/lmj623565791/article/details/39121377

1 0