zoukankan      html  css  js  c++  java
  • Android LitePal

    LitePal是一款开源的android数据框架,它采用了对象关系映射(ORM)的模式,并且我们平时开发最常用的一些数据库功能进行了封装,使得不用编写一行SQL语句就可以完成各种间表和增删改查的操作。它的项目主页上也有详细的使用文档

    配置LitePal

    声明开源库引用

    大多数开源项目都会将版本提交到jcenter上,我们只需要在app/build.gradle文件中声明该开源库的引用就可以了。
    在dependencies闭包中添加org.litepal.android:core:1.4.1

    dependencies {
        compile fileTree(include: ['*.jar'], dir: 'libs')
        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:26.+'
        testCompile 'junit:junit:4.12'
        compile 'org.litepal.android:core:1.4.1'
    }
    

    配置litepal.xml

    在app/src/main目录下新建assets目录,在assets目录下新建litepal.xml文件

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

    <dbname>标签用于指定数据库名,<version>用于指定版本号,<list>中就是指定的映射模型

    配置LitePalApplication

    修改AndroidManifest.xml中的代码

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.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">
            ...
        </application>
    </manifest>
    

    创建和升级数据库

    LitePal采取的对象关系映射的模式,那么什么是对象关系映射(ORM)呢?简单点说,我们使用的编程语言是面向对象语言,而使用的数据库则是关系型数据库,那么将面向对象的语言和面向关系数据库之间建立的一种映射关系,这就是对象映射关系。(还记得服务器等很多地方都有ORM思想)
    不过你可不要小看对象关系映射模式,它赋予了我们一个强大的功能,就是可以用面向对象的思想来操作数据库。新建Book类:

    public class Book{
        private int id;
        private String author;
        private double price;
        private int pages;
        private String name;
    
        public String getAuthor() {
            return author;
        }
        public void setAuthor(String author) {
            this.author = author;
        }
        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;
        }
        public int getPages() {
            return pages;
        }
        public void setPages(int pages) {
            this.pages = pages;
        }
        public double getPrice() {
            return price;
        }
        public void setPrice(double price) {
            this.price = price;
        }
    }
    

    修改litepal.xml中的代码

    <?xml version="1.0" encoding="utf-8" ?>
    <litepal>
        <dbname value="BookStore"></dbname>
        <version value="1"></version>
        <list>
            <mapping class="com.example.a51104.litepaltest.Book"></mapping>
        </list>
    </litepal>
    

    修改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) {
                    LitePal.getDatabase();//相当于调用onCreate()或者onUpgrade()
                }
            });
        }
    }
    

    当我们想要修改数据库内容时,直接修改类的内容(如增加或者删除列)、新建类(增加表)等。然后修改版本号后重新建库。当然LitePal还自动帮我们做完项非常重要的工作,就是保留之前表中的所有数据,这样就再也不用担心数据丢失的问题。

    使用LitePal添加数据

    • 创建出模型类的实例,将需要存储的信息设置好后调用save()方法
    • 进行CRUD操作时需要继承DataSupport类
    public class Book extends DataSupport{
       ...
    }
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            ...
            Button addData=(Button)findViewById(R.id.insert_database);
            addData.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Book book=new Book();
                    book.setName("Android Studying");
                    book.setAuthor("G");
                    book.setPages(454);
                    book.setPrice(16.96);
                    book.setPress("Unknow");
                    book.save();
                }
            });
        }
    }
    

    使用LitePal更新数据

    已存储对象:model.isSaved()被用来判断是否已存储。在两种情况下会返回true:一种是已经调用了model.save()方法去添加数据了,此时model会被认为是已存储的对象。另一种情况是model对象是通过LitePaal提供的查询API查到的对象。
    修改已经存储的对象,方法一

    updateData.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Book book=new Book();
                    book.setName("Android Studying2");
                    book.setAuthor("G2");
                    book.setPages(510);
                    book.setPrice(19.95);
                    book.setPress("Unknow");
                    book.save();
                    book.setPrice(10.99);
                    book.save();
          //更新成默认值的操作,默认值是不能直接set的可以通过这个方法指定列名进行操作
    //                Book book=new Book();
    //                book.setToDefault("pages");
    //                book.updateAll();
                }
            });
    }
    

    方法二

    updateData.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Book book=new Book();
                    book.setPrice(14.95);
                    book.setPress("Author");
                    book.updateAll("name=? and author=?","Android Studying","G");
                }
            });
    }
    

    使用LitePal删除数据

    deleteData.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    DataSupport.deleteAll(Book.class,"price<?","15");
                }
            });
    

    使用LitePal查询数据

    查询所有行
    List<Book> books=DtaSupport.findAll(Book.class);

    queryButton.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 is "+book.getPages());
                        Log.d("MainActivity","book price is "+book.getPrice());
                        Log.d("MainActivity","book press is "+book.getPress());
                    }
                }
            });
    
    功能 代码
    查询表所有行 List<Book> books=DataSupport.findAll(Book.class);
    查询第一条数据 Book firstBook=DataSupport.findFirst(Book.class);
    查询最后一条数据 Book lastBook=DataSupport.findLast(Book.class);
    查询指定几列数据 List<Book>books=DataSupport.select("name","author").find(Book.class)
    查询指定的约束条件 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(3).find(Book.class)
    指定查询结果的偏移量 List<Book> books=DataSupport.limit(3).offset(1).find(Book.class)

    当然这些可以组合起来(流模式),形成强大的查询功能

    SQL语言

    Cursor cursor=DataSupport.findBySQL("select * from Book where pages > ? and price < ?","400","20");

  • 相关阅读:
    求阶乘及其和
    JAVA 字符串题目 以静态方法实现encode()和decode()的调用
    JAVA 类与对象题目5
    JAVA 类与对象题目4
    JAVA 类与对象题目3
    JAVA 类与对象题目2
    JAVA 基础练习题代码
    JAVA 关于值类型和引用类型的区别
    JAVA学习 判断一个字符或字符是否位于另一个字符串的末尾
    JAVA 截取4个随机数字字母的代码
  • 原文地址:https://www.cnblogs.com/code-fun/p/12922865.html
Copyright © 2011-2022 走看看