OrmLite数据库使用

Android中有很多操作SQLite数据库的框架,现在最常见、最常用的是OrmLite和GreenDAO。OrmLite相比与GreenDAO来说是一个轻量级的框架,而且学习成本相对较低。

要使用OrmLite,首先需要导入OrmLite的依赖:在build.gradle中加入以下代码:

引入依赖

implementation files('libs/ormlite-android-5.0.jar')
implementation files('libs/ormlite-core-5.0.jar')

OrmLite需要我们自己实现一个类似原生操作SQLite数据库的DatabaseHelper,但必须继承自OrmLite为我们提供的OrmLiteSqliteOpenHelper。以下是一个功能比较齐全,性能相对也比较好的实例,这个实例不仅仅起到了创建数据库和更新数据库的操作,代码如下:

创建数据库

需要创建一个类来继承OrmLiteSqliteOpenHelper,完成数据的创建以及升级
DetailDataOpenHelper.java

package com.example.edwardadmin.ormdatabase.database;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.os.Environment;
import android.util.Log;

import com.example.edwardadmin.ormdatabase.entity.IdentityInfo;
import com.example.edwardadmin.ormdatabase.entity.PersonInfo;
import com.example.edwardadmin.ormdatabase.entity.PersonToken;
import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper;
import com.j256.ormlite.support.ConnectionSource;
import com.j256.ormlite.table.TableUtils;

import java.sql.SQLException;

public class DetailDataOpenHelper extends OrmLiteSqliteOpenHelper {

    //定义数据库存放位置,便于以后查看
    public static final String DATABASE_PATH = Environment.getExternalStorageDirectory() + "/detail.db";
    //定义数据库的版本号,当数据库需要升级时进行更改
    public static final int DATABASE_VERSION = 1;
    //创建DetailDataOpenHelper实例
    private static DetailDataOpenHelper instance;

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

