前言
一直想对数据库的操作进行一个用法整理,翻开现在比较火的GreenDao,里面已经被封装的看不出来最基本CRUD语法了,当然不是说GreenDao不好,至少对初学者来说不太好,学习就应该依序渐进,知其然知其所以然才好。这篇参照某大神blog,加上自己理解整理而来,属于较早期的数据库操作模式。希望对初学者有好的帮助
1. 什么是ORM
对象关系映射(英语:(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换[1] 。从效果上说,它其实是创建了一个可在编程语言里使用的–“虚拟对象数据库”。简单的理解为对象和数据库表字段的简单映射关系
2. 下载 android ORMLite Jar
http://ormlite.com/releases/
在这两版的基础进行操作
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