安卓数据存储-使用LitePal操作数据库

简介:开源库-LitePal是一款开源的数据库的开源的Android数据库框架,它采用对象关系映射(OPM)的模式,并将我们平时开发最常用到的一些数据库功能进行了封装,使得不用编写一行SQL语句就可以完成各种建表和增删改查的操作。

1)配置LitePal

目前大多数开源项目都会将版本提交到jcenter上,我们只需要在app/build.gradle文件,在dependencies闭包中添加如下内容

apply plugin: 'com.android.application'

android {

    compileSdkVersion 24

    buildToolsVersion '25.0.0'

    defaultConfig {

        applicationId "com.example.a14468.litepal"

        minSdkVersion 15

        targetSdkVersion 24

        versionCode 1

        versionName "1.0"

    }

    buildTypes {

        release {

            minifyEnabled false

            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

        }

    }

}

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'

//注意:如果添加这条代码出错,那可能是版本问题,直接复制我这串代码上去替换就可以了!

}

接下来需要配置litepal.xml文件

,右击app/src/main 目录->New->Directory,创建一个assets目录,然后在assets目录下再新建一个litepal.xml文件,接着编辑litepal.xml文件中的内容,如下所示

<?xml version="1.0" encoding="UTF-8" ?>

<litepal>

<dbname value="BookStore"></dbname>

    <version value="1"></version>

    <list>

    </list>

</litepal>

代码分析:<dnname>标签用于指定数据库名,<version>标签用于指定数据库版本号,<list>标签用于指定所有映射模型,稍后会用到。注意名字别打错,打错的话程序会崩溃!

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

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

    package="com.example.a14468.litepal">

    <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配置为org.litepal.LitePalApplication,这样才能让LitePal的所有功能都可以正常工作。

至此LitePal配置工作全部完成!

2)创建和升级数据库

先回想一下我们之前创建的数据库是通过一个类继承至SQLiteOpenHelper,然后再OnCreate()方法中编写建表语句来实现,使用LitePal就不需要这么麻烦,我们直接用它提供的方法既可以简单的实现。

首先我们将activity_main里面的代码修改一下 功能:添加四个 Buton按钮(CRUD增删改查),跟DatabaseTest项目里的activity_main一样的。

接着我们补充一点理论知识,LitePal采取的是对象关系映射(ORM)模式,大概意思是我们使用的语言是面向对象的语言,而使用的数据库这是关系型数据库,将面向对象的语言和面向关系的数据库建立一种映射关系,这就是对象关系映射。并且它赋予了我们一个很强大的功能,就是可以用面向对象的思维操作数据库,而不用再和SQL语句打交道了。在使用SQL创建表的时候需要先分析表中应该包含哪些列,然后编写出一条建表语句,但是使用LitePal,我们可以使用面向对象的思维来实现同样的功能了!废话不多说,继续开始编写代码:

定义一个Book类   功能:在Book类中定义 id、author、price、name这几个字段,并生成相应的getter和setter方法。

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;

}

}

代码分析:在这里,Book类就对应了Book表,每一个字段分别对应表中每一列,这就是对象关系映射最直观的体验。

接下来我们还需要将Book类添加到映射模型列表当中,修改litepal.xml中的代码,如下所示

<?xml version="1.0" encoding="UTF-8" ?>

<litepal>

<dbname value="BookStore"></dbname>

    <version value="1"></version>

    <list>

        <mapping class="com.example.a14468.litepal.Book"></mapping>

    </list>

</litepal>

代码分析:这里使用<mapping>标签来声明我们要配置的映射模型类,注意要使用完整的类名。不管有多少的模型类需要映射,都是用同样的方法配置在<list>标签下即可。

 

到这里就已经把所有工作都做完了,现在只要任意一次数据库的操作,BookStore.db数据库应该就会自动创建出来。修改MainActivity的代码    功能:通过点击创建按钮 创建数据库

public class MainActivity extends AppCompatActivity {

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        Button createDatabase = (Button) findViewById(R.id.create_database);

        createDatabase.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                Connector.getDatabase();//创建数据库

            }

        });

    }

}

代码分析:调用Connector.getDatabase()方法就是一次最简单的数据库的操作,点击一下按扭就能对数据库创建情况。

到现在是不是觉得对数据库操作很简单!接下来会更简单!

但是这个代码有一个问题,当升级数据库的时候我们需要把之前的表drop掉,然后重新创建才行。不过LitePal已经提供了这个功能!举个例子,我们想要向Book表中添加一个press(出版社)列,直接修改Book类中的代码,添加一个press字段即可如下所示:

public String press;

........

  public String getPress() {

        return press;

    }

    public void setPress(String press) {

        this.press = press;

    }

}

}

于此同时,我们再添加一个表Category表,那么只需要新建一个Category类就可以了,代码如下所示

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 int getCategoryCode() {

        return categoryCode;

    }

    public void setCategoryCode(int categoryCode) {

        this.categoryCode = categoryCode;

    }

 

    public String getCategoryName() {

        return categoryName;

    }

    public void setCategoryName(String categoryName) {

        this.categoryName = categoryName;

    }

}

该完了想改的东西,只需要记得将版本号加1就行。当然由于这里还添加了一个模型类,因此也需要将他映射到模型列表中。修改litepal.xml中的代码,如下所示

<?xml version="1.0" encoding="UTF-8" ?>

<litepal>

