Android ORMLite框架入门用法教程二(两张表关联外键)

一、今天主要是对上一篇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源代码下载地址:

http://download.csdn.net/detail/su_tianbiao/8520447

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值