欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android开发之LitePal数据库操作

程序员文章站 2024-03-17 09:40:22
...

在我之前的一篇博客里面,我们着重讨论了使用SQLiteOpenHelper类来对数据库进行相关的增删改查操作。但是,我感觉到学习起来明显吃力。不仅还要自己重写各种方法,而且参数那些实在是让人头大。现在,我们来讨论一种比较人性化的数据库操作方式:LitePal。

LitePal是一款开源的数据库框架,现在已经被托管到GitHub上,它采用ORM的方式,并且封装了很多数据库操作功能,因此我们可以不用写SQL语句来实现对数据库的很多操作。

使用LitePal有一点稍微麻烦一点,就是使用之前需要配置一下Gradle,但是这绝对是不吃亏的,因为配置好会非常简单。

1.配置:

在Project文件结构下,打开app下的bulid.gradle文件,在dependencies{ }中添加一行implemention语句用于构建LitePal。

implementation 'org.litepal.android:core:1.5.1'
我到GitHub上查到目前最新的版本是1.5.1。

现在已经将LitePal引入到我们的包中。接下来我们在包里面构建一个路径来保存我们使用LitePal构建的数据库的相关属性。

在src包中的main目录下构建一个assets目录(右键main/New/Directory),在assets路径中建立一个文件(右键assets/New/File),名字为litepal.xml(注意需要拓展名),使用xml文件构建数据库属性。在该文件下写入如下代码:

<?xml version="1.0" encoding="utf-8"?>
<litepal>                                    //表示为litepal类型
    <dbname value="Bookstore" ></dbname>     //数据库名字为BookStore

    <version value="1" ></version>           //数据库版本是1

    <list>                                  //预留表的映射模型
        
    </list>
</litepal>

最后我们到AndroidManifest文件中配置一下:在<application>标签里面添加

 android:name="org.litepal.LitePalApplication"
这一句和我们数据库的正常运行密不可分。

到这里配置暂时结束。

2.操作:

(1)建表

新建一个java类表示一张表,在java类中设置各种参数,代码如下:

public class Book extends DataSupport   //datasupport中封装了各种操作方法,一定要继承它
{  
    private int id;                     //设置各种属性
    private String author;
    private String name;
    private double price;
    private int pages;

    public int getId() {                //属性初始化函数
        return id;
    }

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

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getName() {
        return name;
    }

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

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public int getPages() {
        return pages;
    }

    public void setPages(int pages) {
        this.pages = pages;
    }
}

ps:简直太优美了这种写法,而且这种写法和我们的自然逻辑思维很贴合。快速写这些函数的方法:windows下alt+insert,mac下command+N,选择setter+getter。

创建完成表后,在我们的litepal.xml中的list标签中添加关系映射:

<mapping class="com.example.androidtest.Book"></mapping>

总之,你需要建立多少张表,就需要写多少个类,然后再list标签里面添加相关的映射语句就ok。这里的映射语句是 包名.表名。注意,包名一定要完整,即从com打头开始写起。

现在,我们可以MainActivity中开始使用了。

注意:我使用的布局沿用之前的布局:https://blog.csdn.net/qq_38554160/article/details/89010214

下面是建表的关键代码

        Button button1 = findViewById(R.id.button1);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Connector.getDatabase();
            }
        });

在点击事件中仅仅需要一句代码就完成了建表操作。简直不要太舒服!

(2)增:

下面给出关键代码:

Button button2 = findViewById(R.id.button2);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Book book= new Book();
                book.setId(1);
                book.setAuthor("余华");
                book.setName("活着");
                book.setPages(230);
                book.setPrice(33.4);
                book.save();
            }
        });

 

建立一个对象,然后使劲往里面添加数据就ok!最后save保存一下就大功告成!我的天,这才是人看的代码嘛。

如果要添加多行数据,重新new一个新的Book对象,然后添加方法和上面一样。

(3)删

删除方式有两种:一种是无条件删除:也就是,当初是哪个对象添加的数据,即对象名.save(),如果要删除的话,直接对象名.detete()方法就ok!

                           第二种是有条件删除:也就是通过给定条件筛选来删除。

代码如下:

Button button3 =findViewById(R.id.button3);
        button3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DataSupport.deleteAll(Book.class,"price<? and pages<?","35","300");
            }
        });

 

 

是不是很简洁?!deleteAll()是条件筛选删除。多个删除条件使用and关键字连接。?我们之前见过了,表示占位符。后面给出具体值。

(4)改

其实也很容易。需要改动什么属性,直接再set一遍,传入新的值,再save一下,就ok!

但是这种方式不灵活,下面给出一种更加灵活的方法。

我们可以先把新的值写好,然后通过updateAll()方法去筛选,再去做替换。其实在其中进行了部分查询操作。代码如下

Button button4 = findViewById(R.id.button4);
        button4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Book book = new Book();
                book.setPrice(20);
                book.updateAll("name= ? and author= ?","活着","余华");
            }
        });

如果我们需要调整价格,则先set一下新的价格,然后通过条件定位到需要更改的那一行,使用updateAll()直接替换原来的价格就好了。

(5)查

因为查询出来的值有多个,需要通过一个集合来保存。使用集合的原因是里面子元素的类型可以指定类型。使用findAll()方法查询后,其返回值为对象类型使用List集合的Book类型保存。然后for循环遍历使用get方法获得值即可。下面给出代码:

button5.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                List<Book> bookList = DataSupport.findAll(Book.class);
                for(Book book:bookList){
                    System.out.println(book.getId());
                    System.out.println(book.getName());
                    System.out.println(book.getAuthor());
                    System.out.println(book.getPrice());
                    System.out.println(book.getPages());
                }
            }
        });

 

在Logcat中可以找到打印出来的值。

 

注意:我们这里是查询所有的结果。我们还可以指定条件查询。在findAll继续传入限制条件即可条件查询,方法等同于updateAll(),这里不再赘述。其实,还有很多其他高级的查询API,这里不再介绍,本篇博客仅仅作为入门阅读。

如果这些API不能满足你的方法,那么LitePal同样支持SQL语句进行操作。

总结:如果说SQLiteOpenHelper是新石器时代,那么LitePal则是现代社会!真的太舒服了有木有!!!

 

 

相关标签: Android