• 4、Android-数据存储方案(使用LitePal操作数据库)


    4.5、使用LitePal操作数据库

    4.5.1、LitePal简介

    LitePal是一款开源的Android数据库框架

    采用了关系映射(ORM)的模式

    将经常使用的一些数据库做了封装

    是得不用编写SQL语句就可以完成各种增删改查的操作

    地址在github上可以进行查看

    4.5.2、配置LitePal

    首先在app/build.grade文件中:

    compile 'org.litepal.android:core:1.3.2'

    前面是固定的部分,后面的数字是版本号

    在app/src/main目录下新建一个文件夹:assets

    然后创建litepal.xml文件

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

    标签的含义:

    <dbname>指定数据库名

    <version>指定数据库的版本号

    配置AndroidManifest中的代码:

        <application
            android:name="org.litepal.LitePalApplication"
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:supportsRtl="true"
    .....

    将application配置为org.litepal.LitePalApplication只有这样才能让LitePal的所有功能都可以正常工作

    4.5.3、创建和升级数据库

    LitePal采取的是对象关系映射(ORM)模式

    简单的说:

    使用的编程语言是面向对象的语言,而使用的数据库则是关系型数据库

    将面向对象语言和关系型数据库之间建立的一种映射关系------对象关系映射

    它赋予开发者一个强大的功能,就可以使用面向对象的思维来操作数据库

    不用在和SQL语句打交道。

    新建一个Book类:

    public class Book {
        private int id;
        private String author;
        private float price;
        private String name;
    
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public float getPrice() {
            return price;
        }
        public void setPrice(float price) {
            this.price = price;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getAuthor() {
            return author;
        }
        public void setAuthor(String author) {
            this.author = author;
        }
    }

    这是一个典型的Java Bean,在Book类中定义了4个字段

    并且生成了相应的getter和setter方法

    Book类会对应数据库中的Book表

    每一个字段分别对应表中的每一个列

    在litepal.xml中:

    <?xml version="1.0" encoding="utf-8" ?>
    <litepal>
        <dbname value="stores"></dbname>
        <version value="2"></version>
        <list>
            <mapping class="com.example.ccrr.applicationtwo.Book"></mapping>
        </list>
    </litepal>

    <mapper>标签来声明我们需要配置的映射模型

    填写的是完整的类名

    里面可以同时可以指定多个配置

    在MianActivity中

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.first_layout);
    
            Button date_create = (Button) findViewById(R.id.create_date);
            date_create.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Connector.getDatabase();
                }
            });
        }
    }

    调用Connector.getDatabase()方法就是一个嘴贱的数据库操作

    只要点击按钮一下,数据库就会自动完成创建

    点击完成之后:

    使用adb shell进行查看:

    进入:

    在使用.schema命令查看见表语句

    一共三张表:

    table_schema是LitePal内部使用的

    book表是根据我么你定义的Book类以及类中的字段自动生成的

     更新:

    使用LitePal更新数据表也是很方便的

    只需要修改相应的内容然后再版本号后加1即可

    此时创建新的Java类:

    public class Category {
        private  int id;
        private String name;
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    }

    再litepal.xml中:

    <?xml version="1.0" encoding="utf-8" ?>
    <litepal>
        <dbname value="stores"></dbname>
        <version value="3"></version>
        <list>
            <mapping class="com.example.ccrr.applicationtwo.Book"></mapping>
            <mapping class="com.example.ccrr.applicationtwo.Category"></mapping>
        </list>
    </litepal>

    此时点击按钮:

    进行查看:

    4.5.2、使用LitePal添加数据

    这里的Java实体类需要继承:DataSupport

    public class Book  extends DataSupport{
        private int id;
        private String author;
    ...
    }

    首先定义一个按钮:

        <Button
            android:id="@+id/add_data_litepal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="添加数据"
            />

    MianActivity中:

            //添加数据
            Button add_data_litepal = (Button) findViewById(R.id.add_data_litepal);
            add_data_litepal.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Book book = new Book();
                    book.setAuthor("MrChengs");
                    book.setName("Android");
                    book.setPrice((float) 12.2);
                    book.save();
                }
            });

    这里的使用方法非常简单

    只需要将创建好的实例调用save()方法即可

    此时使用adb shell进行查看:

    可以查询到此时的数据已经存储再数据库中!!!

     4.5.5、使用LitePal更新数据

    首先:最简单的一种更新的方式就是对已存储的对象重新设值

    然后调用save()方法即可

    已存对象:

    对象是否已存储就是调用model.isSaved()方法的结果来判断

    返回为true就是表示已存储

    返回为false就表示未存储

    有两种情况下model.isSaved()方法才会返回true:

    1、已经调用过model.save()方法去添加数据,此时的model就会被认为时已存储的对象

    2、model对象时通过LitePal提供的查询API查出来,由于是从数据库中查询对象,会认为是已存储的对象

    首先使用第一种方法:

    1、已经调用过model.save()方法去添加数据,此时的model就会被认为时已存储的对象

    定义按钮:

        <Button
            android:id="@+id/update_data_litepal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="修改数据"
            />

    MianActivity

            //修改数据
            Button update_data_litepal = (Button) findViewById(R.id.update_data_litepal);
            update_data_litepal.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Book book = new Book();
                    book.setAuthor("MrChengs");
                    book.setName("Java");
                    book.setPrice((float) 12.2);
                    book.save();
                    book.setName("C#");
                    book.save();
                }
            });

    此时点击事件之后:

    此时设置的数据第一次是Java第二次是C#

    连续调用两次save()方法

    此时LitePal会发现当前的Book对象是已存储的

    因此不会向数据库中添加一条新的数据

    第二种方法

    2、model对象时通过LitePal提供的查询API查出来,由于是从数据库中查询对象,会认为是已存储的对象

    此时再MainActivity中:

    //修改数据
            Button update_data_litepal = (Button) findViewById(R.id.update_data_litepal);
            update_data_litepal.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Book book = new Book();
                    book.setName("Android");
                    book.setPrice((float) 100.0);
                    book.updateAll("id = ? and author = ?","2","MrChengs");
    
                }
            });

    点击事件之后的结果:

    4.5.6、使用LitePal删除数据

    两种方式:

    1、直接调用已存储对象的delete()方法

    按钮控件:

        <Button
            android:id="@+id/delete_data_litepal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="删除数据"
            />

    MainActivity中:

            //删除数据
            Button delete_date = (Button) findViewById(R.id.delete_data_litepal);
            delete_date.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    DataSupport.deleteAll(Book.class, "price < ?", "50");
                }
            });

    调用DataSupport.deleteAll()方法

    第一参数用于指定删除那个表中的数据,传入Book.class即Book表中的数据

    后面的参数用与制定约束条件

     如果不指定约束条件就代表删除表中的所有数据

    4.5.7、使用LitePal查询数据

    再查询方面LitePal做了优化

    可满足大多场景的查询需求

    定义控件:

        <Button
            android:id="@+id/query_data_litepal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="查询数据"
            />

    MainActivity中:

    //查询数据
            Button query_btn = (Button) findViewById(R.id.query_data_litepal);
            query_btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    List<Book> books = DataSupport.findAll(Book.class);
                    for (Book book : books){
                        Log.d("book:", book.getAuthor());
                        Log.d("book:",book.getName() );
                        Log.d("book:", String.valueOf(book.getId()));
                        Log.d("book:", String.valueOf(book.getPrice()));
    
                    }
                }
            });

    只需要调用一下findAll()方法

    然后通过Book.class参数指定Book表就可以了

    findAll()方法返回的是一个Book类型的List集合

    点击按钮之后:

    处findAll()方法之外还有其他的方法:

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

    Book firstBook = DataSupport.findFirst(Book.class)

    2、查询Book表中的最后一条数据

    Book lastBook = DataSupport.findLast(Book.class)

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

    1、select()方法用于指定查询哪几列的数据

    List<Book> books = DataSupport.select("name","author").find(Book.class)

    2、where()方法用于指定查询的约束条件

    List<Book> books = DataSupport.where("price > ?”,“100”).find(Book.class)

    3、order()方法用于指定结果的排序方式

    List<Book> books = DataSupport.order("price desc").find(Book.class)

    4、limit()方法用于指定查询结果的数量

    List<Book> books = DataSupport.limit(5).find(Book.class);

    5、offset()方法用于指定查询结果的偏移量

    List<Book> books = DataSupport.limit(5).offset(3).find(Book.class)

      解析:limit()限制数量为前5条数据,offset()偏移量为3此时是4-9条数据

     以上五个方法可以任意组合起来完成一个复杂的查询

     

  • 相关阅读:
    spring mvc velocity多视图
    ubuntu 的远程桌面
    nhibernate 3.3 linq扩展
    MongoDB资料汇总专题[转发]
    SQLServer 2008 删除、压缩日志
    VS2012和2010 设置framework版本
    引用的程序集 没有强名称
    Xamarin for OSX – SetUp
    Xamarin devexpress datagrid 样式
    Xamarin devexpress Grid
  • 原文地址:https://www.cnblogs.com/Mrchengs/p/10697695.html
Copyright © 2020-2023  润新知