最近在使用ormlite框架進行資料庫的操作,下麵簡單的寫個demo來學習下 1.下載jar包 這裡使用的是ormlite-core-5.0.jar 和 ormlite-android-5.0.jar 將下載的jar包放到我們項目的libs文件夾下 2.創建實體類對象 每一個實體類對應一張表,在我們 ...
最近在使用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(); } }