本文主要是介绍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;}@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-sdkandroid:minSdkVersion="8"android:targetSdkVersion="19" /><applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><uses-library android:name="android.test.runner" /> <activityandroid: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
这篇关于Android ORMLite框架入门用法教程二(两张表关联外键)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!