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

2024-02-29 00:08

本文主要是介绍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框架入门用法教程二(两张表关联外键)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/757053

相关文章

Android 12解决push framework.jar无法开机的方法小结

《Android12解决pushframework.jar无法开机的方法小结》:本文主要介绍在Android12中解决pushframework.jar无法开机的方法,包括编译指令、框架层和s... 目录1. android 编译指令1.1 framework层的编译指令1.2 替换framework.ja

Android开发环境配置避坑指南

《Android开发环境配置避坑指南》本文主要介绍了Android开发环境配置过程中遇到的问题及解决方案,包括VPN注意事项、工具版本统一、Gerrit邮箱配置、Git拉取和提交代码、MergevsR... 目录网络环境:VPN 注意事项工具版本统一:android Studio & JDKGerrit的邮

Android实现定时任务的几种方式汇总(附源码)

《Android实现定时任务的几种方式汇总(附源码)》在Android应用中,定时任务(ScheduledTask)的需求几乎无处不在:从定时刷新数据、定时备份、定时推送通知,到夜间静默下载、循环执行... 目录一、项目介绍1. 背景与意义二、相关基础知识与系统约束三、方案一:Handler.postDel

Python中模块graphviz使用入门

《Python中模块graphviz使用入门》graphviz是一个用于创建和操作图形的Python库,本文主要介绍了Python中模块graphviz使用入门,具有一定的参考价值,感兴趣的可以了解一... 目录1.安装2. 基本用法2.1 输出图像格式2.2 图像style设置2.3 属性2.4 子图和聚

SpringBoot3.4配置校验新特性的用法详解

《SpringBoot3.4配置校验新特性的用法详解》SpringBoot3.4对配置校验支持进行了全面升级,这篇文章为大家详细介绍了一下它们的具体使用,文中的示例代码讲解详细,感兴趣的小伙伴可以参考... 目录基本用法示例定义配置类配置 application.yml注入使用嵌套对象与集合元素深度校验开发

springboot使用Scheduling实现动态增删启停定时任务教程

《springboot使用Scheduling实现动态增删启停定时任务教程》:本文主要介绍springboot使用Scheduling实现动态增删启停定时任务教程,具有很好的参考价值,希望对大家有... 目录1、配置定时任务需要的线程池2、创建ScheduledFuture的包装类3、注册定时任务,增加、删

SpringBoot UserAgentUtils获取用户浏览器的用法

《SpringBootUserAgentUtils获取用户浏览器的用法》UserAgentUtils是于处理用户代理(User-Agent)字符串的工具类,一般用于解析和处理浏览器、操作系统以及设备... 目录介绍效果图依赖封装客户端工具封装IP工具实体类获取设备信息入库介绍UserAgentUtils

Android使用ImageView.ScaleType实现图片的缩放与裁剪功能

《Android使用ImageView.ScaleType实现图片的缩放与裁剪功能》ImageView是最常用的控件之一,它用于展示各种类型的图片,为了能够根据需求调整图片的显示效果,Android提... 目录什么是 ImageView.ScaleType?FIT_XYFIT_STARTFIT_CENTE

Java中的@SneakyThrows注解用法详解

《Java中的@SneakyThrows注解用法详解》:本文主要介绍Java中的@SneakyThrows注解用法的相关资料,Lombok的@SneakyThrows注解简化了Java方法中的异常... 目录前言一、@SneakyThrows 简介1.1 什么是 Lombok?二、@SneakyThrows

如何为Yarn配置国内源的详细教程

《如何为Yarn配置国内源的详细教程》在使用Yarn进行项目开发时,由于网络原因,直接使用官方源可能会导致下载速度慢或连接失败,配置国内源可以显著提高包的下载速度和稳定性,本文将详细介绍如何为Yarn... 目录一、查询当前使用的镜像源二、设置国内源1. 设置为淘宝镜像源2. 设置为其他国内源三、还原为官方