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

相关文章

C#中async await异步关键字用法和异步的底层原理全解析

《C#中asyncawait异步关键字用法和异步的底层原理全解析》:本文主要介绍C#中asyncawait异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结C#异步编程

如何解决idea的Module:‘:app‘platform‘android-32‘not found.问题

《如何解决idea的Module:‘:app‘platform‘android-32‘notfound.问题》:本文主要介绍如何解决idea的Module:‘:app‘platform‘andr... 目录idea的Module:‘:app‘pwww.chinasem.cnlatform‘android-32

SQL表间关联查询实例详解

《SQL表间关联查询实例详解》本文主要讲解SQL语句中常用的表间关联查询方式,包括:左连接(leftjoin)、右连接(rightjoin)、全连接(fulljoin)、内连接(innerjoin)、... 目录简介样例准备左外连接右外连接全外连接内连接交叉连接自然连接简介本文主要讲解SQL语句中常用的表

python3 gunicorn配置文件的用法解读

《python3gunicorn配置文件的用法解读》:本文主要介绍python3gunicorn配置文件的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python3 gunicorn配置文件配置文件服务启动、重启、关闭启动重启关闭总结python3 gun

MySQL 中的 LIMIT 语句及基本用法

《MySQL中的LIMIT语句及基本用法》LIMIT语句用于限制查询返回的行数,常用于分页查询或取部分数据,提高查询效率,:本文主要介绍MySQL中的LIMIT语句,需要的朋友可以参考下... 目录mysql 中的 LIMIT 语句1. LIMIT 语法2. LIMIT 基本用法(1) 获取前 N 行数据(

C#中DrawCurve的用法小结

《C#中DrawCurve的用法小结》本文主要介绍了C#中DrawCurve的用法小结,通常用于绘制一条平滑的曲线通过一系列给定的点,具有一定的参考价值,感兴趣的可以了解一下... 目录1. 如何使用 DrawCurve 方法(不带弯曲程度)2. 如何使用 DrawCurve 方法(带弯曲程度)3.使用Dr

Python虚拟环境终极(含PyCharm的使用教程)

《Python虚拟环境终极(含PyCharm的使用教程)》:本文主要介绍Python虚拟环境终极(含PyCharm的使用教程),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录一、为什么需要虚拟环境?二、虚拟环境创建方式对比三、命令行创建虚拟环境(venv)3.1 基础命令3

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.

Android Studio 配置国内镜像源的实现步骤

《AndroidStudio配置国内镜像源的实现步骤》本文主要介绍了AndroidStudio配置国内镜像源的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、修改 hosts,解决 SDK 下载失败的问题二、修改 gradle 地址,解决 gradle