第一行代码 第六章 数据储存方案 - LitePal数据库存储

LitePal – 一款开源的Android数据库框架。
它采用对象关系映射的模式(ORM),将开发中常用的数据库功能进行封装,使得不用编写SQL语句就可以完成各种建表和增删改查的操作。

在项目中使用开源库:
大多数的开源项目都会将版本提交的jcenter上,我们只需要在app/build.gradle文件中声明该开源库的引用就可以了。

LitePal项目地址:https://github.com/LitePalFramework/LitePal

一、配置LitePal

1、app/build.gradle文件中声明该开源库

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.0.1'
    testCompile 'junit:junit:4.12'
    compile 'org.litepal.android:core:1.6.0'
}

只需添加这一行:compile ‘org.litepal.android:core:1.6.0’
其中org.litepal.android:core 这个是固定部分;1.6.0是版本号的意思。

2、配置litepal.xml文件
在app\src\main\目录下,新建assets目录,然后在assets目录中新建litepal.xml文件。
litepal.xml文件内容如下:


<litepal>
    <dbname value="BookStore" />
    <version value="2" />
    <list>
        <mapping class="com.sky.litepaltest.Book" />
        <mapping class="com.sky.litepaltest.Watch" />
    list>

litepal>

其中:
标签用于指定数据库名称;
标签用于指定数据库版本号;
标签用于指定所有的映射模型;
标签用于声明需要配置的映射模型类,这里一定要用完整的类名。

3、配置AndroidManifest.xml


<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.sky.litepaltest">

    <application
        android:name="org.litepal.LitePalApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            intent-filter>
        activity>
    application>

manifest>

将application配置为 android:name=”org.litepal.LitePalApplication”,这样才能让LitePal的所有功能正常工作。


二、创建和升级数据库
1、新建一个类,定义字段,并生成相应的getter和setter方法。
这里定义的类即为数据库中的表。所以想要新增一个表,只需要新增一个类并添加到映射模型列表中就行了。
定义的字段即为表中的每一列。所以想要新增一列,只需要新增一个字段并生成相应的getter和setter方法就行了。

生成getter和setter方法的快捷键:先在类中定义好字段,然后按下Alt+Insert

2、将类添加到映射模型列表中,即litepal.xml文件中的标签

3、通过调用 Connector.getDatabase()方法就能够创建数据库了。

4、通过修改b标签的版本号,即可完成数据库的升级操作。


三、数据库的操作 – CRUD操作

想要进行CRUD操作,就必须让模型类继承DataSupport类才行,如下

    public class Book extends DataSupport{
        .......
    }

1、添加数据
创建模型类的实例,然后调用实例的各种setter()方法去设置数据,最后调用实例的save()方法即可

    private void addData() {
        Book book = new Book();
        book.setName("Android");
        book.setAuthor("sky");
        book.setPages(201);
        book.setPrice(55.8);
        book.save();
    }

2、更新数据
更新的方式比较多,最简单的一种更新方式就是对已存储的对象重新设值,然后再调用save()方法即可。

    private void updateData1() {
        Book book = new Book();
        book.setName("Android");
        book.setAuthor("sky");
        book.setPages(201);
        book.setPrice(55.8);
        book.save();
        book.setPrice(25.8);
        book.save();
    }

方式二:使用updateAll()方法

    private void updateData2() {
        Book book = new Book();
        book.setPrice(25.8);
        book.updateAll("author=?", "demo");
    }

updateData2()方法就所有author是demo的Price更新为25.8了。
updateAll()方法如果不指定条件语句的话,就表示更新所有数据。

    private void updateData3() {
        Book book = new Book();
        book.setToDefault("price");
        book.updateAll();
    }

上述代码表示把所有的价格都更新为默认值0。
setToDefault()方法是把数据更新成默认值。

3、删除数据
主要有两种删除数据的方式:
第一种,是直接调用已存储对象的delete()方法。

    private void deleteData1() {
        Book book = new Book();
        book.setPrice(25.8);
        book.save();
        book.delete();
    }

另一种,是使用deleteAll()方法。

    private void deleteData2() {
        DataSupport.deleteAll(Book.class, "price < ?", "90");
    }

上述代码表示把Book表中价格低于90的数据都删除。
updateAll()方法如果不指定条件语句的话,就表示删除表中的所有数据。

4、查询数据
查询数据有很多接口

查询表中所有数据 – findAll()方法。
List books = DataSupport.findAll(Book.class);
该方法返回一个类类型的List集合,这样就可遍历查询的数据了

查询表中第一条数据 – findFirst()方法。
Book book = DataSupport.findFirst(Book.class);

查询表中最后一条数据 – findLast()方法。
Book book = DataSupport.findLast(Book.class);

还可以通过连缀查询来定制更多的查询功能

