android OrmLite

来源:http://www.cnblogs.com/wangfengdange/archive/2017/05/03/6803081.html
-Advertisement-
Play Games

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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.實現如圖所示的單選效果 由於Android提供的單選按鈕radiobutton只能單行或單列顯示,且樣式並不美觀,故可用GridView進行改造,實現單選效果,而要實現這樣的效果重點就在GridView的適配器這塊了。 首先是GridView的item的XML: ...
  • 問題一:Exception: JNI: Init'd AndroidJavaObject with null ptr 解決方法: 所有關於JNI出現的問題,只有三種錯誤存在,第一是需要在真機上運行測試,不需要管;第二就是Bundle Identifier設置的與android工程的包名不同,設置為相 ...
  • 我用的是unity5.4.3版本,jdk是1.8.0_131版本,Android-SDK是r24.4.1版本,Android-NDK是r13b版本,作者是剛開始寫博客,希望對在unity摸索的人有幫助。 以下是環境搭建步驟 1下載安裝Java的JDK: http://www.oracle.com/t ...
  • 在上周我有一同事,他利用周末的時間自己做了一個IOS版本游戲類APP,用Unity3D開發的(抱著好玩的心態),於是他想發佈到蘋果App Store 上去。他沒有蘋果開發者賬號,也沒有購買過。 於是找到超波,叫我幫它去購買以下 (它知道我對購買流程還算熟悉),我覺得可以,就答應了 於是先叫它準備相關 ...
  • 筆記鏈接:http://www.cnblogs.com/igoslly/p/6805020.html 筆記以開發名為CoffeeOrder的app活動為線索,介紹app如何從功能設計→佈局設置→代碼編寫→改進,介紹java文件修改和佈局嵌套。 一、應用知識 首先來看一些AndroidStudio的基 ...
  • 參考官方文檔 https://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html 1.用戶進入授權界面(APP☞WeChat) 引導用戶打開鏈接: a-zA-Z0-9:小寫字母a至z;大寫字母A至Z;數字0至9 state補充 ...
  • 安卓顯示通知 ...
  • 一、概念 App混合開發,顧名思義,是一個開發模式,指的是開發一個App一部分功能用native構建一部分功能用html5構建,英文名叫:Hybrid App。 在幾年前就已經出現了App混合開發模式,但是真正開始流行始於2014年末,到了2016年已經很流行了,2017年將是鼎盛的一年,因為現在連 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...