ormlite 数据小细节

在创建ormlite时,我在DatabaseHelper中创建一个单例来获取类的实例,但这样做之后在执行完代码,获取单例之后没有同步创建数据表,要等到 数据库的操作时才开始创建表,所以我在此类里面添加了 getReadableDatabase() 或 getWritableDatabase() 两个方法,在获取单例的同时调用这两个方法中的一个就可以,亲测有效。

参考链接:https://bbs.csdn.net/topics/360142050   感谢此论坛 1 楼给出的思路

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

import com.example.yzx110.android_ormlite.entity.Student;
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;

import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by yzx110 on 2018/10/24.
 */

public class DatabaseHelper extends OrmLiteSqliteOpenHelper {

    private static final String DB_NAME = "db_myorm";
    private static final int DB_VERSION = 1;

    // 本类的单例
    private static DatabaseHelper instance;

    // 私有的构造方法
    private DatabaseHelper(Context context) {

        super(context, DB_NAME, null, DB_VERSION);
    }

    // 获取本单例对象的方法(双重验证懒加载方式)
    public static synchronized DatabaseHelper getInstance (Context context){
        if(instance == null){
            synchronized (DatabaseHelper.class){
                if (instance == null){
                    instance = new DatabaseHelper(context);
                }
            }
        }
        return instance;
    }

    private static final String table_name = "students";//表名
    private static String sql = null;//sql语句

    /* 调用 getReadableDatabase() 或者 getWritableDatabase() 会判断指定的数据库是否存在,不存
     * 在则调SQLiteDatabase.create创建, onCreate只在数据库第一次创建时才执行
     */
    @Override
    public SQLiteDatabase getReadableDatabase() {
        return super.getReadableDatabase();
    }

    @Override
    public SQLiteDatabase getWritableDatabase() {
        return super.getWritableDatabase();
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource) {

        Log.e("DatabaseHelper", "开始创建表");
//        sql = "CREATE TABLE " + table_name + " (" +
//                "name           INTEGER         PRIMARY KEY ," +
//                "pwd            VARCHAR(50)     NOT NULL)";//创建数据库的SQL语句
//
//        sqLiteDatabase.execSQL(sql);//执行SQL语句
        try {
            //创建数据表
            TableUtils.createTableIfNotExists(connectionSource, Student.class);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource, int i, int i1) {

        try {
            // 此处也是一样,有几个表就得写几次
            TableUtils.dropTable(connectionSource, Student.class, true); // 先删表,下面在重新创建
//          TableUtils.dropTable(connectionSource, UserBean.class); 假如还有一个UserBean的表
            onCreate(sqLiteDatabase, connectionSource);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    private Map<String, Dao> daos = new HashMap<>();
    // 根据传入的DAO的路径获取到这个DAO的单例对象(要么从daos这个Map中获取,要么新创建一个并存入daos)
    public synchronized Dao getDao(Class clazz) throws SQLException{
        Dao dao = null;
        String className = clazz.getSimpleName(); // 得到类的简写名称
        // Map 有key和value键值对,就会有判断是否有key
        if(daos.containsKey(className)) // 此处判断map 中是否存在改类名的key 值
            dao = daos.get(className);
        if(dao == null){
            dao = super.getDao(clazz);
            daos.put(className, dao);
        }
        return dao;
    }

    // 释放资源
    @Override
    public void close() {
        super.close();
        for(String key : daos.keySet()){ // keySet() 遍历 key
            Dao dao = daos.get(key);
            dao = null;
        }
    }
}

调用

import android.content.Context;

import com.example.yzx110.android_ormlite.entity.Student;
import com.example.yzx110.android_ormlite.helper.DatabaseHelper;
import com.j256.ormlite.dao.Dao;

import java.sql.SQLException;
import java.util.List;

/**
 * Created by yzx110 on 2018/10/24.
 *
 * CREATE TABLE IF NOT EXISTS `t_student` (
 * `id` INTEGER PRIMARY KEY AUTOINCREMENT ,
 * `name` VARCHAR ,
 * `pwd` VARCHAR DEFAULT '123' ,
 * UNIQUE (`name`)
 * )
 *
 */

public class StudentDao {

    //两个泛型约束 一个是对应的实体类类型,一个是主键类型
    private Dao<Student, String> dao;

    public StudentDao(Context context) {
        try {
            dao = DatabaseHelper.getInstance(context).getDao(Student.class);
            // 创建表, 此处两个方法调用皆有效
//            DatabaseHelper.getInstance(context).getReadableDatabase();
            DatabaseHelper.getInstance(context).getWritableDatabase();

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

// 以下方法没有优化,仅参考
    // 增
    public int add (Student student){
        try {
            return dao.create(student);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return -1;
    }

    // 删
    public int delete(int id){
        try {
            return dao.deleteById("");
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return -1;
    }

    // 改
    public int updata(Student student){
        try {
            return dao.update(student);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return -1;
    }

    // 查
    // 根据id查单个
    public Student query(int id){
        try {
            return dao.queryForId("");
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    // 查所有的
    public List<Student> select(){
        try {
            return dao.queryForAll();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
}

猜你喜欢

转载自blog.csdn.net/A_Bear/article/details/83614893