select()方法,用于指定查询那几列的数据
如只查表中name和author这两列的数据:
List books = DataSupport.select(“name”,”author”).find(Book.class);

where()方法,用于指定查询的约束条件
如查询表中价格大于10的数据:
List books = DataSupport.where(“price>?”,”10”).find(Book.class);

order()方法,用于指定结果的排序方式
如查询结果按照价格高到低排序:
List books = DataSupport.order(“pricre desc”).find(Book.class);
desc表示降序排序;asc或者不写表示升序排序

limit()方法,用于指定查询结果的数量
如查表中的前3条数据:
List books = DataSupport.limit(3).find(Book.class);

offset()方法,用于指定查询结果的偏移量
如查表中的第2条、第3条、第4条数据:
List books = DataSupport.limit(3).offset(1).find(Book.class);

也还可以将上述的5个方法都组合起来查询。
List books = DataSupport.select(“name”,”author”)
.where(“price>?”,”10”)
.order(“pricre desc”)
.limit(3)
.offset(1)
.find(Book.class);

如果上述API都满足不了的话,还可以用原生的SQL来查询:
Cursor cursor = DateSupport.findBySQL(“select * from Book where pages > ? and price < ?”, “200”, “10”);


实例:
app\build.gradle文件

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.0.1'
    testCompile 'junit:junit:4.12'
    compile 'org.litepal.android:core:1.6.0'
}

app\src\main\assets\litepal.xml文件


<litepal>
    <dbname value="BookStore">dbname>
    <version value="1">version>
    <list>
        <mapping class="com.sky.litepaldemo.Book">mapping>
    list>
litepal>

app\src\main\AndroidManifest.xml文件


<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.sky.litepaldemo">

    <application
        android:name="org.litepal.LitePalApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            intent-filter>
        activity>
    application>

manifest>

模型类Book.java

public class Book extends DataSupport {
    private int id;
    private String author;
    private double price;
    private int pages;
    private String bookName;

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

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

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

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

    public void setBookName(String bookName) {
        this.bookName = bookName;
    }

    public int getPages() {
        return pages;
    }

    public String getBookName() {
        return bookName;
    }

    public double getPrice() {
        return price;
    }

    public int getId() {
        return id;
    }

    public String getAuthor() {
        return author;
    }
}

MainActivity.java

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button btnCreateDatabase = (Button)findViewById(R.id.btnCreateDatabase);
        Button btnAddData = (Button)findViewById(R.id.btnAddData);
        Button btnUpdateData = (Button)findViewById(R.id.btnUpdateData);
        Button btnDeleteData = (Button)findViewById(R.id.btnDeleteData);
        Button btnQueryData = (Button)findViewById(R.id.btnQueryData);

        btnQueryData.setOnClickListener(this);
        btnDeleteData.setOnClickListener(this);
        btnUpdateData.setOnClickListener(this);
        btnAddData.setOnClickListener(this);
        btnCreateDatabase.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.btnCreateDatabase:
                Connector.getDatabase();
                Toast.makeText(this, "Create Database", Toast.LENGTH_SHORT).show();
                break;
            case R.id.btnAddData:
                addData();
                Toast.makeText(this, "add data", Toast.LENGTH_SHORT).show();
                break;
            case R.id.btnUpdateData:
                updateData();
                Toast.makeText(this, "update data", Toast.LENGTH_SHORT).show();
                break;
            case R.id.btnDeleteData:
                deleteData();
                Toast.makeText(this, "delete data", Toast.LENGTH_SHORT).show();
                break;
            case R.id.btnQueryData:
                queryData();
                Toast.makeText(this, "query data", Toast.LENGTH_SHORT).show();
                break;
            default:
                break;
        }
    }

    private void queryData() {
        List bookList = DataSupport.findAll(Book.class);
        for (Book book:bookList){
            Log.d("MainActivity", "book name is:"+book.getBookName());
            Log.d("MainActivity", "book author is:"+book.getAuthor());
            Log.d("MainActivity", "book price is:"+book.getPrice());
            Log.d("MainActivity", "book pages is:"+book.getPages());
            Log.d("MainActivity", "------------------------------------------");
        }
    }

    private void deleteData() {
        DataSupport.deleteAll(Book.class, "price < ?", "30");
    }

    private void updateData() {
        Book books = new Book();
        books.setPrice(42.0);
        books.updateAll("author=?", "sky");
    }

    private void addData() {
        Book books = new Book();
        books.setBookName("adb");
        books.setAuthor("sky");
        books.setPages(600);
        books.setPrice(23.8);
        books.save();
        Book book2 = new Book();
        book2.setBookName("adb");
        book2.setAuthor("demo");
        book2.setPages(800);
        book2.setPrice(22.8);
        book2.save();
    }
}

你可能感兴趣的:(第一行代码,Android第二版,笔记)