<dbname value="BookStore"></dbname>

    <version value="2"></version>

    <list>

        <mapping class="com.example.a14468.litepal.Book"></mapping>

        <mapping class="com.example.a14468.litepal.Category"></mapping>

    </list>

</litepal>

 

3)使用LitePal添加数据

 我们先回顾一下之前添加数据的方法:首先创建出一个ContentValues对象,然后将所要添加的数据put到这个ContentValues对象当中,最后调用SQLiteDatabase的insert()方法将数据添加到数据库表当中。

我们使用LitePal来添加数据的方法:创建出模型实例,再将所有要存储的数据设置好,最后调用一下save()方法就可以了。

具体步骤:

首先LitePal进行表管理操作的时候不需要模型类有任何继承结构,但是进行CRUD操作是就不行了,必须继承自DataSupport类才行,因此我们需要把继承结构给加上。修改Book类的代码,如下所示:

public class Book extends DataSupport {

.............................()中间省略

}

然后向Book表中南添加数据,修改MainActivity中的代码

public class MainActivity extends AppCompatActivity {

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        Button createDatabase = (Button) findViewById(R.id.create_database);

        createDatabase.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                Connector.getDatabase();

            }

        });

        Button addData = (Button) findViewById(R.id.add_data);

        addData.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View view) {

                Book book = new Book();

                book.setName("Tony Park");

                book.setAuthor("Tony");

                book.setPages(454);

                book.setPrice(38.38);

                book.setPress("Unknow");

                book.save();

            }

        });

代码分析:添加数据按钮的点击事件里面。首先是创建出了一个Book实例,然后调用Book类中的各种set方法对数据进行设置,最后在调用book.save()方法就能完成数据添加操作了。这个save()方法就是从DataSupport类中继承而来。除了save()方法以外,DataSupport类还提供了丰富的CRUD方法,操作如下所示

public class MainActivity extends AppCompatActivity {

 

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        Button createDatabase = (Button) findViewById(R.id.create_database);

        createDatabase.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                Connector.getDatabase();

            }

        });

        Button addData = (Button) findViewById(R.id.add_data);

        addData.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View view) {

                Book book = new Book();

                book.setName("Tony Park");

                book.setAuthor("Tony");

                book.setPages(454);

                book.setPrice(38.38);

                book.setPress("Unknow");

                book.save();

            }

        });

 

        Button updateBata = (Button) findViewById(R.id.update_data);

        updateBata.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View view) {

                //更新数据

                Book book = new Book();

                //使用setPrice()和setPress()方法来设置更新数据

                book.setPrice(14.95);

                book.setPress("XZP");

                //调用updateAll方法执行更新操作,可以指定一个约束项

                book.updateAll("name = ? and author = ?","Tony Park","Tony");

            }

        });

       Button deleteButton = (Button) findViewById(R.id.delete_data);

        deleteButton.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View view) {

                //删除操作

                DataSupport.deleteAll(Book.class,"price < ?","15");

            }

        });

        Button queryButton = (Button) findViewById(R.id.query_data);

        queryButton.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View view) {

                //查询数据操作   findAll()方法返回值是一个Book类型的List集合

                List<Book> books = DataSupport.findAll(Book.class);

                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());

                }

            }

        });

    }

}

另外查询语句也有很多的方法:

 //1、查询Book表中第一条数据
    Book firstBook = DataSupport.findFirst(Book.class);
    //2、查询Book表中最后一条数据
    Book lastBook = DataSupport.findLast(Book.class);
    //3、select()方法用于指定哪几列的数据,对应了SQL当中的select关键字
    List<Book> books1 = DataSupport.select("name","author").find(Book.class);
    //4、Where()方法用于指定查询的约束条件,对应了当中的where关键字。比如只查页数大于400的数据,就可以这样写
    List<Book> books2 = DataSupport.where("pages > ?","400").find(Book.class);
    //5、order()方法用于指定排序哪几列数据,对应了SQL当中的order by关键字。比如将查询结果按照书价从高到低排序,就可以这样写
    List<Book> books3 = DataSupport.order("price desc").find(Book.class);//其中desc表示降序排列,asc表示升序排列,不写默认升序排列
   //6、limit()方法用于指定查询结果的数量,比如只查询前面前3条数据就可以这样写
    List<Book> books4 = DataSupport.limit(3).find(Book.class);
    //7、offset()方法用于指定查询结果的偏移量,比如查询表中第二条、第三条、第四条数据就可以这样写:
    List<Book> books5 = DataSupport.limit(3).offset(1).find(Book.class);//由于limit(3)查询到的是前三条的数据,这里我们再加上offset(1)进行一个位置的偏移,就能实现查询的第二条、第三条、第四条数据的功能了。limit()和offset()方法共同对应了SQL当中的limit关键字
    //8、对这5个方法进行任意的连缀组合,来完成一个比较复杂的查询操作:
    List<Book>  books6 = DataSupport.select("name","author","pages")
            .where("pages > ?","400")
            .order("pages")
            .limit(0)
            .offset(10)
            .find(Book.class);// 这段代码表示,查询Book表中第11~20条满足页数大于400这个条件的name、author和pages这3列数据,并将查询结果按照页数升降排序
    //9、使用原生的SQL来进行查询:
    Cursor c =DataSupport.findBySQL("select * from Book where pages > ? and price < ?","400","200");
//调用DataSupport.findBySQL()方法来进行原生查询,其中第一个参数用于指定SQL语句,后面的参数用于指定占位符的值。注意findById()方法返回的是一个Cursor对象,接下来你还需要通过之前所学老方式将数据一一取出才行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值