• LitePal


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

    配置LitePal
    编辑app/build.gradle文件,在dependencies闭包中添加LitePal的开源库。后面右击app/src/main/目录->New->Directory,创建一个asserts目录,然后再asserts目录下再新建一个litepal.xml文件,接着编辑内容。标签用于指定数据库名,标签用于指定数据库版本号,标签用于指定所有的映射类型。

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

    然后我们要将项目的application配置为org.litepal.LitePalApplication,这样才能让LitePal的所有功能正常工作。

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

    创建和升级数据库

    首先定义一个类,与数据库中的一张表对应,此处举例Book类,对应数据库中的Book表。然后在litepal.xml文件中,将Book类添加到映射模型列表中,注意使用完整的类名。

    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;
        }
        ...
    }
    

    接着,创建数据库,代码很简单。可以用“adb shell”相关命令进入到项目的数据库中查看结果。

    LitePal.getDatabase();

    原先使用SQLiteOpenHelper升级数据库要先把之前的表drop掉,然后再重新创建,这其实是一个非常严重的问题,因为这样会造成数据丢失,每升级一次数据库,之前表中的数据就全没了。虽然可以使用逻辑控制来避免这个问题,但过程比较复杂。而使用LitePal升级数据库非常简单,你完全不用思考任何逻辑,只需要修改你想修改的内容,然后将版本号加1就行了。这里我们举一个例子,增加Book表中一个出版社的字段,新增一张Category表。

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

    public class Category {
    
        private int id;
        private String categoryName;
        private int categoryId;
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        ...
    }
    

    接着我们将版本号加1,然后将新的模型类添加到映射列表中,执行LitePal.getDatabase()就可以了。

    LitePal进行CRUD操作,必须要让模型类继承DataSupport才行。所以,首先我们让Book继承DataSupport类。

    public class Book extends DataSupport {
      ...
    }
    

    添加数据

    Book book = new Book();
    book.setName("The Da Vinci Code");
    book.setAuthor("Dan Brown");
    book.setPages(454);
    book.setPrice(16.96);
    book.setPress("Unknow");
    book.save();
    

    更新数据

    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(10.99);
    book.save();
    

    设置默认值(所有字段都有默认值,比如String类型为null,boolean类型为false,int为0),如果updateAll()没有指定约束条件,则对所有数据生效。

    Book book =new Book();
    book.setToDefault("pages");
    book.updateAll();
    

    另外一种比较灵巧的更新方式

    Book book = new Book();
    book.setPrice(14.95);
    book.setPress("Anchor");
    book.updateAll("name = ? and author = ?", "The Lost Symbol", "Dan Brown");
    

    删除数据

    DataSupport.deleteAll(Book.class, "price < ?", "15"); //如果deleteAll不指定约束条件,意味着你要删除表中的所有数据

    查询数据

    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 press is " + book.getPress());
     Log.d("MainActivity", "book pages is " + book.getPages());
     Log.d("MainActivity", "book price is " + book.getPrice());
                    }
    

    其他查询API

    //查询Book表中的第一条数据
    Book firstBook = DataSupport.findFirst(Book.class);
    //查询Book表中的最后一条数据
    Book lastBook = DataSupport.findLast(Book.class);
    //查询Book表中name和author这两列的数据
    List<Book> books = DataSupport.select("name", "author").find(Book.class);
    //查询Book表页数大于400的数据
    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).offset(1).find(Book.class);
    //五个方法连缀组合,完成一个复杂的查询                
    List<Book> books = DataSupport.select("name","author","pages")
         .where("pages>?","400")
         .order("pages")
         .limit(10)
         .offset(10)
         .find(Book.class);
    

    当然,LitePal也支持原生的SQL来进行查询

    Cursor cursor = DataSupport.findBySQL("select * from Book where pages >?" +
                     "and price < ?", "400", "200");
    
  • 相关阅读:
    日志_测试代码_Qt532
    SetParent
    【转】QT获取系统时间,以及设置日期格式
    JNI打通java和c
    Python 对图片进行人脸识别
    Python写黑客小工具,360免杀
    简单选择排序
    插入排序
    双向链表的实现
    记录安卓开发中的问题
  • 原文地址:https://www.cnblogs.com/ngy-liupeng/p/15184090.html
Copyright © 2020-2023  润新知