在创建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;
}
}