一、ORM概述
- 对象关系映射(Object Relational Mapping,简称ORM)是通过描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化到关系数据库中。
本质上就是将数据从一种形式转换到另外一种形式
。 - 常用ORM框架:
ORMLite
、SugarORM、GreenDAO、Active Android、Realm。
二、类与表的对应关系
- 首先我们有这样一个person表,表有两个字段,两条记录。
- 表结构我们可以用一个类来表示,而类的成员变量则和表的字段对应。
- 而表内的数据则用根据表结构创建的类
对象
来表示。
总结:
- 类与表对应:成员变量与列对应
- 对象与行:将一个对象的成员变量存为一行
三、案例演示
1、创建安卓应用
2、导入ORMLite的依赖
- 在build.gradle中加入
implementation 'com.j256.ormlite:ormlite-android:5.1'
,然后点击【Sync Now】
3、创建与person表对应的实体类 - Person
(1)创建Person类
(2)定义与表字段对应的成员变量
(3)定义构造方法和toString()方法
(4)将Person类与person表映射
(5)将成员变量与表的列对应
columnNam
的值为表字段名,默认值为成员变量名,可以不写。generatedId
的值为 true/false 表示是否是自增值,默认值为 false。
(6)源代码
package net.zs.testormlite;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;
@DatabaseTable(tableName = "person")
public class Person {
@DatabaseField(columnName = "id", generatedId = true)
public Integer id;
@DatabaseField(columnName = "name")
public String name;
@DatabaseField(columnName = "age")
public Integer age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Person() {
}
public Person(Integer id, String name, Integer age) {
this.id = id;
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
4、数据库操作管理工具类 - MyHelper
(1)创建MyHelper类
(2)继承OrmLiteSqliteOpenHelper
- 重写两个方法onCreate()和onUpgrade()
- 定义一个构造方法
(3)定义创建数据库时调用的方法
(4)源代码
package net.zs.testormlite;
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;
public class MyHelper extends OrmLiteSqliteOpenHelper {
public MyHelper(Context context) {
super(context, "Person.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) {
try {
TableUtils.createTable(connectionSource, Person.class);
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) {
}
}
5、添加背景图片
6、主布局资源文件 - activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/background"
tools:context=".MainActivity">
<TextView
android:id="@+id/tvName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="68dp"
android:layout_marginTop="120dp"
android:text="姓名:"
android:textSize="25sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/edtName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="72dp"
android:ems="10"
android:hint="name"
android:inputType="textPersonName"
app:layout_constraintBaseline_toBaselineOf="@+id/tvName"
app:layout_constraintStart_toStartOf="@+id/tvName" />
<TextView
android:id="@+id/tvAge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="68dp"
android:layout_marginTop="220dp"
android:text="年龄:"
android:textSize="25sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/edtAge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="72dp"
android:ems="10"
android:hint="age"
android:inputType="textPersonName"
app:layout_constraintBaseline_toBaselineOf="@+id/tvAge"
app:layout_constraintStart_toStartOf="@+id/tvAge" />
<Button
android:id="@+id/btnInsert"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="7dp"
android:text="插入"
app:layout_constraintBaseline_toBaselineOf="@+id/btnQuery"
app:layout_constraintEnd_toStartOf="@+id/btnQuery"
app:layout_constraintStart_toStartOf="parent" />
<Button
android:id="@+id/btnQuery"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="52dp"
android:layout_marginEnd="9dp"
android:text="查询"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/btnInsert"
app:layout_constraintTop_toBottomOf="@+id/edtAge" />
</androidx.constraintlayout.widget.ConstraintLayout>
7、主界面类 - MainActivity
(1)声明变量
(2)通过资源标识符获取控件实例
(3)实例化MyHelper类
(4)注册插入按钮单击事件监听器
(5)注册查询按钮单击事件监听器
(6)主界面类源代码
package net.zs.testormlite;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.j256.ormlite.dao.Dao;
import java.sql.SQLException;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private EditText name;
private EditText age;
private Button insert;
private Button query;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
name = findViewById(R.id.edtName);
age = findViewById(R.id.edtAge);
insert = findViewById(R.id.btnInsert);
query = findViewById(R.id.btnQuery);
MyHelper myHelper = new MyHelper(MainActivity.this);
insert.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
Dao<Person, Integer> dao = myHelper.getDao(Person.class);
Person person = new Person();
person.setName(name.getText().toString());
dao.create(person);
Toast.makeText(MainActivity.this, "插入成功!", Toast.LENGTH_SHORT).show();
} catch (SQLException e) {
e.printStackTrace();
}
}
});
query.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
Dao<Person, Integer> dao = myHelper.getDao(Person.class);
List<Person> persons = dao.queryForAll();
Toast.makeText(MainActivity.this, "查询结果" + persons, Toast.LENGTH_SHORT).show();
} catch (SQLException e) {
e.printStackTrace();
}
}
});
}
}
(7)运行程序,查看效果