最近在使用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();
}
}
轉載于:https://www.cnblogs.com/wangfengdange/p/6803081.html