android OrmLite


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

1.下載jar包

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

將下載的jar包放到我們項目的libs文件夾下

2.創建實體類對象

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

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類的進行增刪改查的操作

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM