Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android數據庫框架——ORMLite輕量級的對象關系映射(ORM)Java包

Android數據庫框架——ORMLite輕量級的對象關系映射(ORM)Java包

編輯:關於Android編程

 

這裡寫圖片描述vc/Hv7TztcSjrLK7ysfO0sPHyP3R1MG90+++zcTcveK+9rXEo6zO0tK71rHP67PpuPbKsbzk19S8utTZuf3Su7HpU3FsaXRlus1KREJDtcSjrLWrysejrLTzvNLSstaqtcCjrMv2ysKxyL3PtuCjrM7Sw8fAtMu10rvPwsr9vt2/4rXEv/K83LDJo6zKwsq1yc/K0MPmyc+jrM7SvvW1w7u5v8nS1LXEyv2+3b/iv/K83NPQwb249qOsT1JNTGl0ZbrNR3JlZW5EYW+jrM7S0tTHsNf2tcTUy7avwOC1xNOm08PJz6Osvs3Q6NKqtOa0orTzwb+1xNTLtq/K/b7do6zO0sPH1+6/qsq8ysfU2rG+tdjQtMr9vt2/4rXEo6zEx9KyysexyL3PwM+1xMLfvK3By6OsuvPAtM7Sw8fXvLG41ti5uc/uxL+1xMqxuvKjrM7Svva2qLDRyv2+3b/i0rLW2Lm50rvPwqOs0vLOqs7Sw8e1scqxtcTTptPDtsHIocvZtsjAtLu5ysexyL3Pwv21xKOsscjI58Tj09DSu8G9xOq1xMr9vt3WrsDgtcSjrM7SuvPAtL7N0dC+v8HL0rvPwtXiwb249r/yvNyjrMvkyLvO0tfuuvOyydPDtcTKx0dyZWVuRGFvo6y1q8rHT1JNTGl0ZdKyysfR0L6/wcvSu7vhtvmjrMv50tSjrL3Tz8LAtKOsztK9q7DR1eLBvbj2v/K83LfWwb3Gqs7E1cLAtLfWzvajrMrXz8i+zcrHT1JNTGl0ZcHLLM34yc+7ucrH09C63LbgudjT2sv7w8e1xM7E1cK1xKOsy/nS1M7S0rLKx9e8sbjVvtTavt7Iy7XEvOew8snPo6zK18/Iy/vDx9auvOS1xNPFyLG146Os0rLT0MewsbLQtMHLo6zE47/J0tSyzr+80rvPwjwvcD4NCjwvYmxvY2txdW90ZT4NCjxhIGhyZWY9"http://blog.csdn.net/xushuaic/article/details/24434881">SQLite數據庫框架ORMLite與GreenDao的簡單比較

而且鴻洋老師也寫了兩篇關於ORMLite的文章

Android ORMLite 框架的入門用法 Android 快速開發系列 ORMLite 框架最佳實踐

但是就算他們寫了,我覺得我再根據自己的邏輯去講一遍,很多人還是會收益的,我自信我的文筆應該還是算不錯的,而且我是基於Android studio來講的。嘻嘻,話不多說,我們來新建一個項目:

這裡寫圖片描述

一.准備工作

在以前,我們寫數據庫時怎麼寫的?那就是頻繁的去寫SQLiteOpenHelper了,所以後來在我們開發中,很多人就喜歡封裝他們,提高性能,也就出現了很多的數據庫框架,ORMLite算是一個佼佼者了

官網:http://ormlite.com/ jar下載:http://ormlite.com/releases/

我們根據官方文檔來看這個框架是怎麼樣集成的,官網上有共有四個步驟

http://ormlite.com/javadoc/ormlite-core/doc-files/ormlite_1.html#Getting-Started

這裡寫圖片描述

知道他需要兩個jar,一個android的,一個core的可以直接去下載

這裡寫圖片描述

然後添加到libs目錄下,然後右鍵——Add As Library就算是添加成功了,緊接著,我們在xml中寫個按鈕用來創建表和保存數據

     

二.Bean類

OK,我們繼續看文檔,他需要編寫一個bean類來聲明一些表明和字段的

這裡寫圖片描述

既然如此,那我們就創建好了,這個類可不簡單,它主要通過注解去注明表單信息,然後映射給整個數據庫,我們看

package com.lgl.ormlite;

import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;

