Android學習|LitePal操作數據庫

《第一行代碼》系列讀書筆記
1.LitePal簡介
2.配置LitePal
3.創建和升級數據庫
4.添加數據
5.更新數據
6.刪除數據
7.查詢數據


1.LitePal簡介

  • LitePal是一款開源的Android數據庫框架,它採用了對象關係映射(ORM)的模式,並將我們平時開發最常用到的一些數據庫功能進行了封裝,使得不用編寫一行SQL語句就可以完成各種建表和增刪改查的操作。
    什麼是關係映射,簡單的說,我們使用的編程語言是面嚮對象語言,而使用的數據庫則是關係型數據庫,那麼將面向對象的語言和麪向關係的數據庫之間建立一種映射關係,這就是對象關係映射了,對象關係映射模式,就是可以用面向對象的思維來操作數據庫,而不用再和SQL語句打交道。

2.配置LitePal

  • 1.編輯app/build.gradle文件,在dependencies閉包中添加如下內容:

    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        compile 'com.android.support:appcompat-v7:25.3.1'
        testCompile 'junit:junit:4.12'
        compile 'org.litepal.android:core:1.4.1'//版本號
    }
    

    2.配置litepal.xml文件,右擊app/src/main目錄–New–Directory,創建一個assets目錄,然後在assets目錄下再新建一個litepal.xml文件,然後編輯

    <?xml version="1.0" encoding="utf-8"?>
    <litepal>
        <dbname value="BookStore" ></dbname>//數據庫名
        <version value="1" ></version>//數據庫版本號
        <list>//所有的映射模型
        </list>
    </litepal>
    

    3.配置一下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>
    

    這裏將項目的application配置爲org.litepal.LitePalApplication。

3.創建和升級數據庫

  • 使用LitePal,用面向對象的思維來創建一張Book表,定義一個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;
        }
    
        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;
        }
    }
    

    這是一個典型的Java bean,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.litepaltest.Book"></mapping>//聲明我們要配置的映射模型類
        </list>
    </litepal>
    

    修改MainActivity代碼

    Button createDatabase = (Button)findViewById(R.id.create_database);
    createDatabase.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v){
            Connector.getDatabase();
            //簡單的數據庫操作,只要點擊一下按鈕,數據庫就會自動創建完成.
        }
    });
    

    使用SQLiteOpenHelper升級數據庫,有一個問題就是升級數據庫的時候我們需要先把之前的表drop掉,然後再重新創建纔行,這其實是一個非常嚴重的問題,因爲這樣會造成數據丟失,每當升級一次數據庫,之前表中的數據就全沒了。
    當使用LitePal時,這些都不再是問題了.使用LitePal來升級數據庫非常非常簡單,你完全不用考慮任何的邏輯,只需要改你想改的內容,然後版本號加1就可以了

    比如我們想要向Book表中添加一個press(出版社)列,直接修改Book類中的代碼,添加一個press字段

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

    如果我們還想再添加另一張表,那麼只需要新建一個類就可以了
    改完了所有我們想改的東西,只需要記得將版本號加1就行了.這裏添加一個新的模型類,因此也需要將它添加到映射模型列表中,修改litepal.xml中的代碼。

4.使用LitePal添加數據

  • 使用LitePal添加數據,只需要創建出模型類的實例,然後將所有的要存儲的數據設置好,最後調用一下save()方法就可以了
    模型類必須繼承DataSupport類,修改Book類

    public class Book extends DataSupport{
        ...
    }
    

    修改MainActivity代碼

    Button addData = (Button)findViewById(R.id.add_data);
    addData.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v){
            Book book = new Book();  //創建Book實例
            book.setName("The Da Vinci Code");
            book.setAuthor("Dan Brown");
            book.setPages(454);
            book.setPrice(16.96);
            book.setPress("Unknow");
            book.save();  //數據添加
        }
    });
    

5.使用LitePal更新數據

  • 首先,最簡單的一種更新方式就是對已存儲的對象重新設值,然後重新調用save()方法。什麼是已存儲的對象,對於LitePal來說,對象是否已存儲就是根據調用**model.isSaved()**方法的結果來判斷的,返回true就表示已存儲,返回false就表示未存儲。

    第一種情況的代碼,修改MainActivity代碼

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

在更新數據按鈕的點擊事件裏面,首先添加一條Book數據,然後調用setPrice()方法將這本書的價格進行修改,之後再調用了**save()**方法.此時LitePal會發現當前的Book對象是已存儲的,因此不會再向數據庫中去添加一條新的數據,而是會直接更新當前的數據.

另外一種更新方法,修改MainActivity代碼

   Button updateData = (Button)findViewById(R.id.update_data);
   updateData.setOnClickListener(new View.OnClickListener(){
       @Override
       public void onClick(View v){
           Book book = new Book();
           book.setPrice(14.95);
           book.setPress("Anchor");
           book.updateAll("name = ? and author = ?","The Lost Symbol","Dan Brown");
       }
   });
   }

這裏首先new一個Book實例,然後直接調用setPrice()方法和setPress()方法來設置要更新的數據,最後再調用*updateAll()方法去執行更新操作。
對於所有想要將爲數據更新成默認值的操作,LitePal提供了一個
setToDefault()*方法,然後傳入相應的列名就可以了實現了。

6.使用LitePal刪除數據

  • 第一種是直接調用已存儲對象的delete()方法就可以了。 另一種刪除方式的代碼如下: 修改MainActivity代碼:

    Button deleteButton = (Button)findViewById(R.id.delete_data);
    deleteButton.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v){
            DataSupport.deleteAll(Book.class,"price < ?","15");
        }
    });
    }
    

    這裏調用DataSupport.deleteAll()方法來刪除數據,其中deleteAll()方法的第一個參數用於指定刪除哪張表中的數據,後面的參數用於指定約束條件。
    deleteAll()方法不指定約束條件,就是要刪除表中的所有數據

7.使用LitePal查詢數據

  • LitePal查詢表中的所有數據:

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

    findAll()方法返回一個Book類型的List集合,我們不用像之前那樣通過Cursor對象一行行去取值,LitePal已經自動幫助我們完成了賦值操作.
    修改MainActivity代碼:

    Button queryButton = (Button)findViewById(R.id.query_data);
    queryButton.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v){
            List<Book> books = DataSuppport.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());
            }
        }
    });
    }
    

    查詢Book表中的第一條數據可以這樣寫:

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

    查詢Book表中的最後一條數據可以這樣寫

    Book lastBook = DataSuppport.findLast(Book.class);
    

    我們可以通過連綴查詢來定製更多的查詢功能
    select()方法用於指定查詢那幾列的數據,對應了SQL當中的select關鍵字,比如只查詢name和author這兩列的數據

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

    where()方法用於指定查詢的約束條件,對應了SQL當中的關鍵字where,比如只查詢頁數大於400的數據,

    List<Book> books = DataSuppport.where("pages > ?", "400").find(Book.class);
    

    order()方法用於指定結果的排序方式,對應了SQL當中的order by 關鍵字,比如將查詢結果按照書價格從高到低排序
    desc表示降序排列,asc或者不寫表示升序排列

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

    limit()方法用於指定查詢結果的數量,比如只查詢表中的前3條數據

    List<Book> books = DataSuppport.limit(3).find(Book.class);
    

    offset()方法用於指定查詢結果的偏移量,比如查詢表中的第2條,第3條,第4條數據

    List<Book> books = DataSuppport.limit(3).offset(1).find(Book.class);
    

    還可以對這5個方法進行任意組合的連綴,來完成一個比較複雜的查詢操作
    查詢Book表中第11–20條滿足頁數大於400這個條件的name,author和pages這3列數據,並將查詢結果按照頁數升序排列

    List<Book> books = DataSuppport.select("name", "author", "pages")
                       .where("pages > ?", "400")
                       .order("pages")
                       .limit(20)
                       .offset(10)
                       .find(Book.class);
    

    LitePal也支持使用原生的SQL來查詢:

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

    調用DataSupport.findBySQL()方法來進行原生查詢,其中第一個參數用於指定SQL語句,後面的參數用於指定佔位符的值,注意findBySQL()方法返回的是一個Cursor對象,需要將數據一一取出纔行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章