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
有任何问题,欢迎指出.

    原文作者:EdwardWinner
    原文地址: https://www.jianshu.com/p/a8a6429ac772
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