/**
 * bean類,對應的整個數據庫的表單信息,幫助我們映射到整個數據庫當中
 * Created by LGL on 2016/6/26.
 */
//配置表名
@DatabaseTable(tableName = "user_info")
public class User {
    //配置主鍵 id
    @DatabaseField(generatedId = true)
    private int id;
    //名稱
    @DatabaseField(columnName = "name")
    private String name;
    //描述
    @DatabaseField(columnName = "desc")
    private String desc;

    //空構造
    public User(){

    }
    //構造方法
    public User(int id, String name, String desc) {
        this.id = id;
        this.name = name;
        this.desc = desc;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", desc='" + desc + '\'' +
                '}';
    }
}

寫起來還是邏輯性很強的,如果需要一些特別的參數的話,可以參考一下官網上的項目描述,首先在User類上添加@DatabaseTable(tableName = “user_info”),標明這是數據庫中的一張表名字為user_info,然後分別在屬性上添加@DatabaseField(columnName = “name”) ,columnName的值為該字段在數據中的列名,@DatabaseField(generatedId = true) ,generatedId 表示id為主鍵且自動生成,好了,到這裡,我們繼續看官方的文檔了

三.Dao類

官網寫的很詳細呀,我們跟著造輪子既可呀,嘿嘿,那我們就來寫這個Dao類吧,注意,注釋寫的很清楚了哦!

這裡寫圖片描述

package com.lgl.ormlite;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;

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;
import java.util.HashMap;
import java.util.Map;

/**
 * Dao類
 * Created by LGL on 2016/6/26.
 */
public class DataBaseHelper extends OrmLiteSqliteOpenHelper {

    //創建數據庫名稱
    private static final String DATABASE_NAME = "ormlite_sql.db";
    //版本號
    private static final int DATABASE_VERSION = 1;
    //存放Dao
    private Map maps = new HashMap<>();

    //單例模式
    private static DataBaseHelper instance;

    public static synchronized DataBaseHelper getInstance(Context context) {
        if (instance == null) {
            synchronized (DataBaseHelper.class) {
                if (instance == null) {
                    instance = new DataBaseHelper(context);
                }
            }
        }
        return instance;
    }

    /**
     * 獲得數據庫的訪問對象
     *
     * @param cls
     * @return
     * @throws SQLException
     */
    public synchronized Dao getDao(Class cls) throws SQLException {
        Dao dao = null;
        //通過反射獲得類的名稱
        String clsName = cls.getSimpleName();
        //是否存在該對象
        if (maps.containsKey(clsName)) {
            dao = maps.get(clsName);
        } else {
            dao = super.getDao(cls);
            maps.put(clsName, dao);
        }
        return dao;
    }

    /**
     * 關閉所有操作
     */
    public void close() {
        super.close();
        //獲取所有的map鍵值對置空
        for (String key : maps.keySet()) {
            Dao dao = maps.get(key);
            dao = null;
        }
    }

