《第一行代码》 6.5 使用LitePal操作数据库

之前有些链接打不开,是因为贴链接的时候,忘记把默认的那个http://删掉了。现在更新了可以正常打开了

6.5.1 简介  

    据说学了这个之后就不想碰SQLite了~

    LitePal是个开源库,采用了对象关系映射(ORM)的模式,并将我们平时开发最常用的一些数据库功能进行封装,效果:不用编写一行SQL语句就可以完成各种建表和删改查的操作。


6.5.2 配置LitePal

    第一步:下载litepal的jar包。(下载地址点击打开链接http://https//github.com/LitePalFramework/LitePal#latest-downloads

    第二步:将其复制到libs目录下,然后右键add as a library。参见了该条博客点击打开链接https//blog.csdn.net/guolin_blog/article/details/38556989),确认添加之后,进入第三步。

    第三步:在app/build.gradle 文件中声明该开源库的引用。

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

    第四步:右键app/src/main目录——New——Directory,命名为assets。

    第五步:右键assets——File,命名为litepal.xml。并编辑其内容为

<litepal>
    <dbname value="BookStore"></dbname>
    <version value="1"></version>
    <list>
    </list>
</litepal>

         <dbname>标签:指定数据库名

         <version>标签:数据库版本号

         <list>标签:指定所有的映射类型

    第六步:配置LitePalApplication,修改AndroidMainFest.xml中的代码

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

    【!】注意:如果org.litepal.LitePalApplication变红色,说明litepal的jar没有正确地导入、配置,应返回第一步重新操作。

如此便全部配置结束啦!


6.5.3 创建和升级数据库

1. 对象关系映射(ORM)模式:使用面向对象的编程语言,而使用关系型数据库,将面向对象的语言和面向关系的数据库之间建立一种映射关系。

    好处:用面向对象的思维来操作数据库,而不用和SQL语言打交道。

2. 范例1:创建数据库BookStore.db,含有一个表:book

(1)layout_main.xml   ,和上一节的布局一样

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Button
        android:id="@+id/create_database"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="create database"/>
    <Button
        android:id="@+id/add_data"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Add Data"/>
    <Button
        android:id="@+id/update_data"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Update Data"/>
    <Button
        android:id="@+id/delete_data"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Delete Data"/>
    <Button
        android:id="@+id/query_data"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Query Data"/>

(2)新建Book.java类

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;
    }
}
    真诚地感谢伟大的程序猿锅锅们,自动生成setter和getter的感觉不要太酷!!!(自动生成办法 点击打开链接  https//jingyan.baidu.com/article/36d6ed1f6b088b1bcf4883ce.html

(3)litepal.xml      ,将Book类添加到映射模型列表中

<litepal>
    <dbname value="BookStore"></dbname>
    <version value="1"></version>
    <list>
        <mapping class="com.example.litepaltest.Book"></mapping>
    </list>
</litepal>

<mapping>标签:声明要配置的映射模型类。不论多少模型需要映射,只需将其放在该标签内即可。类名一定要写完整啊!

(4)MainActivity.java    ,响应按键,生成数据库

public class MainActivity extends AppCompatActivity {

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

(5)查看数据库创建情况


可以看到创建成功啦!


进一步查看建表语句,有三条。

3. 范例2:升级数据库:为Book表增加一个press类,在BookStore.db中增加一张表

(1)Book.java   ,增加一条属性

private String press;

    public String getPress() {
        return press;
    }
    public void setPress(String press) {
        this.press = press;

(2)新建Category.java    ,增加这个表

public class Category {
    private int id;
    private String categoryName;
    private int categoryCode;

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

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

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

(3)litepal.xml     ,修改版本号,升级操作

<litepal>
    <dbname value="BookStore"></dbname>
    <version value="2"></version>
    <list>
        <mapping class="com.example.zxx.litepaltest.Book"></mapping>
        <mapping class="com.example.zxx.litepaltest.Category"></mapping>
    </list>
</litepal>

(4)运行结果(重点观察建表语句)


结论:这个比前面学的方法好用太多了!


6.5.4 使用LitePal添加数据

1. 范例:向表中添加数据

(1)Book.java,修改一下继承父类

public class Book extends DataSupport{
...
}

(2)MainActivity.java,响应按键,实例化对象

 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.98);
                book.setPress("unknow");
                book.save();//最后通过save()完成添加
            }
        });

