使用LitePal操作数据库

目录结构

  • 配置LitePal
  • 创建和升级数据库
  • 数据库的添加、查询、更新、删除操作

配置LitePal

首先编辑app/build.gradle文件,在dependencies闭包中添加如下内容:

 implementation 'org.litepal.android:core:1.5.0'

配置litepal.xml文件:
右击app/src/main目录—>New—>Directory,创建一个assets目录,然后assets目录下再新建一个litepal.xml文件,litepal.xml内容如下:


<litepal>
    <dbname value="School">dbname>

    <version value="1">version>

    <list>list>
litepal>

其中

  • dbname标签用于指定数据库名
  • version标签用于指定数据库版本号
  • list标签用于指定所有的映射模型

最后还要配置一下LitePalApplication,修改AndroidManifest.xml中的代码,如下所示:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.lenovo.litepal">

    <application
        android:allowBackup="true"
        android:name="org.litepal.LitePalApplication"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        application>
manifest>

只需要将application标签中的name设置为org.litepal.LitePalApplication就可以了。

创建和升级数据库

Litepal工作模式
Litepal采用的是对象关系映射(ORM)的模式,简单来说,就是将面向对象的语言和面向关系的语言之间建立一种映射关系,建立了这种关系,我们就可以用面向对象的思维来操作数据库。

建表并创建数据库
因为使用了LitePal,就可以用面向对象的思维来创建一个表,定义一个Person类,代码如下所示:

public class Person {
    private int id;
    private String name;
    private int age;
    private String sex;

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getSex() {
        return sex;
    }

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

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

    public void setAge(int age) {
        this.age = age;
    }

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

这是一个典型的Java bean,在Person类中定义了id、name、age、sex这几个字段,并生成了getter和setter方法。Person类会对应数据库的Person表,而类中每一个字段分别对应了表中的每一个列,这就是对象关系映射。

将Person类添加到映射列表中,修改litepal.xml中的代码,如下所示:


<litepal>
    <dbname value="Store">dbname>

    <version value="1">version>

    <list>
        <mapping class="com.example.lenovo.mydatabases.Person">mapping>
    list>
litepal>

mapping标签来声明我们要配置的映射模型类,注意一定要使用完整的类名,此处的com.example.lenovo.mydatabases是Person类所在的包。不管有多少模型需要映射,都使用同样的方式配置在list标签下就可以了。

所有准备工作都做完了,现在只要任意进行一次数据库的操作,School.db数据库就会自动创建出来,修改MainActivity中的代码:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button createDatabase = findViewById(R.id.btn_create_database);
        createDatabase.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Connector.getDatabase();
            }
        });
    }
}

以上代码,就是点击一个按钮,并执行 Connector.getDatabase()操作,Connector.getDatabase()是一次最简单的数据库操作,现在数据库就创建好了,我们使用命令提示符来查询一下。

使用adb命令前应先配置环境变量,adb命令在SDK目录下platform-tools中,如果不想配置,就在这个目录下打开命令提示符。

  • 打开cmd,输入adb shell
  • cd data/data/包名/databases
  • ls查看文件
    注意这个包名
    在这里插入图片描述

如上图所示,包名这里填com.example.lenovo.mydatabases,你电脑这个位置显示什么,包名的位置就填你电脑这个位置显示的包的结构。

执行效果图:
使用LitePal操作数据库_第1张图片
如上图所示,数据库就创建好了,创建了一个为School.db的数据库文件,现在我们进入数据库,并查看数据库中的表。以下给出了常用的命令:

  • sqlite3 数据库名 ——— 进入数据库
  • .table ——— 查看数据库中的表
  • .schema ——— 查看数据库中的表的类型
  • select * from 表名; ——— 查看表中的数据,注意末尾的分号不能少

效果图如下:

使用LitePal操作数据库_第2张图片
首先我们使用sqlite3命令进入了School.db数据库,在使用.table查看这个数据库下的表,此处便可以看到Person表,这是我们创建好的。

升级数据库并向数据库添加表
现在我们来向这个数据库在加一张为Student的表,新建一个Student类,代码如下所示:

