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