第6章 数据存储之使用LitePal操作数据库

一.配置LitaPal
1.在Module的build.gradle配置LitePal


dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:24.2.1'
    compile 'org.litepal.android:core:1.3.2'
}

2.配置litepal.xml文件
右击app/src/main/目录创建assets。在此目录下新建litepal.xml文件,文件内容如下

<?xml version="1.0" encoding="utf-8"?>
<litepal>
    <dbname value="BookStore"></dbname>
    <version value="1"></version>
    <list></list>
</litepal>

3.在清单文件中配置LitePalApplication

 <application
        android:name="org.litepal.LitePalApplication"
 </application>

到此配置算完成了。
二.创建和升级数据库
1.创建数据库
新建一个数据库对应的类

package com.example.android.databasetest;

/**
 * Created by Howy on 2017/3/23.
 */

public class Book {
    private int id;

    private String author;

    private double price;

    private int pages;

    private String name;

    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 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;
    }

    public String getName() {
        return name;
    }

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

这个JavaBean类是用来映射对应的数据库表,就是对象关系映射ORM,LitePal框架就是采用这种方式创建数据库表的。
在MainActivity中添加一个按钮创建数据库

   Button createDatabase = (Button) findViewById(R.id.create_database);
        createDatabase.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//  import org.litepal.tablemanager.Connector;如果配置好了,这个包会自动导入。
                Connector.getDatabase();
            }
        });

2.升级数据库
给Book类中添加一个属性,同时往数据库里添加一张表Category,
新建Category类

package com.example.android.databasetest;

/**
 * Created by Howy on 2017/3/23.
 */

public class Category {
    private int id;

    private String categoryName;

    private int categoryCode;

    public int getId() {
        return id;
    }

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

    public String getCategoryName() {
        return categoryName;
    }

    public void setCategoryName(String categoryName) {
        this.categoryName = categoryName;
    }

    public int getCategoryCode() {
        return categoryCode;
    }

    public void setCategoryCode(int categoryCode) {
        this.categoryCode = categoryCode;
    }
}

在litepal.xml文件中添加Category类与数据库的映射关系,同时将数据版本改为2

<?xml version="1.0" encoding="utf-8"?>
<litepal>
    <dbname value="BookStore"></dbname>
    <version value="2"></version>
    <list>
        <mapping class="com.example.android.databasetest.Book"></mapping>
        <mapping class="com.example.android.databasetest.Category"></mapping>
    </list>
</litepal>

三.添加数据
首先修改Book类,当它继承LitePal包中的DataSupport

import org.litepal.crud.DataSupport;

public class Book extends DataSupport {
}

在MainActivity中写添加数据的代码

        Button addData = (Button) findViewById(R.id.add_data);
        addData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Book book = new Book();
                book.setName("The Da Vinci Code");
                book.setAuthor("Dan Brown");
                book.setPages(454);
                book.setPrice(16.96);
                book.setPress("Unknow");
//                new出一个对象,然后调用对象继承自DataSupport的save方法,将数据保存到数据库表中
                book.save();
            }
        });

四.更新数据
最简单的更新方法就是对已存储的对象重新赋值

             Book book = new Book();
                book.setName("The Lost Symbol");
                book.setAuthor("Dan Brown");
                book.setPages(510);
                book.setPrice(19.95);
                book.setPress("Unknow");
                book.save();
                book.setPrice(10.00);
//                如果最后价格为10,就说明这是有效的更新
                book.save();

对象是否已存储,根据book.isSave()判断,
第一种,如果对象调用过save(),就表示已存储,返回true
第二种,对象通过调用LitePal的API查询数据库中的对象,存在返回true

                第一种
//                Book book = new Book();
//                book.setName("The Lost Symbol");
//                book.setAuthor("Dan Brown");
//                book.setPages(510);
//                book.setPrice(19.95);
//                book.setPress("Unknow");
//                book.save();
//                book.setPrice(10.00);
//                Log.d(TAG, "book.isSave() = [" + book.isSaved() + "]");
//                // 如果最后价格为10,就说明这是有效的更新,book.isSave() = true;
//                book.save();
//
//                第二种
                Book book = new Book();
                book.setPrice(14.95);
                book.setPress("Anchor");
                book.updateAll("name = ? and author = ?", "The Lost Symbol", "Dan Brown");

设置默认值并不是使用book.setXXX()方法,
而是book.setToDefault(“属性值”);
五.删除数据
第一种删除方法book.delete();
第二种删除方法 DataSupport.deleteAll(Book.class, String… conditions);

 Button deleteButton = (Button) findViewById(R.id.delete_data);
        deleteButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Book book = new Book();
                book.setName("The Da Vinci Code");
                book.setAuthor("Dan Brown");
                book.setPages(454);
                book.setPrice(16.96);
                book.setPress("Unknow");
                book.save();
//                上面这一本存进去了,随后别删除了
                book.delete();
//                下面这本存进去了,没有被删除
                book.save();
//              使用指定删除条件来删除数据 DataSupport.deleteAll(Class<?> modelClass,  String... conditions);
                DataSupport.deleteAll(Book.class, "price < ?", "15");
            }
        });

六.查询数据
使用DataSupport.findAll(Book.class);方法

        Button queryButton = (Button) findViewById(R.id.query_data);
        queryButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//                将查询的数据存了List集合中,并自动完成其中的赋值操作
                List<Book> books = DataSupport.findAll(Book.class);
//                 循环取出每个book对象具体数据(即数据表的每一列的具体数据)
                for (Book book: books) {
                    Log.d("MainActivity", "book name is " + book.getName());
                    Log.d("MainActivity", "book author is " + book.getAuthor());
                    Log.d("MainActivity", "book pages is " + book.getPages());
                    Log.d("MainActivity", "book price is " + book.getPrice());
                    Log.d("MainActivity", "book press is " + book.getPress());
                }
            }
        });

另外的一些LitePal有用的API

//                    查询book表第一行数据
                    Book firstBook = DataSupport.findFirst(Book.class);
//                    查询book表中所有的name和auther,相当于拼装成一张只有name和auther的表
                    List<Book> books = DataSupport.select("name", "auther").find(Book.class));
//                      查询book表中  pages > 400的数据
                    List<Book> books = DataSupport.where("pages > ?", "400").find(Book.class));
                    List<Book> books = DataSupport.order("price desc").find(Book.class));
//                    限定查询结果
                    List<Book> books = DataSupport.limit(5).find(Book.class));
//                  拼装原生的SQL语句查询,返回Cursor,还得按照之前那种麻烦的方法取出来
                  Cursor c =  DataSupport.findBySQL();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值