public class Student {
    private int id;
    private String name;
    private String sex;

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public String getSex() {
        return sex;
    }

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

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

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

然后将Student类添加到映射列表中,修改litepal.xml文件如下:


<litepal>
    <dbname value="School">dbname>

    <version value="2">version>

    <list>
        <mapping class="com.example.lenovo.mydatabases.Person">mapping>
        <mapping class="com.example.lenovo.mydatabases.Student">mapping>
    list>
litepal>

注意将此处version标签的值改成2,因为对数据库添加了一张新的表,也就是升级了。

现在运行程序,点击按钮,执行Connector.getDatabase()方法,就对数据库进行了一次简单的操作,只有这样,这个表才能添加进去了,现在我们用命令提示符查询一下,如下所示:
在这里插入图片描述
这个时候Student表就被添加到数据库中去了。

数据库的添加、查询、更新、删除操作

我们使用select * from Person;查看一下Person表中的数据,会发现并没有显示,这是因为Person表中还没有数据,所以用select * from Person;没有显示数据。
下面我们来添加一些数据。

添加数据
修改Person类的代码如下:

public class Person extends DataSupport {
   ... ...
}

这里的Person类还是上面用到的那个Person类,只是让他继承了DataSupport 。

修改MainActivity中的代码如下:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button add_Data= findViewById(R.id.btn_add_data);
        add_Data.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Person person = new Person();
                person.setName("moon");
                person.setAge(20);
                person.setSex("man");
                person.save();
            }
        });
    }
}

以上代码的功能就是点击按钮,然后向School数据库的Person表中添加数据,现在运行程序,点击按钮,然后进入命令提示符查询,结果如下所示:
在这里插入图片描述
此时添加的数据就显示出来了,这里默认你进入了School数据库并查看Person表中的数据,上面有代码,我就不重复说了。

更新数据
为了更好的演示效果,这里我事先添加了几条数据,如下所示:
在这里插入图片描述
以上有4条数据,我现在要改变第1、2条数据的值,修改MainActivity的代码如下所示:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button Update= findViewById(R.id.btn_update);
        Update.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Person person = new Person();
                person.setName("Peng");
                person.updateAll("age = ?", "20");
            }
        });
    }
}

现在运行程序,点击按钮,然后用命令提示符查询表中数据,如下所示:
使用LitePal操作数据库_第3张图片
此时可以发现第1、2条数据中的name被改成了Peng,之前是moon。person.updateAll(“age = ?”, “20”);这行代码的意思是只将age等于20的数据修改,updateAll()里面的两个参数是约束条件,也可以没有,没有约束条件,就更改全部数据。

现在的你,肯定对数据的添加和更新有所了解了,那么下面的数据查询和数据删除以及设置数据默认值我就直接给出代码了,不在重复的说一些没用的话了,我会在代码中写好注释的。

数据的删除

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button delData = findViewById(R.id.btn_del);
       delData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //直接调用方法来删除
                //此处的三个参数分别是类名(表),约束条件,约束条件的值
                // 作用:直接删除name等于Peng的所有数据
                DataSupport.deleteAll(Person.class, "name = ?", "Peng");
                
            }
        });
    }
}

数据的查询

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button queryData= findViewById(R.id.btn_query);
        queryData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 调用DataSupport.findAll(Person.class)得到一个Person类的列表
                // 每个列表的值对应一条数据
                List<Person> personList = DataSupport.findAll(Person.class);

                //使用循环并利用日志打印所有值
                for (Person person : personList) {
                    Log.d("Data", person.getName());
                    Log.d("Data", person.getSex());
                    Log.d("Data", person.getAge() + "");
                }

            }
        });
    }
}

设置数据的默认值,设置默认值不能直接设置,要调用方法设置

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button setDefault= findViewById(R.id.btn_default);
        setDefault.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 为name和sex列设置为默认值
                Person person = new Person();
                person.setToDefault("name");
                person.setToDefault("sex");
                person.updateAll();
              
            }
        });
    }
}

你可能感兴趣的:(Android开发)