android OrmLite

最近在使用ormlite框架進行數據庫的操做,下面簡單的寫個demo來學習下java

1.下載jar包android

這裏使用的是ormlite-core-5.0.jar 和 ormlite-android-5.0.jarsql

將下載的jar包放到咱們項目的libs文件夾下數據庫

2.建立實體類對象安全

每個實體類對應一張表,在咱們項目中的bean目錄下建立一個Student類app

package com.item.jiejie.lite.db;

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

/**
 * 定義實體類Bean,表明一張表
 * 須要持久化到數據庫的類,類名前須要添加@DatabaseTable,生成對應的表 類中的成員須要添加@DatabaseField,生成前面的表中的字段
 * 注意:在須要持久化的類中必需要有無參的構造器
 * Created by jiejie on 2017/5/3.
 */
@DatabaseTable(tableName = "tb_hello")
public class Hello {
    @DatabaseField(generatedId = true)
    private int id;
    @DatabaseField(columnName = "name")
    private String name;
    @DatabaseField(columnName = "sex")
    private String sex;
    @DatabaseField(columnName = "age")
    private int age;
    /*
     * 經常使用參數
     * generatedId = true 主鍵,自動生成的id 該註解下的字段必須是整形(int long)
     * id = true 主鍵
     * unique = true 惟一約束 默認false
     * columnName = "name" 表字段名,默認爲變量名稱
     * canBeNull = false 非空約束,默認爲true,能夠爲null,設爲false就不能爲null
     * foreign = true 外鍵引用,字段不能是一個原始類型,應該定義一個對象當作外鍵引用,在外鍵對象的類中,必需要有一
     * 個ID字段(ID, generatedId,generatedIdSequence)
     * foreignAutoRefersh = true 在使用外鍵引用時,因爲ormlite的外鍵引用使用的是對象,因此添加這個字段的話在查詢,會把
     * 外鍵的對象數據都查詢回來,不然外鍵數據就只有那個對象的主鍵有值,其他的值都是null
     * defaultValue = "小明" 默認值
     * index = true 創建索引 默認爲false
     * uniqueIndex = true 惟一索引 默認爲false
     */

    //空的構造方法必定要有,不然數據庫會建立失敗
    public  Hello(){

    }
    public Hello(String name, String sex, int age) {
        this.name = name;
        this.sex = sex;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Hello{" +
                "name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", age=" + age +
                '}';
    }
}

3.編寫咱們的數據helper類框架

package com.item.jiejie.lite.db;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
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;
import java.sql.SQLException;

/**
 * 編寫DAO類
 * Created by jiejie on 2017/5/3.
 */

public class DataHelper extends OrmLiteSqliteOpenHelper{

    private static  final  String TABLE_NAME = "Hellotext.db";
    /**
     * helloDao 沒張表對應一個
     */
    private Dao<Hello,Integer> helloDao = null;

    /**構造方法*/
    public DataHelper(Context context) {
        super(context, TABLE_NAME, null, 1);
    }
    //建立數據表
    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource) {
        try {
            TableUtils.createTable(connectionSource,Hello.class);
            Log.d("jiejie","數據庫建立成功");
        } catch (SQLException e) {
            e.printStackTrace();
            Log.d("jiejie","數據庫更新成功");
        }
    }
    //數據庫更新
    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource, int i, int i1) {
        try {
            TableUtils.dropTable(connectionSource,Hello.class,true);
            onCreate(sqLiteDatabase,connectionSource);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 單例獲取該Helper
     * 1.先把構造函數私有化
     * 2.對外提供一個靜態方法
     * 3.在方法中判斷若是已經存在就再也不建立,若是不存在再建立這樣就永遠只有一個DataHelper對象
     * 4.爲了線程安全,須要再方法錢提供一個線程安全關鍵字synchronized
     */
    private static  DataHelper instance;
    public static  synchronized  DataHelper getHeper(Context context){
        if(instance == null){
            synchronized (DataHelper.class){
                if(instance == null){
                    instance = new DataHelper(context);
                }
            }
        }
        return instance;
    }
    public Dao<Hello,Integer> getHelloDao() throws  SQLException{
        if(helloDao == null){
            helloDao = getDao(Hello.class);
        }
        return helloDao;
    }
    public  synchronized void clearData(Class<Hello> clase){
        try {
            TableUtils.clearTable(connectionSource,clase);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    /**
     * 釋放資源
     */
    @Override
    public void close() {
        super.close();
        helloDao = null;
    }
}

4.編寫咱們的Dao類的進行增刪改查的操做ide

package com.item.jiejie.lite.db;

import android.content.Context;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.support.DatabaseConnection;
import java.sql.SQLException;
import java.sql.Savepoint;
import java.util.ArrayList;
import java.util.List;

/**
 * 定義數據訪問對象,對指定的表進行增刪改查的操做
 * Created by jiejie on 2017/5/3.
 */

public class HelloDao {
    private Dao<Hello,Integer> helloDao;
    private DataHelper dataHelper;

    /**
     * 構造方法,獲取數據庫幫助類實例,經過傳入class對象獲得相應的Dao
     * @param context
     */
    public HelloDao(Context context){
        try {
            dataHelper = DataHelper.getHeper(context);
            helloDao = dataHelper.getHelloDao();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 添加一條記錄
     * @param hello
     */
    public void add(Hello hello){
        try {
            helloDao.create(hello);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 插入大量的數據
     * 開啓事務
     * 關閉自動提交
     * @param hellos
     */
    public void addList(List<Hello> hellos){
        try{
            DatabaseConnection conn = helloDao.startThreadConnection();
            Savepoint savepoint = conn.setSavePoint(null);
            helloDao.setAutoCommit(conn,false);
            for(Hello hello : hellos){
                helloDao.createOrUpdate(hello);
            }
            conn.commit(savepoint);
            helloDao.endThreadConnection(conn);
        }catch (SQLException e){
            e.printStackTrace();
        }
    }

    /**
     * 刪除一條記錄
     * @param hello
     */
    public void delete(Hello hello){
        try {
            helloDao.delete(hello);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 更新一條記錄
     * @param hello
     */
    public void update(Hello hello){
        try {
            helloDao.update(hello);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 查詢一條記錄
     * @param id
     * @return
     */
    public Hello queryForId(int id){
        Hello hello = null;
        try {
            hello = helloDao.queryForId(id);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return hello;
    }

    /**
     * 查詢全部的記錄
     * @return
     */
    public List<Hello> queryForAll(){
        List<Hello> hellos = new ArrayList<>();
        try {
            hellos = helloDao.queryForAll();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return hellos;
    }
}

5.測試函數

我在測試的時候,模擬插入3w條數據時,發現不一樣的模擬器 插入的時間不一樣,有的9s有的要將近十幾s,學習

可能我在編寫  插入大數據的時候仍是有點問題的

 private class TaskDb extends AsyncTask<Integer,Void,Long>{
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected Long doInBackground(Integer... params) {
            long start = System.currentTimeMillis();
            List<Hello> hList = new ArrayList<Hello>();
            for(int i=0;i<10000;i++){
                Hello hello = new Hello("Hello" + i,"nan", i);
                hList.add(hello);
            }
            helloDao.addList(hList);
            long endTime = System.currentTimeMillis();
            return endTime - start;
        }

        @Override
        protected void onPostExecute(Long aLong) {
            super.onPostExecute(aLong);
            Log.d("jiejie","數據加載成功 " +aLong);
            Toast.makeText(MainActivity.this,"數據加載成功用時" +aLong ,Toast.LENGTH_SHORT).show();
        }
    }
相關文章
相關標籤/搜索