最近在使用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(); } }