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;
	}
}
时间: 2024-11-11 15:14:40

Android ORMLite ForeignCollection关联外部集合的相关文章

android数据存储_外部存储

源码下载(免下载积分):下载 外部存储并不是一定可以访问的,例如外部存储挂载到电脑上是,或者是SD Card作为外部存储,被移除是,因此在访问外部存储时,一定要保证外部存储是可以获得的.判断外部存储是否已经挂载到了手机上可以这样判断: //判断外部存储是否可以访问,并且可以读写 private boolean isExternalStorageWritable() { String state = Environment.getExternalStorageState(); if (Enviro

Eclise Maven方式 关联外部架包 Debug

Eclipse + Maven 方式关联源码: Eclispse关联源码: Window ->Preferences->Maven 勾选 Download Artifact Source 与 Download Artifact JavaDoc 两项 Eclipse + Plugin方式 解决Maven Debug 关联外部Jar: jar包及原教程地址奉上:https://github.com/bjmi/m2e.sourcelookup

Android ormlite like() function is not working

//http://stackoverflow.com/questions/7642161/android-ormlite-like-function-is-not-working try { QueryBuilder<MakeDTO, Integer> qb = makeDao.queryBuilder(); qb.where().like("madeCompany", "%"+filterKey+"%"); PreparedQuer

Android系统代码查询命令集合

*#06# 显示MEID *#*#4636#*#* 显示版本,或更新相机韧体 *#*#7594#*#* 当长按关机按钮时,会出现一个切换手机部分设置及更改设定 WLAN. GPS 及蓝牙测试的代码 *#*#232338#*#* 显示 WiFi MAC 地址 *#*#1472365#*#* GPS 测试 *#*#1575#*#* 其它 GPS 测试 *#*#232331#*#* 蓝牙测试 *#*#232337#*# 显示蓝牙装置地址 *#*#8255#*#*启动 GTalk 服务监视器 显示版本的

android ORMlite的应用

ORMLite -轻量级的对象关系映射(ORM) 如果你需要在android中使用ORMLite 你需要进入官方网站http://ormlite.com/ 中下载 下载了这两个包以后,你还需要在对应的项目中配置这两个包 然后你就可以开始写你的数据库语句了!!! 我们一步一步来建立一个简单的ORMLite的小例子 我们要实现的也就是利用ORMLite来呈现一个列表集合 先来看布局文件 <LinearLayout xmlns:android="http://schemas.android.co

Android—Ormlite框架简单的操作数据库

大家在Android项目中或多或少的都会使用数据库,为了提高我们的开发效率,当然少不了数据库ORM框架了,尤其是某些数据库操作特别频繁的app:本篇博客将详细介绍ORMLite的简易用法. 下面开始介绍ORMLite的入门用法~ 1.下载 ORMLite Jar 首先去ORMLite官网下载jar包,对于Android为:ormlite-android-5.0.jar 和 ormlite-core-5.0.jar : ps:访问不了的朋友,文章末尾会把jar.源码.doc与本篇博客例子一起打包提

ORMLiteDatabase的简单使用and与关联外部

1.下载jar 具体到Android,需要在 http://ormlite.com/releases 页面下载两个jar 包(本文基于ORMLite的版本是:ormlite 4.49-SNAPSHOT):(1)core列表下的jar包:(2)android列表下的jar包.如图所示: 将上面的两个jar包下载后放到Android工程项目中的libs包中,如图所示: 以上完成后,ORMLite开发环境搭建就完成了,接下来就可以使用了. 2.代码: 表student.java和AClass.java

【Android】14.2 外部文件存储和读取

分类:C#.Android.VS2015: 创建日期:2016-02-27 一.简介 1.基本概念 内部存储的私有可用存储空间一般都不会很大,对于容量比较大的文件,例如视频等,应该将其存储在外部存储设备(SD卡)上. 注意,不要将手机内存和手机内插入的存储卡(手机卡.SD卡)混淆在一起,内存是不能持久存储的,一关机所有信息就全部丢失了,而内部存储(移动经销商卖的手机卡,容量小,但是没有它打不了电话).外部存储(SD卡,容量大,各种文件都能保存)都是可以持久存储的设备,因此才叫文件存储. 可以通过

Android ORMLite 框架的入门用法

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/39121377 大家在Android项目中或多或少的都会使用数据库,为了提高我们的开发效率,当然少不了数据库ORM框架了,尤其是某些数据库操作特别频繁的app:本篇博客将详细介绍ORMLite的简易用法. 下面开始介绍ORMLite的入门用法~ 1.下载 ORMLite Jar 首先去ORMLite官网下载jar包,对于Android为:ormlite-android-4.48.