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

来源:互联网 发布:怎么下载视频软件 编辑:程序博客网 时间:2024/05/16 09:25

一、今天主要是对上一篇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;}@Overridepublic 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;}@Overridepublic 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);}@Overridepublic void onCreate(SQLiteDatabase database,ConnectionSource connectionSource) {try {// 通过TableUtils这个类新建User类对应的表TableUtils.createTable(connectionSource, User.class);TableUtils.createTable(connectionSource, Article.class);} catch (SQLException e) {e.printStackTrace();}}@Overridepublic 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;}/** * 释放 */@Overridepublic 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 2