(3)运行结果


数据添加成功啦!


6.5.5 使用LitePal更新数据

1. 更新方式有几种

2. 最简单的更新方式:对已存储的对象重新设值,然后再次调用sava()方法。

(1)已存储对象 概念:对litepal而言,是通过model.saved()方法来判断:true-已存储;false-未存储。

    返回true只有两种情况:1-已经调用过model.save()方法添加数据;2-model对象时通过LitePal提供的查询API查询出来的。先看第一种的情况。

(2)范例1:修改书本价格

① MainActivity.java 

Button updateData =(Button) findViewById(R.id.update_data);
        updateData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                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(30.5);//将价格修改为30.5
                book.save();
            }
        });

② 运行结果:价格变化了


3. 另一种更为灵巧的更新方式(不局限于已存储的对象)

(1)采用updateAll()方法,括号中可以添加条件,对某个/类对象修改某个属性

(2)范例2:将《The Lost Symbol》这本书的价格改为100,出版社改为Anchor

① MainActivity.java

        updateData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Book book=new Book();
                book.setPrice(100);
                book.setPress("Anthor");
                book.updateAll("name = ? and author = ?","The Lost Symbol","Dan Brown");

② 运行结果:价格和出版社都改变了


3. 将某条记录的属性值改为默认值,不可以通过model.setPrice(0);的方式,有一个特定的方法:setToDefault()方法。

范例3:将所有书本的页码设置为0

(1)MainActivity.java

  Button updateData =(Button) findViewById(R.id.update_data);
        updateData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Book book=new Book();
                book.setToDefault("pages");//将Paages这条属性的值变为Pages 的默认值。
                book.updateAll();//所有书本的页码都要更新。

(2)运行结果:页码全部变成0



6.5.6 使用LitePal删除数据

1. 和更新类似,有两种方式:

    方式一:model.delete();和更新的第一种方法类似,这个也只能删除”已存储对象”,不举例了。

    方式二:DataSupport.deleteAll()方法,括号中可以添加约束条件,不添加则将该表中所有记录删除。

2. 范例1:采用DataSupport.deleteAll()删除数据。

(1)MainActivity.java

 Button deleteData=(Button)findViewById(R.id.delete_data);
        deleteData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DataSupport.deleteAll(Book.class, "price < ?","20");//把比20便宜的书删掉
            }
        });

(2)运行结果:低于20元的书本记录不见了。



6.5.7 使用LitePal查询数据

1. 比SQLite好太多!DataSupport.findAll()方法。

(1)范例1:查询Book表中的所有数据

 Button queryData=(Button)findViewById(R.id.query_data);
        queryData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                List<Book> books=DataSupport.findAll(Book.class);
            }
        });

(2)完整范例2:查询并打印信息:

 Button queryData=(Button)findViewById(R.id.query_data);
        queryData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                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 are "+book.getPages());
                    Log.d("MainActivity","book price is "+book.getPrice());
                    Log.d("MainActivity","book press is "+book.getPress());
                }
            }
        });

    运行结果:把Book表中所有书本的信息都打印出来了


2. 更多查询API

(1)查询Book表中的第一条数据

Book firstBook = DataSupport.findFirst(Book.class);

(2)查询Book表中的第二条数据

Book LastBook = DataSupport.findLast(Book.class));

(3)采用连缀查询来定制更多功能。

  


这章终于学完啦!!!!!!!




猜你喜欢

转载自blog.csdn.net/qq_39915585/article/details/79770003