    public DetailDataOpenHelper(Context context) {
        super(context, DATABASE_PATH, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource) {
        try {
            TableUtils.createTable(connectionSource, PersonInfo.class);
            TableUtils.createTable(connectionSource, IdentityInfo.class);

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource, int oldVersion, int newVersion) {
        try {
            TableUtils.dropTable(connectionSource, IdentityInfo.class, false);
            TableUtils.createTable(connectionSource, IdentityInfo.class);
            
            TableUtils.createTable(connectionSource, PersonInfo.class);
            TableUtils.dropTable(connectionSource, PersonInfo.class, false);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

onCreate 初始化数据库

  • 调用TableUtils.createTable(connectionSource, PersonInfo.class);

onUpgrade 升级数据库

  • 先删除表,调用TableUtils.dropTable(connectionSource, IdentityInfo.class, false);
  • 然后创建表,调用TableUtils.createTable(connectionSource, IdentityInfo.class);

创建JavaBean

PersonInfo.java

package com.example.edwardadmin.ormdatabase.entity;

import com.j256.ormlite.dao.ForeignCollection;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.field.ForeignCollectionField;
import com.j256.ormlite.table.DatabaseTable;

import java.io.Serializable;
import java.util.ArrayList;

@DatabaseTable(tableName = "t_person")
public class PersonInfo implements Serializable {

    @DatabaseField(columnName = "id", generatedId = true)
    public int id;

    @DatabaseField(columnName = "personName")
    private String personName;

    @DatabaseField(columnName = "personSex")
    private String personSex;

    @DatabaseField(columnName = "personAge")
    private String personAge;

    @DatabaseField(columnName = "personHeight")
    private String personHeight;

    @DatabaseField(columnName = "personNative")
    private String personNative;

    @DatabaseField(columnName = "personNumber")
    private String personNumber;

    @DatabaseField(columnName = "personImage")
    private String personImage;

    /**
     * 创建空的构造函数,否则报错
     */
    public PersonInfo() {
    }

    public PersonInfo(String personName, String personSex, String personAge, String personHeight, String personNative, String personNumber) {
        this.personName = personName;
        this.personSex = personSex;
        this.personAge = personAge;
        this.personHeight = personHeight;
        this.personNumber = personNumber;
        this.personNative = personNative;
    }

    public PersonInfo(String personName, String personSex, String personAge, String personHeight, String personNative, String personNumber, String personImage) {
        this.personName = personName;
        this.personSex = personSex;
        this.personAge = personAge;
        this.personHeight = personHeight;
        this.personNumber = personNumber;
        this.personNative = personNative;
        this.personImage = personImage;
    }

    public String getPersonName() {
        return personName;
    }

    public String getPersonSex() {
        return personSex;
    }

    public String getPersonAge() {
        return personAge;
    }

    public String getPersonHeight() {
        return personHeight;
    }

    public String getPersonNative() {
        return personNative;
    }

    public String getPersonNumber() {
        return personNumber;
    }

    public String getPersonImage() {
        return personImage;
    }

    @Override
    public String toString() {
        return "PersonInfo{" +
                "id=" + id +
                ", personName='" + personName + '\'' +
                ", personSex='" + personSex + '\'' +
                ", personAge='" + personAge + '\'' +
                ", personHeight='" + personHeight + '\'' +
                ", personNative='" + personNative + '\'' +
                ", personNumber='" + personNumber + '\'' +
                ", personImage='" + personImage + '\'' +
                ", personTokens=" + personTokens +
                '}';
    }
}

注解含义

  • @DatabaseTable(tableName = "t_person"),此处指创建了一个的t_person的表
  • @DatabaseField(columnName = "id", generatedId = true),此处指创建了名为id的字段名,且是主键
  • @DatabaseField(columnName = "personName"),此处指创建了名为personName的字段名

常用参数

  • 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

创建PersonDao

PersonDao.java

package com.example.edwardadmin.ormdatabase.database;

import android.content.Context;

import com.example.edwardadmin.ormdatabase.entity.PersonInfo;
import com.j256.ormlite.dao.Dao;

import java.sql.SQLException;

public class PersonDao {

    private Dao<PersonInfo,Integer> personInfoDao;

    public Dao<PersonInfo, Integer> getPersonInfoDao(Context mContext) {
        if (personInfoDao == null) {
            personInfoDao = createPersonDao(mContext);
        }
        return personInfoDao;
    }

    private Dao createPersonDao(Context mContext) {
        try {
            return DetailDataOpenHelper.getInstance(mContext).getDao(PersonInfo.class);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
}

  • 调用createPersonDao方法,通过DetailDataOpenHelper.getInstance(mContext).getDao(PersonInfo.class);

创建IPersonOperation接口

IPersonOperation.java

package com.example.edwardadmin.ormdatabase.database;

import com.example.edwardadmin.ormdatabase.entity.PersonInfo;

import java.util.ArrayList;

public interface IPersonOperation {

    boolean insertPersonData(PersonInfo personInfo);
    boolean deletePersonData(PersonInfo personInfo);
    ArrayList<PersonInfo> queryPersonData();
    PersonInfo queryPersonDataByPersonNumber(String personNumber);
}

  • 插入PersonInfo对象到数据库
  • 从数据库中删除PerosnInfo对象
  • 从数据库中查询所有的PersonInfo对象
  • 根据personNumber查询PersonInfo对象

创建PersonInfoOperationTask

PersonInfoOperationTask.java

package com.example.edwardadmin.ormdatabase.database;

import android.content.Context;
import android.util.Log;

import com.example.edwardadmin.ormdatabase.entity.PersonInfo;
import com.j256.ormlite.dao.Dao;

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

public class PersonInfoOperationTask extends BaseOperationTask implements IPersonOperation {

    private Dao<PersonInfo, Integer> personInfoDao;
    private ArrayList<PersonInfo> mAllPersonData;

    public PersonInfoOperationTask(Context mContext) {
        super(mContext);
        personInfoDao = new PersonDao().getPersonInfoDao(mContext);
    }

    @Override
    public boolean insertPersonData(PersonInfo personInfo) {
        Savepoint savepoint = null;
        try {
            savepoint = androidDatabaseConnection.setSavePoint("start");
            androidDatabaseConnection.setAutoCommit(false);
            int startResult = personInfoDao.create(personInfo);
            androidDatabaseConnection.commit(savepoint);
            if (startResult != -1) {
                return true;
            }
            return false;
        } catch (SQLException e) {
            e.printStackTrace();
            try {
                androidDatabaseConnection.rollback(savepoint);
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        }
        return false;
    }

    @Override
    public boolean deletePersonData(PersonInfo personInfo) {
        Savepoint savePoint = null;
        try {
            savePoint = androidDatabaseConnection.setSavePoint("start");
            androidDatabaseConnection.setAutoCommit(false);
            int deleteResult = personInfoDao.delete(personInfo);
            androidDatabaseConnection.commit(savePoint);
            if (deleteResult != -1) {
                return true;
            }
            return false;
        } catch (SQLException e) {
            e.printStackTrace();
            try {
                androidDatabaseConnection.rollback(savePoint);
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
            return false;
        }
    }

    @Override
    public ArrayList<PersonInfo> queryPersonData() {
        mAllPersonData = new ArrayList<>();
        Savepoint savepoint = null;
        try {
            savepoint = androidDatabaseConnection.setSavePoint("start");
            androidDatabaseConnection.setAutoCommit(false);
            mAllPersonData = (ArrayList<PersonInfo>) personInfoDao.queryBuilder().orderBy("id", false).query();
            androidDatabaseConnection.commit(savepoint);
            return mAllPersonData;
        } catch (SQLException e) {
            e.printStackTrace();
            try {
                androidDatabaseConnection.rollback(savepoint);
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        }
        return null;
    }

    @Override
    public PersonInfo queryPersonDataByPersonNumber(String personNumber) {
        PersonInfo personInfo = null;
        Savepoint savepoint = null;
        try {
            savepoint = androidDatabaseConnection.setSavePoint("start");
            ArrayList<PersonInfo> list = (ArrayList<PersonInfo>) personInfoDao.queryForAll();
            for(int index = 0; index < list.size(); index ++) {
                PersonInfo info1 = list.get(index);
                if (info1.getPersonNumber().equals(personNumber)) {
                    personInfo = info1;
                }
            }
            androidDatabaseConnection.setAutoCommit(false);
            mAllPersonData = (ArrayList<PersonInfo>) personInfoDao.queryBuilder().orderBy("id", false).query();
            androidDatabaseConnection.commit(savepoint);
            return personInfo;
        } catch (SQLException e) {
            e.printStackTrace();
            try {
                androidDatabaseConnection.rollback(savepoint);
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        }
        return null;
    }
}

  • SavePoint 创建事务保存点
  • AndroidDatabaseConnection 获取数据库连接
  • 操作成功,提交事务,操作失败,回滚事务

数据模拟

创建PersonInteractorImpl.java

package com.example.edwardadmin.ormdatabase.fragment;

import android.content.Context;
import android.util.Log;

import com.example.edwardadmin.ormdatabase.database.PersonInfoOperationTask;
import com.example.edwardadmin.ormdatabase.database.PersonTokenOperationTask;
import com.example.edwardadmin.ormdatabase.entity.PersonInfo;

import java.util.ArrayList;

public class PersonInteractorImpl implements IPersonInteractor {

    private PersonInfoOperationTask personInfoOperationTask;
    private PersonTokenOperationTask personTokenOperationTask;

    public PersonInteractorImpl(Context mContext) {
        personInfoOperationTask = new PersonInfoOperationTask(mContext);
        personTokenOperationTask = new PersonTokenOperationTask(mContext);
    }

    /**
     * 加载数据,从数据库中查询数据
     * @param loadingFinishedListener
     */
    @Override
    public void loadPersonData(onLoadingFinishedListener loadingFinishedListener) {
        ArrayList<PersonInfo> personInfoArrayList = personInfoOperationTask.queryPersonData();
        if (personInfoArrayList != null) {
            loadingFinishedListener.loadPersonDataSuccess(personInfoArrayList);
        } else {
            loadingFinishedListener.loadPersonDataError();
        }
    }

    /**
     * 添加数据,将PersonInfo,插入到数据库中
     * @param personInfo
     * @param loadingFinishedListener
     */
    @Override
    public void addPersonData(PersonInfo personInfo, onLoadingFinishedListener loadingFinishedListener) {
        boolean insert = personInfoOperationTask.insertPersonData(personInfo);
        if (insert) {
            loadingFinishedListener.addPersonDataSuccess();
        } else {
            loadingFinishedListener.addPersonDataError();
        }
    }

}

  • 从数据库中查询所有的PersonInfo数据,将获取的ArrayList进行返回,初始化Aapter,更新数据源
  • 根据传入PersonInfo对象,插入到数据库中,如果返回的结果是true,但是插入成功,反之,插入失败。

Github地址:
ORMDataBase:https://github.com/EricWinner/ORMDataBase
有任何问题,欢迎指出.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容

  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,317评论 0 9
  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 31,931评论 2 89
  • 小时候纠结的事情有三:拨打电话,路遇熟人,拜年敬酒,按理说这些事远远比不上背诵诗文,证明假设,接通电路,粗...
    摘海填星阅读 348评论 0 8
  • 응:우청야,3급이 끝난 후 방학에 고향에 돌아갈 까? 우:응,돌아갈 거야.동창회도 있어 응:동창회라고?...
    君_三少阅读 344评论 0 0
  • 一个唱歌的千拥万簇 一个农民地有三亩 唱歌的说你看我多辛苦 农民说孩子上学得再卖头猪。
    晓晓博士阅读 276评论 0 2