Improving Android ORMLite foreign key mapping , based on new version 5.0

简介: Improving Android ORMLite foreign key mapping , based on new version 5.
Improving Android ORMLite foreign key mapping , based on new version 5.0


AClass.java:

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(generatedId = true)
    public int id;

    @DatabaseField(canBeNull = false, dataType = DataType.INTEGER)
    public int classId;

    @DatabaseField(canBeNull = false, defaultValue = "class", dataType = DataType.STRING)
    public String name;

    @ForeignCollectionField(eager = false)
    public ForeignCollection<Student> students;

    @Override
    public String toString() {
        return "id:" + id + ",classId:" + classId + ",name:" + name;
    }
}



Student.java:

import com.j256.ormlite.field.DataType;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;

@DatabaseTable(tableName = "students")
public class Student {
    @DatabaseField(generatedId = true)
    public int id;

    @DatabaseField(canBeNull = false, dataType = DataType.INTEGER)
    public int studentId;

    @DatabaseField(canBeNull = false, dataType = DataType.STRING)
    public String name;

    @DatabaseField(canBeNull = false, foreign = true, foreignAutoRefresh = true)
    public AClass aclass;

    @Override
    public String toString() {
        return "id:" + id + ",studentId:" + studentId + ",name:" + name + ",className:" + aclass.name;
    }
}


ORMLiteDatabaseHelper.java:

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 DB_NAME = "school.db";
    private final static int DB_VERSION = 1;

    public ORMLiteDatabaseHelper(Context context, String databaseName, CursorFactory factory, int databaseVersion) {
        super(context, DB_NAME, factory, DB_VERSION);
    }

    public static ORMLiteDatabaseHelper getInstance(Context context) {
        if (mDatabaseHelper == null) {
            mDatabaseHelper = new ORMLiteDatabaseHelper(context, DB_NAME, null, DB_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;
    }
}



MainActivity.java:

import java.sql.SQLException;

import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.dao.ForeignCollection;

import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    private Dao<AClass, Integer> mClassDao;
    private Dao<Student, Integer> mStudentDao;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ORMLiteDatabaseHelper mORMLiteDatabaseHelper = ORMLiteDatabaseHelper.getInstance(getApplicationContext());

        mClassDao = mORMLiteDatabaseHelper.getClassDao();
        mStudentDao = mORMLiteDatabaseHelper.getStudentDao();

        // 在数据库中存储5个班级。
        for (int i = 1; i < 6; i++) {
            AClass aclass = new AClass();
            aclass.classId = 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();
        }

        // 创建10个学生,这10个学生都归属到1班。
        for (int i = 0; i < 10; i++) {
            Student s = new Student();
            s.studentId = i;
            s.name = "学生" + i;

            // 将新创建的这些学生所在班级指针指向1班。
            // 1班有这19个学生,换言之,这19个学生是1班的学生。
            s.aclass = class1;

            try {
                mStudentDao.createIfNotExists(s);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        ForeignCollection<Student> students = class1.students;
        for (Student s : students) {
            Log.d("数据库", s.toString());
        }
    }
}

相关文章
|
Java 数据库 Android开发
Android 数据库框架ormlite
Android 数据库框架ormlite 使用精要 前言 本篇博客记录一下笔者在实际开发中使用到的一个数据库框架,这个可以让我们快速实现数据库操作,避免频繁手写sql,提高我们的开发效率,减少出错的机率。 ormlite是什么? 首先可以去它的官网看看www.ormlite.com,它的英文全称是Object Relational Mapping,意思是对象关系
1577 0
|
Java 数据库 Android开发
Android数据库框架——ORMLite轻量级的对象关系映射(ORM)Java包
Android数据库框架——ORMLite轻量级的对象关系映射(ORM)Java包 事实上,我想写数据库的念头已经很久了,在之前写了一个答题系统的小项目那只是初步的带了一下数据库,数据库是比较强大的,不是我们三言两语就能解决的,我一直想抽个时间自己再过一遍Sqli...
1111 0
|
Java 数据库 Android开发
Android ORMLite ForeignCollection关联外部集合
 《Android ORMLite ForeignCollection关联外部集合》    Android ORMLite ForeignCollection关联外部集合的功能,适合层级比较深,数据模型互相渗透、交叉的数据结构或集合。
1037 0
|
存储 Java 数据库
Android ORMLite数据库简介
 一般的项目中,Android自身提供的SQLite数据库,可以满足轻量级的数据存储应用,但是,只要是存储模型稍微复杂的项目,以及数据结构模型复杂的应用,就很难再用SQLite支撑整个项目的数据存储。
986 0
|
3天前
|
Linux 编译器 Android开发
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
24 1
FFmpeg开发笔记(九)Linux交叉编译Android的x265库