一、今天主要是对上一篇Android ORMLite框架入门用法教程一的深入了解,上一篇主要是介绍单表的操作,今天介绍一下多表操作,今天用的是两张表,一张user表,一张article表,article表里面有user编号,也就是说文章的作者是user表的主键,如果对于单表还不熟悉建议看下上一篇教程(http://blog.csdn.net/su_tianbiao/article/details/44514007)。
二、首先看一下项目Demo包结构图:
对应的文件相信大家都知道是干嘛的,不清楚请看上一篇教程,这里主要是多封装了两个Dao类,一个是UserDao.java、一个是ArticleDao.java类,这两个类里面主要是写了一些增、删、改、查方法,具体写什么根据你们自己情况写即可,这样以后操作就比较方便,比如说我要对user表新增一条数据,那我就直接new出一个UserDao实例出来,然后调用addUser(User user)方法传入user对象就可以,这样就不用去自己又调用DatabaseHpler这个类,因为这些已经封装在UserDao.java类里面了,articleDao同理。
这里对两张表的操作结果的不同直接看代码即可,注释写的很清楚
(主要是article里面的user对象的值不同,详情看代码注释,有些情况是整个user都有值,有些是只有user_id有值)
User.java:
package com.example.ormlitedemo.bean;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;
/**
* 注解
* @author Jerry
*tableName="tb_user"表示对应的数据库表叫:tb_user表
*/
@DatabaseTable(tableName="tb_user")
public class User {
//generatedId=true:表示是主键
@DatabaseField(generatedId=true)
private int id;
//columnName="name":表示对应数据库表tb_user表里面的name字段
@DatabaseField(columnName="name")
private String name;
//columnName="name":表示对应数据库表tb_user表里面的age字段
@DatabaseField(columnName="age")
private int age;
//columnName="name":表示对应数据库表tb_user表里面的sex字段
@DatabaseField(columnName="sex")
private String sex;
public User()
{
}
public User( String name, int age, String sex) {
//super();
this.name = name;
this.age = age;
this.sex = sex;
}
public User(int id, String name, int age, String sex) {
//super();
this.id = id;
this.name = name;
this.age = age;
this.sex = sex;
}
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;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "ID:"+id+"\tNAME:"+name+"\tAGE:"+age+"\tSEX:"+sex;
}
}
Article.java:
package com.example.ormlitedemo.bean;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;
/**
*
* @author Jerry
*tableName="tb_article"表示对应的数据库表叫:tb_article表
*/
@DatabaseTable(tableName = "tb_article")
public class Article {
//generatedId=true:表示是主键
@DatabaseField(generatedId = true)
private int id;
@DatabaseField(columnName="title")
private String title;
@DatabaseField(canBeNull = true, foreign = true, columnName = "user_id")
private User user;
public Article(){
}
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
+ "]";
}
}
UserDao.java:
package com.example.ormlitedemo.dao;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import com.example.ormlitedemo.bean.User;
import com.example.ormlitedemo.db.DatabaseHelper;
import com.j256.ormlite.dao.Dao;
/**
* UserDao类
* @author Jerry
*
*/
public class UserDao {
private Context context;
private Dao<User, Integer> userDao;
private DatabaseHelper helper;
public UserDao(Context contex) {
this.context = context;
try {
helper = DatabaseHelper.getHelper(contex);
userDao = helper.getDao(User.class);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 增
* @param user
*/
public void addUser(User user)
{
try {
userDao.create(user);
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 删(通过实体)
* @param user
*/
public void delUser(User user)
{
try {
userDao.delete(user);
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 删(通过id)
* @param id
*/
public void delUserById(Integer id)
{
try {
userDao.deleteById(id);
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 改
* @param user
*/
public void updateUser(User user)
{
try {
userDao.update(user);
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 查
* @return
*/
public List<User> queryAllUser(){
ArrayList<User> users = null;
try {
users= (ArrayList<User>) userDao.queryForAll();
} catch (SQLException e) {
e.printStackTrace();
}
return users;
}
/**
* 获取user
* @param id user编号
* @return
*/
public User getUser(Integer id)
{
try {
return userDao.queryForId(id);
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
}
ArticleDao.java:
package com.example.ormlitedemo.dao;
import java.util.List;
import android.content.Context;
import com.example.ormlitedemo.bean.Article;
import com.example.ormlitedemo.bean.User;
import com.example.ormlitedemo.db.DatabaseHelper;
import com.j256.ormlite.dao.Dao;
/**
*
* @author Jerry
*
*/
public class ArticleDao {
private Dao<Article, Integer> articleDao;
private DatabaseHelper helper;
public ArticleDao(Context context) {
try {
helper = DatabaseHelper.getHelper(context);
articleDao = helper.getDao(Article.class);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 增
* @param article
*/
public void addArticle(Article article) {
try {
articleDao.create(article);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 通过article id获取article里面user的所有值
* @param id article 编号
* @return
*/
public Article getArticleWithUser(Integer id) {
Article article = null;
try {
article = articleDao.queryForId(id);
helper.getDao(User.class).refresh(article.getUser());
} catch (Exception e) {
e.printStackTrace();
}
return article;
}
/**
* 只能获取到user的id值而已,其他user值获取不到
* @param id article编号
* @return
*/
public Article getArticle(int id)
{
Article article = null;
try
{
article = articleDao.queryForId(id);
} catch (Exception e)
{
e.printStackTrace();
}
return article;
}
/**
* 能获取到article集合,但是article里面的user只有id有值,其他user里面的字段没值
* @param userid
* @return
*/
public List<Article> getArticleListByUserId(int userid)
{
try {
return articleDao.queryBuilder().where().eq("user_id", userid)
.query();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
DatabaseHelper.java:
package com.example.ormlitedemo.db;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import com.example.ormlitedemo.bean.Article;
import com.example.ormlitedemo.bean.User;
import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.support.ConnectionSource;
import com.j256.ormlite.table.TableUtils;
public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
// 数据库名字
private static final String TABLE_NAME = "ormlite-test.db";
private Map<String, Dao> daos=new HashMap<String, Dao>();
// 构造函数,私有的外部不能直接访问
private DatabaseHelper(Context context) {
super(context, TABLE_NAME, null, 2);
}
@Override
public void onCreate(SQLiteDatabase database,
ConnectionSource connectionSource) {
try {
// 通过TableUtils这个类新建User类对应的表
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();
}
}
// DatabaseHelper实例
private static DatabaseHelper instance;
/**
* 单例模式获取实例
*
* @param context
* @return
*/
public static synchronized DatabaseHelper getHelper(Context context) {
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;
}
}
}
OrmLiteDbTest.java:
package com.example.ormlitedemo.test;
import java.util.List;
import android.test.AndroidTestCase;
import com.example.ormlitedemo.bean.Article;
import com.example.ormlitedemo.bean.User;
import com.example.ormlitedemo.dao.ArticleDao;
import com.example.ormlitedemo.dao.UserDao;
/**
* 测试
*
* @author Jerry
*
*/
public class OrmLiteDbTest extends AndroidTestCase {
/**
* 增
*/
public void addArticleTest() {
// 新建user的同时也把这个user对象加到article里面,就是会关联起来
User u = new User();
u.setName("stb333");
new UserDao(getContext()).addUser(u);
Article article = new Article();
article.setTitle("ormlite测试333");
// u.setId(1);
article.setUser(u);
new ArticleDao(getContext()).addArticle(article);
}
/**
* 通过article编号获取article(没有整个user都有值,只有user_id有值而已)
*/
public void getArticleByIdTest() {
Article article = new ArticleDao(getContext()).getArticle(2);
System.out.println(article.getUser() + " , " + article.getTitle());
}
/**
* 通过article编号获取article(user整个都有值,不只是user_id有值而已)
*/
public void getArticleWithUserTest() {
Article article = new ArticleDao(getContext()).getArticleWithUser(2);
System.out.println(article.getUser() + " , " + article.getTitle());
}
/**
* 通过user编号查询article表里面所有user编号为这个数的所有article记录,并且返回所有记录的集合
*/
public void listArticlesByUserIdTest() {
List<Article> articles = new ArticleDao(getContext())
.getArticleListByUserId(1);
System.out.println(articles.toString());
}
}
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.ormlitedemo"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<uses-library android:name="android.test.runner" />
<activity
android:name="com.example.ormlitedemo.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<!-- 记住这个一要放在application外面,不然会出现配置错误 信息 -->
<instrumentation android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.example.ormlitedemo" android:label="Tests for My App" />
</manifest>
Demo源代码下载地址: