Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android ORMLite數據庫詳解

Android ORMLite數據庫詳解

編輯:關於Android編程

OrmLite是一個數據庫操作輔助的開源框架,底層還是Sqlite。O-R-M是Object relational mapping(對象關系映射)的縮寫,即業務實體對象與關系型數據庫之間的映射。業務實體對象就是我們所說的model類,可以類比為Gson解析時的model類;關系型數據庫可以理解為二維數據庫,表的格式就如Excel,有行和列兩個維度,sqlite就是二維的;映射:對象中的屬性與數據庫表中的字段一一對應。OrmLite直接操作業務對象,隱藏了數據庫操作的細節,使我們不用通過sql語句與數據庫打交道。

OrmLite通過Java注解的方式與數據庫建立映射關系,在這裡我以一個實例來進行說明,現在建立一個簡單的數據庫1607.db,並創建一張表Student來記錄一個學生的名字,年齡,性別,學號等。

下面是最終的實現效果(能夠正常的對數據庫進行增刪改查):

\

 

准備工作,先依賴類庫:

dependencies {
compile 'com.j256.ormlite:ormlite-android:5.0'
}

一、首先,創建我們的業務實體對象,就是我們所說的model類,並通過注解的方式與數據庫聯系起來:

 

1.@DatabaseTable用來聲明把此類作為數據庫的表,可以在後面的括號中填入表名(不填的話就以類名作為表名)

2.@DatabaseField(columnName=”“)用來聲明表的字段名,可以在後面的括號中設置字段的屬性

 

package com.example.administrator.ormsqlite;

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

/**
 * Created by Administrator on 2016/10/14.
 * 創建學生表
 * 1,這個類就表示一張表,類中的屬性表示字段
 *,2,需要用注解來標明這個類就是一張數據表
 * 3,需要用注解來標明屬性為表中的字段
 */
@DatabaseTable //可以通過(tableName = "user")來改變表名
public class Student {

    @DatabaseField //只有添加這個注釋,才能把此屬性添加到表中的字段
    private String name;

    @DatabaseField(generatedId = true) //generatedId = true 表示自增長的主鍵
    private int id;

    @DatabaseField
    private String className;

    @DatabaseField
    private int userId;

    @DatabaseField
    private String sex;

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public String getName() {
        return name;
    }

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

    public int getId() {
        return id;
    }

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

    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", id=" + id +
                ", className='" + className + '\'' +
                ", userId=" + userId +
                ", sex='" + sex + '\'' +
                '}';
    }
}

二、創建數據庫

 

與Android中的數據庫創建類似,使用OrmLite創建數據庫需要我們創建一個OrmHelper繼承OrmLiteSqliteOpenHelper,OrmLiteSqliteOpenHelper也有兩個方法需要我們去實現,分別是onCreate和onUpgrade,負責數據庫創建以及升級時的操作。

 

package com.example.administrator.ormsqlite;

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

import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper;
import com.j256.ormlite.support.ConnectionSource;
import com.j256.ormlite.table.TableUtils;

import java.sql.SQLException;

/**
 * Created by Administrator on 2016/10/14.
 * 創建和維護數據庫的類
 */
public class OrmHelper extends OrmLiteSqliteOpenHelper {

    public static final String DB_NAME ="1607.db";
    public static final int DB_VERSION = 1;

    public OrmHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) {
        //建表,和Gson類似,第二個參數即是業務實體類
        try {
            TableUtils.createTable(connectionSource,Student.class);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) {
        //區分不同的版本做不同的更新
    }
}

三、操作數據庫

 

創建數據庫之後就可以對數據庫操作了,數據庫的操作主要就是增刪查改。OrmLite操作數據庫的類是Dao,Dao相當於原生的SQLiteDatabase,一個Dao只能操作一張表。

1,插入操作

 

這些方法使用起來都比較簡單,我們只需將自己的Bean傳入到下列方法中即可

  • create:插入一條數據
  • createIfNotExists:如果不存在則插入
  • createOrUpdate:如果存在則更新

2,查詢數據

OrmLite為我提供了一系列的查詢操作,方法很多,而且很多都是只看方法名就可以知道的,在這裡介紹一下如何使用QueryBuilder進行復雜查找。

  • 首先調用personDao.queryBuilder();獲得該Dao下的QueryBuilder對象,
  • 接下來設置QueryBuilder的查詢條件,
  • 最後通過QueryBuilder的query方法獲得List對象

3,刪除和修改數據

與查詢操作類似,ORMLite同樣為我們提供了一系列的方法,同時也提供了復雜刪除,復雜更改的DeleteBuilder和UpdateBuilder,其用法與QueryBuilder相似。

取數據庫的操作類
     * @param context
     * @throws SQLException
     */
    public DBManager(Context context) throws SQLException {
        OrmHelper ormHelper = new OrmHelper(context);
//        SQLiteDatabase readableDatabase = ormHelper.getReadableDatabase(); //可以獲取一個原生的數據庫
        //Dao相當於原生的SQLiteDatabase,可以操作數據庫,一個Dao只能操作一張表
        dao = ormHelper.getDao(Student.class);
    }

    /**
     * 插入數據
     * @param student
     * @throws SQLException
     */
    public void insertStudent(Student student) throws SQLException {
        //在數據庫中創建一條記錄,作用與SQLiteDatabase.insert一樣
        dao.create(student);
    }

    /**
     * 批量插入
     * 不能使用循環一個一個的插入,因為這樣會一直打開數據庫、插入數據、
     * 關閉數據庫
     * @param students
     * @throws SQLException
     */
    public void batchInsert(Liststudents) throws SQLException {
        dao.create(students);
    }

    /**
     * 查詢數據
     * @return
     * @throws SQLException
     */
    public List getStudent() throws SQLException {
        List list = dao.queryForAll();
        return list;
    }

    /**
     * 查詢某個數據
     * @return
     * @throws SQLException
     */
    public List queryGuanyu() throws SQLException {
        //Eq是equals的縮寫
        //方法1
        //List list = dao.queryForEq("name", "張飛");

        //方法2
        QueryBuilder queryBuilder = dao.queryBuilder();
//        queryBuilder.offset(); //偏移量
//        queryBuilder.limit(8l); //最多幾行  offset + limit 做分頁
//        queryBuilder.orderBy("age",true);
        queryBuilder.where().eq("name","關羽"); //多條件查詢
        List query = queryBuilder.query();//此方法相當於build,提交設置
        return query;
    }

    /**
     * 刪除數據
     * @param student
     * @throws SQLException
     */
    public void deleteStudent(Student student) throws SQLException {
        //只看id
        dao.delete(student);
    }

    /**
     * 刪除指定數據
     * @throws SQLException
     */
    public void deleteGuanyu() throws SQLException {
        DeleteBuilder deleteBuilder = dao.deleteBuilder();
        deleteBuilder.where().eq("name","關羽");
        deleteBuilder.delete();
    }

    /**
     * 修改數據
     * @param student
     * @throws SQLException
     */
    public void updateStudent(Student student) throws SQLException {
        student.setName("關羽");
        dao.update(student);
    }

    /**
     * 修改指定數據
     * @throws SQLException
     */
    public void updateGuanyu() throws SQLException {
        UpdateBuilder updateBuilder = dao.updateBuilder();
        updateBuilder.where().eq("name","關羽");
        updateBuilder.updateColumnValue("sex","女");
        updateBuilder.update();
    }
}

四、在MainActivity中測試上面創建的數據庫和對數據庫操作的方法,並把數據顯示到listview上,對應的布局文件:

 




    

五、MainActivity中的代碼,代碼中沒有什麼新知識,該注釋的都注釋了,這裡不再冗余:

 

 

package com.example.administrator.ormsqlite;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private DBManager dbManager;
    private ListView list;
    private List mStudents;
    private MyAdapte myAdapte;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        //把數據顯示在listview上
        myAdapte = new MyAdapte();
        list.setAdapter(myAdapte);

        //初始化DBManager
        try {
            dbManager = new DBManager(this);
        } catch (SQLException e) {
            e.printStackTrace();
        }

        //剛進來時查詢所有的student
        queryStudent();

        //給listview設置點擊監聽和長按監聽
        list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView adapterView, View view, int i, long l) {
                try {
                    //單擊刪除該student
                    dbManager.deleteStudent(mStudents.get(i));
                    queryStudent();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        });
        list.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView adapterView, View view, int i, long l) {
                try {
                    //長按修改student
                    dbManager.updateStudent(mStudents.get(i));
                    queryStudent();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                return true;
            }
        });
    }

    /**
     * 初始化控件
     */
    private void initView() {
        findViewById(R.id.insert).setOnClickListener(this);
        findViewById(R.id.delete).setOnClickListener(this);
        findViewById(R.id.insert).setOnClickListener(this);
        findViewById(R.id.insertAll).setOnClickListener(this);
        findViewById(R.id.query).setOnClickListener(this);
        list = (ListView) findViewById(R.id.list);
    }

    /**
     * 查詢所有的student
     */
    public void queryStudent(){
        try {
            mStudents = dbManager.getStudent();
            myAdapte.notifyDataSetChanged();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 查詢指定數據
     */
    public void queryGuanyu(){
        try {
            mStudents = dbManager.queryGuanyu();
            myAdapte.notifyDataSetChanged();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.insert: //插入一條數據
                Student student = new Student();
                student.setName("張飛");
                student.setSex("男");
                student.setUserId(123);
                student.setClassName("1607");
                try {
                    dbManager.insertStudent(student);
                    queryStudent();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                break;
            case R.id.delete: //刪除指定數據(關羽)
                try {
                    dbManager.deleteGuanyu();
                    queryStudent();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                break;
            case R.id.update: //修改指定數據(修改關羽的性別)
                try {
                    dbManager.updateGuanyu();
                    queryStudent();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                break;
            case R.id.query: //查詢指定數據(關羽)
                queryGuanyu();
                break;
            case R.id.insertAll: //批量插入數據
                List studnets = new ArrayList<>();
                for (int i = 0; i < 10; i++) {
                    Student stu = new Student();
                    stu.setName("劉備");
                    stu.setClassName("234");
                    stu.setUserId(i);
                    stu.setSex("男");
                    studnets.add(stu);
                }
                try {
                    dbManager.batchInsert(studnets);
                    queryStudent();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                break;
        }
    }

    /**
     * ListView對應的適配器
     */
    class MyAdapte extends BaseAdapter{

        @Override
        public int getCount() {
            return mStudents == null ? 0 : mStudents.size();
        }

        @Override
        public Object getItem(int i) {
            return mStudents.get(i);
        }

        @Override
        public long getItemId(int i) {
            return i;
        }

        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {
            TextView tv = new TextView(MainActivity.this);
            tv.setTextSize(18);
            tv.setText(mStudents.get(i).toString());
            return tv;
        }
    }
}
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved