《第一行代碼》系列讀書筆記
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對象,需要將數據一一取出纔行。