    //構造方法
    public DataBaseHelper(Context context) {
        //上下文,數據庫名,null,版本號
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    //創建數據庫
    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource) {
        try {
            //對數據庫的創建以及表的建立
            TableUtils.clearTable(connectionSource, User.class);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    //更新數據庫
    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource, int i, int i1) {
        try {
            //調用更新就刪除數據庫
            TableUtils.dropTable(connectionSource, User.class, true);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

到這裡,我們的前期都OK了,緊接著,我們就可以去操作這些數據了

四.UserDao類

這個類主要是對數據的初始化和操作的

package com.lgl.ormlite;

import android.content.Context;

import com.j256.ormlite.dao.Dao;

import java.sql.SQLException;

/**
 * 數據庫操作類
 * Created by LGL on 2016/6/26.
 */
public class UserDao {

    //上下文
    private Context mContext;
    //主鍵查詢
    private DaouserDao;
    //Dao類
    private DataBaseHelper helper;

    public UserDao(Context mContext) {
        this.mContext = mContext;
        //創建數據庫
        helper = DataBaseHelper.getInstance(mContext);
        try {
            //操作Dao
            userDao = helper.getDao(User.class);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public void  addUser(User user){
        try {
            userDao.create(user);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

五.增

OK,基本上現在可以去實際的操作了,這個UserDao類我們等下還需要去完善,現在先這樣,我們去實現按鈕的點擊事件

    //點擊事件
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_create_save:
                userDao = new UserDao(this);
                User user = new User();
                user.setName("lgl");
                user.setDesc("Android");
                userDao.addUser(user);
                break;
        }
    }

到這裡,我們就可以去操作了,我們去看數據庫,打開DDMS

這裡寫圖片描述

當然,你也可以打開看看

這裡寫圖片描述

既然插入成功了,那我們嘗試一下多條語句的插入吧

           case R.id.btn_create_save:
                User user = new User();
                user.setName("lgl");
                user.setDesc("Android");
                userDao.addUser(user);

                User user1 = new User();
                user.setName("zhangsan");
                user.setDesc("IOS");
                userDao.addUser(user1);

                User user2 = new User();
                user.setName("lisi");
                user.setDesc("python");

                userDao.addUser(user2);
                break;

OK,運行一下

這裡寫圖片描述

六.改

我們繼續操作UserDao這個類

    //更新User
    public void updateUser(User user) {
        try {
            userDao.update(user);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

既然可以更新,那我們寫個按鈕

     

寫完之後,我們就可以執行了

       case R.id.btn_update:
                //我們可以修改id為1的這個數據
                User user3 = new User();
                user3.setId(1);
                user3.setName("lgl帥哥");
                userDao.updateUser(user3);
                break;

我們可以看下結果

這裡寫圖片描述

OK,這就是我們的改了,我們可以封裝一下

    /**
     * 根據ID來更新
     * @param user
     * @param id
     */
    public void updateById(User user,Integer id){
        try {
            userDao.updateId(user,id);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

還有一個修改方法

/**
     * 修改數據,支持多條
     *
     * @param user
     */
    public void updateUserByBuilder(User user) {
        try {
            UpdateBuilder builder = userDao.updateBuilder();
            builder.updateColumnValue("name", user.getName()).where().eq("id", 1);
            builder.update();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

七.刪除

刪除我們可以根據條件刪除,就直接貼代碼了

   /**
     * 刪除
     *
     * @param user
     */
    public void deleteUser(User user) {
        //刪除的方法比較多,根據的條件也比較多
        try {
            userDao.delete(user);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 多個對象的刪除操作
     *
     * @param users
     */
    public void deleteMulUser(List users) {
        try {
            userDao.delete(users);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 根據ID刪除
     *
     * @param ids
     */
    public void deleteUserById(List ids) {
        try {
            userDao.deleteIds(ids);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

你要刪除直接調用就好了

八.查

查算是比較多的場景了,我們也可以多條件查詢,看我們全部查詢的例子

   /**
     * 全部查詢
     *
     * @return
     */
    public List listAll() {
        try {
            return userDao.queryForAll();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

但是我們一般也不會用到全部查詢,條件查詢才是必須的,所以我們再新建一個按鈕


    

OK.我們就可以查詢了,我們寫個單表查詢

/**
     * 查詢單張表
     *
     * @return
     */
    public List queryBuilder() {
        List list = null;
        //查詢器
        QueryBuilder queryBuilder = userDao.queryBuilder();
        //聲明where條件
        Where where = queryBuilder.where();
        //查詢sesc字段的name是哪個值
        try {
            where.eq("name", "lgl");
            where.and();
            where.eq("desc", "Android");
            where.prepare();
            list = queryBuilder.query();
            //select * from user_info where name = 'lgl' and desc = 'Android'
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return list;
    }

注意在點擊事件裡

 case R.id.btn_query:
     List list = userDao.queryBuilder();
     Log.i(TAG, list.toString());
   break;

好的,我們現在看Log

這裡寫圖片描述

我們多條件查詢

    /**
     * 多條件查詢
     *
     * @return
     */
    public List queryBuilders() {
        List list = null;
        QueryBuilder queryBuilder = userDao.queryBuilder();
        Where where = queryBuilder.where();
        try {
            where.or(where.and(where.eq("", ""), where.eq("", "")), where.and(where.eq("", ""), where.ge("", ""))).query();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return list;
    }

這裡我們就不演示了

最後,只能說,ORMLite是比較強大的,我們如果真的要去理解他的話,還是得去看他的API文檔,不然真的無從下手,我這篇博文也只是希望大家能對ORMLite有個大概的了解,不敢妄自說精通,好的,本篇博客到這裡也就結束了,如果大家覺得還不錯的話,不妨點個贊!

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved