標籤:fonts ack action onupgrade blog context ide getname orm
??
《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;@Overrideprotected 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();}}}@Overridepublic 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() {}@Overridepublic 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;}@Overridepublic 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();}}@Overridepublic 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;}@Overridepublic void close() {super.close();mClassDao = null;mStudentDao = null;}}
Android ORMLite ForeignCollection關聯外部集合