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;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章