Android ORMLite ForeignCollection关联外部集合
《Android ORMLite ForeignCollection关联外部集合》
Android ORMLite ForeignCollection关联外部集合的功能,适合层级比較深,数据模型互相渗透、交叉的数据结构或集合。尤其方便解决复杂数据模型。简单期间,我们临时以 班级 <-> 学生 这种数据模型为例加以说明。一个班级里面有若干学生(一对多,1<-n)。反过来说,若干个学生集合到一个班级中(n->1)。 在Android ORMLite中。这种结构模型能够用@ForeignCollectionField。ForeignCollection建模。我们定义一个班级类AClass(之所以在
'Class'前加一个‘A’,是由于Java语言中。'Class'是保留字,却刚好是我们想用的班级英文单词,真不巧,所曾经面加个'A'规避)。AClass包括id(主键,方便查询和更新),name以及指向一个外部Student的集合(ForeignCollection<Student>)。
相同。我们定义学生类Student。Student中埋入一个字段aclass指向外部的AClass。
备注:
Android ORMLite简单介绍文章:http://blog.csdn.net/zhangphil/article/details/46878075
演示样例代码总共同拥有4个文件:MainActivity.java,主Activity,用于測试。ORMLiteDatabaseHelper.java , AClass.java , Student.java 是数据库相关的代码文件,用于建模。
结构层次如图:
測试用的MainActivity.java :
package zhangphil.ormlitetest; import java.sql.SQLException; import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.dao.ForeignCollection; import zhangphil.ormlitetest.database.AClass;
import zhangphil.ormlitetest.database.ORMLiteDatabaseHelper;
import zhangphil.ormlitetest.database.Student;
import android.support.v7.app.ActionBarActivity;
import android.widget.Toast;
import android.os.Bundle; public class MainActivity extends ActionBarActivity { private Dao<AClass, Integer> mClassDao;
private Dao<Student, Integer> mStudentDao; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); ORMLiteDatabaseHelper mDatabaseHelper = ORMLiteDatabaseHelper
.getInstance(this); mClassDao = mDatabaseHelper.getClassDao();
mStudentDao = mDatabaseHelper.getStudentDao(); // 创建5个班级用以演示。
for (int i = 1; i < 6; i++) {
AClass aclass = new AClass();
aclass.id = i;
aclass.name = i + "班";
try {
mClassDao.createIfNotExists(aclass);
} catch (SQLException e) {
e.printStackTrace();
}
} // 找到id=1的1班。
AClass class1 = null;
try {
class1 = mClassDao.queryForId(1);
} catch (SQLException e) {
e.printStackTrace();
} // 创建19个学生,这19个学生都归属到1班。
for (int i = 1; i < 20; i++) {
Student s = new Student();
s.id = i;
s.name = "学生" + i; // 将新创建的这些学生所在班级指针指向1班。
// 数据模型:id=1的1班和这19个学生是1对多的学生,换句话说,这19个学生是1班的学生。 s.aclass = class1; try {
mStudentDao.createIfNotExists(s);
} catch (SQLException e) {
e.printStackTrace();
}
}
} @Override
public void onStart() {
super.onStart(); /**
* 以下我们演示更新一个Student的信息, 然后向上,根据外键,从Student - > Class更新班级信息。
*
* */ // 如果我们更新当中id=1的这个学生所在的这个班级的name变成“一班”。
Student s1 = null;
try {
s1 = mStudentDao.queryForId(1); s1.aclass.name = "一班"; // 更新1班的名字从“1班”变成“一班”
mClassDao.update(s1.aclass);
} catch (SQLException e) {
e.printStackTrace();
} // 显示我们更新后的结果。 AClass class1 = null;
try {
class1 = mClassDao.queryForId(1);
} catch (SQLException e1) {
e1.printStackTrace();
} ForeignCollection<Student> students = class1.students;
for (Student s : students) {
Toast.makeText(this, s.toString(), Toast.LENGTH_SHORT).show();
}
}
}
下面是数据库相关的建模:
AClass.java :
package zhangphil.ormlitetest.database; import com.j256.ormlite.dao.ForeignCollection;
import com.j256.ormlite.field.DataType;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.field.ForeignCollectionField;
import com.j256.ormlite.table.DatabaseTable; @DatabaseTable(tableName = "classes")
public class AClass { @DatabaseField(canBeNull = false, dataType = DataType.LONG, id = true)
public long id; @DatabaseField(canBeNull = false, defaultValue = "a class", dataType = DataType.STRING)
public String name; @ForeignCollectionField(eager = false)
public ForeignCollection<Student> students = null; public AClass() { }
}
Student.java :
package zhangphil.ormlitetest.database; import com.j256.ormlite.field.DataType;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable; @DatabaseTable(tableName = "students")
public class Student { public Student(String name, int student_id) {
this.name = name;
this.id = student_id;
} @DatabaseField(canBeNull = false, dataType = DataType.INTEGER, id = true)
public int id; @DatabaseField(canBeNull = false, dataType = DataType.STRING)
public String name; @DatabaseField(canBeNull = false, foreign = true, foreignAutoRefresh = true)
public AClass aclass; public Student() { } @Override
public String toString() {
return "id:" + id + " 姓名:" + name + " 所在班级:" + aclass.name;
}
}
ORMLiteDatabaseHelper.java :
package zhangphil.ormlitetest.database; import java.sql.SQLException; import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.util.Log; 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 ORMLiteDatabaseHelper extends OrmLiteSqliteOpenHelper { private static ORMLiteDatabaseHelper mDatabaseHelper = null; private Dao<AClass, Integer> mClassDao = null;
private Dao<Student, Integer> mStudentDao = null; private final static String DataBase_NAME = "school.db";
private final static int DataBase_VERSION = 1; public ORMLiteDatabaseHelper(Context context, String databaseName,
CursorFactory factory, int databaseVersion) {
super(context, DataBase_NAME, factory, DataBase_VERSION);
} public static ORMLiteDatabaseHelper getInstance(Context context) {
if (mDatabaseHelper == null) {
mDatabaseHelper = new ORMLiteDatabaseHelper(context, DataBase_NAME,
null, DataBase_VERSION);
} return mDatabaseHelper;
} @Override
public void onCreate(SQLiteDatabase arg0, ConnectionSource connectionSource) { Log.d(this.getClass().getName(), "ORMLite数据库 -> onCreate"); try {
TableUtils.createTableIfNotExists(connectionSource, AClass.class);
TableUtils.createTableIfNotExists(connectionSource, Student.class);
} catch (Exception e) {
e.printStackTrace();
}
} @Override
public void onUpgrade(SQLiteDatabase database,
ConnectionSource connectionSource, int oldVersion, int newVersion) { Log.i(this.getClass().getName(), "数据库 -> onUpgrade"); try {
// 删除旧的数据库表。
TableUtils.dropTable(connectionSource, AClass.class, true);
TableUtils.dropTable(connectionSource, Student.class, true); // 又一次创建新版的数据库。
onCreate(database, connectionSource);
} catch (SQLException e) {
e.printStackTrace();
}
} public Dao<Student, Integer> getStudentDao() {
if (mStudentDao == null) {
try {
mStudentDao = getDao(Student.class);
} catch (java.sql.SQLException e) {
e.printStackTrace();
}
} return mStudentDao;
} public Dao<AClass, Integer> getClassDao() {
if (mClassDao == null) {
try {
mClassDao = getDao(AClass.class);
} catch (java.sql.SQLException e) {
e.printStackTrace();
}
} return mClassDao;
} @Override
public void close() {
super.close();
mClassDao = null;
mStudentDao = null;
}
}
Android ORMLite ForeignCollection关联外部集合的更多相关文章
- 如何在Android应用中引入外部网页
在某些情况下,我们需要在Android应用中引入外部网页,这里记录一下如何操作(其实很简单^.^). 先介绍一下开发环境: 开发工具:Android Studio 1.5 SDK API版本:17 操 ...
- Android 使用AIDL调用外部服务
好处:多个应用程序之间建立共同的服务机制,通过AIDL在不同应用程序之间达到数据的共享和数据相互操作, 本文包括: 1 .创建AIDL 服务端.2 .创建AIDL 客户端. 3.客户端调用服务端提供的 ...
- Android系统代码查询命令集合
Android系统代码查询命令集合 *#06# 显示MEID *#*#4636#*#* 显示版本,或更新相机韧体 *#*#7594#*#* 当长按关机按钮时,会出现一个切换手机部分设置及更改设定 WL ...
- Android Ormlite 学习笔记1 -- 基础
Ormlite 是一个开源Java数据实体映射框架.其中依赖2个核心类库: 1.ormlite-android-4.48.jar 2.ormlite-core-4.48.jar 新建项目,引用上面2个 ...
- Android—Ormlite框架简单的操作数据库
大家在Android项目中或多或少的都会使用数据库,为了提高我们的开发效率,当然少不了数据库ORM框架了,尤其是某些数据库操作特别频繁的app:本篇博客将详细介绍ORMLite的简易用法. 下面开始介 ...
- android ORMlite的应用
ORMLite -轻量级的对象关系映射(ORM) 如果你需要在android中使用ORMLite 你需要进入官方网站http://ormlite.com/ 中下载 下载了这两个包以后,你还需要在对应的 ...
- Android动画学习笔记大集合
其实动画这个东西我已经了解过很长一段时间了,但是一直没系统的整理过.关于android中的各种动画虽然都会用,但总怕自己会慢慢遗忘.这回看了几篇动画分析的文章,自己也学到了一些东西,在此就梳理一下. ...
- 转:Android Webview 加载外部html时选择加载本地的js,css等资源文件
原文地址:http://m.blog.csdn.net/blog/qduningning/43196819 在使用WebView加载网页的时候,有一些固定的资源文件如js的jquery包,css,图片 ...
- Android应用安全之外部动态加载DEX文件风险
1. 外部动态加载DEX文件风险描述 Android 系统提供了一种类加载器DexClassLoader,其可以在运行时动态加载并解释执行包含在JAR或APK文件内的DEX文件.外部动态加载DEX文件 ...
随机推荐
- python网络爬虫之图片链家在技术.seleninum和PhantonJS
一.什么是图片懒加载? 案例分析:抓取站长素材http://sc.chinaz.com/中的图片数据 #!/usr/bin/env python # -*- coding:utf-8 -*- impo ...
- Android内存管理(13)常见产生内存泄漏的原因
1.集合类泄漏 集合类如果仅仅有添加元素的方法,而没有相应的删除机制,导致内存被占用.如果这个集合类是全局性的变量 (比如类中的静态属性,全局性的 map 等即有静态引用或 final 一直指向它), ...
- Unicode ,UTF-8,assic, gbk, latin1编码 的区别
1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte). ...
- React Native 环境搭建踩坑
React Native (web Android)环境搭建踩坑(真的是一个艰辛的过程,大概所有坑都被我踩了 官方文档地址 : https://facebook.github.io/react-nat ...
- mysql外键创建失败原因
引用:http://blog.csdn.net/wangpeng047/article/details/19624351 首先,如果和外键相关的几张表中已经插入了数据,可能导致外键插入的失败 在MyS ...
- 编写高质量的js之恰当选用if和switch
switch结构中存在很多限制,存在这些限制的主要目的是提高多重分支结构的执行效率.因此,如果能够使用switch结构,就不要选择if结构. 无论是使用if结构,还是使用switch结构,应该确保下面 ...
- 移动web——touch事件应用
基本概况 1.touch事件在移动端被用来代替click事件,因为click事件的触发会延迟影响了用户体验 2.touch事件还可以与translate构成吸附效果 3.现行有一种排版方式是左边宽度是 ...
- Centos6.7 安装zabbix+apache+mysql教程(第一篇)
Centos6.7 安装zabbix+apache+mysql教程 blog地址: http://www.cnblogs.com/caoguo ### 基本包安装 ### [root@ca0gu0 ~ ...
- Centos6.6 安装基于系统认证的vsftp服务
一.介绍 vsftp是一款文件服务器软件,在文件共享,代码更新,文件备份中也是经常用到,以下是基本安装环境: 1)CentOS6.6 2)vsftpd-2.2.2 二.安装 $ yum install ...
- swift class protocol-限定协议只能由类实现
protocol GameMode:class “You can limit protocol adoption to class types (and not structures or enume ...