OrmLite 5.3使用笔记
参考 + 整理
OrmLite 快速入门
OrmLite数据库使用
Ormlite基本使用
前言
在Android项目开发中,经常会使用到数据库,
OrmLite
它的英文全称是Object Relational Mapping
意思是对象关系映射;
简单来说,就是我们定义一个实体类,利用这个框架
它可以帮我们吧这个实体映射到我们的数据库中
数据中的字段就是我们定义实体的成员变量。
1.下载OrmLite Jar
OrmLite官网
Android需要下载两个Jar包:Core 列和 Android 列各下载一个Jar包.
将两个jar包,放到项目中的libs文件夹,并作为项目的Library.
implementation files('libs/ormlite-android-5.3.jar') implementation files('libs/ormlite-core-5.3.jar')
2.创建Bean类
每一个Bean类,相当于都对应数据库中的一张表
在OrmLite中
不需要写sql语句
只需要在对应的字段上
添加需要的注解就够了
2.1介绍注解
@DatabaseTable
@DatabaseField
2.2Bean对象
@DatabaseTable(tableName = “t_account”),此处指创建了一个的t_account的表
@DatabaseField(columnName = “id”, generatedId = true)
generatedId = true 此处指创建了名为id的字段名且是自动生成的主键
@DatabaseField(columnName = “account”),此处指创建了名为account的字段名
@DatabaseTable(tableName = "t_account")
public class Account implements Serializable {
@DatabaseField(columnName = "id", generatedId = true)
private Integer id;
@DatabaseField(columnName = "account")
private String account;
@DatabaseField(columnName = "password")
private String password;
/**
* 创建空的构造函数,否则报错
*/
public Account() {
}
public Account(String account, String password) {
this.account = account;
this.password = password;
}
@Override
public String toString() {
return "Account{" +
"id=" + id +
", Account='" + account + '\'' +
", password='" + password + '\'' +
'}';
}
3.继承 OrmLiteSqliteOpenHelper
继承OrmLiteSqliteOpenHelper类,OrmLiteSqliteOpenHelper是SQLiteOpenHelper的子类.
我们需要自定义一个类继承自ORMlite给我们提供的OrmLiteSqliteOpenHelper,
创建一个构造方法,重写两个方法onCreate()和onUpgrade()
在onCreate()方法中使用TableUtils类中的createTable()方法初始化数据表
在onUpgrade()方法中我们可以先删除所有表,然后调用onCreate()方法中的代码重新创建表
我们需要对这个类进行单例,保证整个APP中只有一个SQLite Connection对象
代码如下↓
public class DetailDataOpenHelper extends OrmLiteSqliteOpenHelper {
//创建DetailDataOpenHelper实例
private static DetailDataOpenHelper instance;
//数据库版本
private static int DATA_BASE_VERSION = 1;
//数据库名称
private static String DATA_TABLE_NAME = "first.db";
public DetailDataOpenHelper(Context context) {
super(context, DATA_TABLE_NAME, null, DATA_BASE_VERSION);
}
public synchronized static DetailDataOpenHelper getInstance(Context mContext) {
if(instance == null){
instance = new DetailDataOpenHelper(mContext);
}
return instance;
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource) {
try {
//Account.class对应的数据库表
TableUtils.createTable(connectionSource, Account.class);
} catch (SQLException throwable) {
throwable.printStackTrace();
}
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource, int i, int i1) {
try {
/**
* 当DATA_BASE_VERSION 被修改时候
* 会执行此方法
* 删除原有的数据库,创建新的数据库
* 如果Po类中有新的字段,并且不升级数据库Version时,
* 将会报找不到数据库字段的错误
* **/
TableUtils.dropTable(connectionSource, Account.class, true);
TableUtils.createTable(connectionSource, Account.class);
} catch (SQLException throwable) {
throwable.printStackTrace();
}
}
}
4.操作
4.1 Create
/**
* 插入一条数据 或者 集合
* 返回 插入的数量
* **/
int create(T var1) throws SQLException;
/**
* 如果不存在则插入
* **/
T createIfNotExists(T var1) throws SQLException;
/**
* 如果没有则创建
* 如果指定id则更新
* **/
Dao.CreateOrUpdateStatus createOrUpdate(T var1) throws SQLException;
4.2 Select
/**
* 根据Id查询
* @return YourPo
* **/
T queryForId(ID var1) throws SQLException;
/**
* 查找id By yourPo.id
* @param var1 yourPo
* @return yourPo
* 例子
* Account account = new Account();
* account.setId(1);
* instance.getmAccountDao().queryForSameId(account)
* Account{id=1, Account='User1', password='User1'}
* 较为繁琐
* 不如ById来的直接
* **/
T queryForSameId(T var1) throws SQLException;
/**
* 查询全部
* @return List<YourPo>
* **/
List<T> queryForAll() throws SQLException;
/**
* 条件查询根据你的po类来查询
* 例如
* Account ac = new Account();
* ac.setAccount("User1")
* instance.getmAccountDao().queryForMatching(user1)
* [Account{id=1, Account='User1', password='User1'}, Account{id=2, Account='User1', password='User1'}]
* 查询 字段 Account 里有 User1 这个值的数据
* @return List<YourPo>
* **/
List<T> queryForMatching(T var1) throws SQLException;
/**
* 条件查询
* @param var1
* key = 字段名
* value = 条件
* 例子:
* Map<String ,Object> map = new HashMap<>();
* map.put("Account","User1");
* instance.getmAccountDao().queryForFieldValues(map)
* [Account{id=1, Account='User1', password='User1'}, Account{id=2, Account='User1', password='User1'}]
*
* **/
List<T> queryForFieldValues(Map<String, Object> var1) throws SQLException;
4.3 Delete
/**
* 根据实体类来删除
* @param var1
* @return 删除的数量
*
* **/
int delete(T var1) throws SQLException;
/**
* 根据id删除
* @param var1
* @return 删除的数量
*
* **/
int deleteById(ID var1) throws SQLException;
/**
* 根据集合实体类来删除
* @param var1
* @return 删除的数量
*
* **/
int delete(Collection<T> var1) throws SQLException;
/**
* 根据id集合来删除
* @param var1
* @return 删除的数量
*
* **/
int deleteIds(Collection<ID> var1) throws SQLException;
4.4 Update
/**
* 根据实体类来修改(不能修改id)
* @param var1
* @return 修改的成功的数量
*
* **/
int update(T var1) throws SQLException;
/**
* 根据实体类里的id,来修改id
* @param var1
* @return 修改的成功的数量
* 例子
* Account account1 = new Account();
* account1.setId(1);
* instance.getmAccountDao().updateId(account1,22);
* **/
int updateId(T var1, ID var2) throws SQLException;
5.Dao
这里将Dao写成单例,对外公布获取该单例的方法。
每个表都会有一个单独的Dao用于操作,通过getDao方法,获得Dao
public class AccountDao{
//全局单例
private static AccountDao mSearchInstance;
// ORMLite提供的DAO类对象,第一个泛型是要操作的数据表映射成的实体类;第二个泛型是这个实体类中ID的数据类型
private Dao<Account, Integer> mAccountDao;
public Dao<Account, Integer> getmAccountDao() {
return mAccountDao;
}
private AccountDao(Context mContext){
try {
mAccountDao = DetailDataOpenHelper.getInstance(mContext).getDao(Account.class);
} catch (SQLException throwable) {
throwable.printStackTrace();
}
}
public static AccountDao getInstance(Context mContext){
if(mSearchInstance == null){
mSearchInstance = new AccountDao(mContext);
}
return mSearchInstance;
}
/**
*
* 插入一个对象
*
* **/
public void insertAccount(Account account){
try {
int i = mAccountDao.create(account);
System.out.println(i);
} catch (SQLException throwable) {
throwable.printStackTrace();
}
}
//查询全部
public List<Account> findAccountAll() throws SQLException {
return mAccountDao.queryForAll();
}
}
6.调用
public class MainActivity extends AppCompatActivity {
private String LAG = "OrmLite";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AccountDao instance = AccountDao.getInstance(this);
// 插入单个
instance.insertAccount(new Account("User1", "User1"));
instance.insertAccount(new Account("User2", "User2"));
// 查询全部
try {
Log.i(LAG, instance.findAccountAll() + "");
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}}
2021-01-27 13:19:11.200 16927-16927/com.example.ormliteactivity I/OrmLite:
[Account{id=1, Account='User1', password='User1'}, Account{id=2, Account='User2', password='User2'}]