AndroidはLitePalを使ってデータベースを操作します.
27311 ワード
1.LitePalプロファイルLitePalはオープンソースのAndroidデータベースのフレームワークであり、オブジェクト関係マップ(ORM)のパターンを採用しており、私たちが普段開発しているデータベース機能の一部をパッケージ化しました.SQL文を作成しなくても、各種の建設表と添削の操作ができます.LitePalのプロジェクトホームページにも詳細なドキュメントがあります.住所は:http://github.com/LitePalFramework/LitePal 2.LitePalを設定し、LitePalを使用するには、最初のステップはap/build.gradleファイルを編集し、dependenciesのクローズドに下記の内容を追加します.
最後に、LitePalAppleを配置し、Android Manifest.xmlのコードを修正する必要があります.
MainActivityコードを修正
SQLiteOpenHelperを使ってデータベースをアップグレードします.問題があります.データベースをアップグレードする時、先に前のテーブルdropを落としてから新たに作成しなければなりません.これは非常に深刻な問題です.このため、データが無くなります.データベースをアップグレードするたびに、前の表のデータが全部なくなります.LitePalを使う時、LitePalを使います.これらはもう問題ではないです.LitePalを使ってデータベースをアップグレードするのはとても簡単です.どんなロジックも考えなくてもいいです.変更したい内容を変更して、バージョン番号を1だけ追加すればいいです.
例えば、私たちはBookテーブルにpress(出版社)列を追加したいです.直接Bookクラスのコードを修正して、pressフィールドを追加します.
注意:udateAll()メソッドを使用する場合、一つのフィールドの値をデフォルト値に更新したい場合、上記の方法でsetデータを使用してはいけません.javaのいずれのデータタイプのフィールドにもデフォルト値があります.例えば、intタイプのデフォルト値は0、bollanタイプのデフォルト値はfalse、Stringタイプのデフォルト値はnullです.実際には、すべてのフィールドはデフォルト値に初期化されています.たとえば、Pagesフィールドの値は0です.データテーブルの中のpagesを0に更新したいです.book.setPages(0)を直接呼び出してもいいです.このコードを起動しなくても、pagesフィールド自体は0です.LitePalはこの列を更新しません.データをデフォルト値に更新したい操作について、LitePalはset ToDefault()の方法を提供し、その後、対応する列名を入力して実装することができます.例えば、
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.3.2'
}
追加されたこの行の声明では、前の部分は固定されています.最後の1.3.2はバージョン番号という意味です.最新のバージョン番号はLitePalのプロジェクトのホームページで確認できます.これでLitePalを現在のプロジェクトに導入しました.そしてliptal.xmlファイルを配置し、右クリックしてap/src/mainディレクトリ–New-Directoryをクリックして、astsディレクトリを作成します.そして、assetsディレクトリの下にliptal.xmlファイルを新規作成し、編集します.
<litepal>
<dbname value="BookStore" >dbname>
<version value="1" >version>
<list>
list>
litepal>
dbnameタグはデータベース名を指定するために使用され、バージョン番号を指定するためにversionタグを使用し、すべてのマッピングモデルを指定するためにlistタグを使用します.最後に、LitePalAppleを配置し、Android Manifest.xmlのコードを修正する必要があります.
"http://schemas.android.com/apk/res/android"
package="com.example.litepaltest">
"org.litepal.LitePalApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
...
ここでプロジェクトのappicationをorg.litePal Appleとして設定します.これでLitePalのすべての機能が正常に動作するようになります.現在LitePalの配置作業は全部終了しました.次はどのように3.データベースLitePalを作成してアップグレードしますか?私たちが使っているプログラミング言語は対象言語に向けています.データベースは関係データベースです.オブジェクトに向かう言語と関係データベースとのマッピング関係を構築します.これはオブジェクト関係をマッピングします.オブジェクト関係マッピングモードは、オブジェクトに向けた思考でデータベースを操作することができます.SQL文とのやり取りをやめます.例えば、Book表を作成するためには、まず分析表にそれらの列を含めて、それから建表文を作成し、最後にカスタムSQLiteOpenHelperでこの建表文を実行する必要がありますが、LitePalを使うと、対象に向けた思考で同じ機能を実現できます.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クラスではid、author、price、pages、nameのこれらのフィールドを定義し、それぞれのgetterとsetter方法を生成しました.BookクラスはデータベースのBookテーブルに対応しますが、クラスの各フィールドはそれぞれテーブルの各列に対応しています.これはオブジェクト関係マップの最も直接的な体験です.次に、Book類をマッピングモデルリストに追加し、liptal.xmlのコードを修正します.
<litepal>
<dbname value="BookStore" >dbname>
<version value="1" >version>
<list>
<mapping class="com.example.litepaltest.Book">mapping>
list>
litepal>
ここでは、mappingタグを使用して、私たちが配置するマッピングモデルクラスを宣言します.必ず完全なクラス名を使用してください.いくつかのモデル類がマッピングされる必要があるに関わらず、同じ方法でリストタグの下に配置されます.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){
Connector.getDatabase();
}
});
}
}
この中で、Connector.get Databaseを呼び出す方法は簡単なデータベース操作です.ボタンを押すと、データベースが自動的に作成されます.SQLiteOpenHelperを使ってデータベースをアップグレードします.問題があります.データベースをアップグレードする時、先に前のテーブルdropを落としてから新たに作成しなければなりません.これは非常に深刻な問題です.このため、データが無くなります.データベースをアップグレードするたびに、前の表のデータが全部なくなります.LitePalを使う時、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;
}
}
それと同時に、私達はCategory表をもう一枚追加したいです.Category類を新しく作ってもいいです.public class Category {
private int id;
private String categoryName;
private int categoryCode;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCategoryName() {
return categoryName;
}
public void setCategoryName(String categoryName) {
this.categoryName = categoryName;
}
public int getCategoryCode() {
return categoryCode;
}
public void setCategoryCode(int categoryCode) {
this.categoryCode = categoryCode;
}
}
私たちが変えたいものは全部変えました.バージョン番号を1だけ追加すればいいです.ここに新しいモデル類を追加しますので、マッピングモデルリストに追加してください.liptal.xmlのコードを修正してください.
<litepal>
<dbname value="BookStore" >dbname>
<version value="2" >version>
<list>
<mapping class="com.example.litepaltest.Book">mapping>
<mapping class="com.example.litepaltest.Category">mapping>
list>
litepal>
4.LitePalでデータを追加し、LitePalでデータを追加し、モデルクラスのインスタンスを作成して、保存するデータを全部設定して、最後にsave()方法を呼び出してもいいです.モデルクラスはData Supportクラスを引き継ぎ、Bookクラスを変更します.public class Book extends DataSupport{
...
}
MainActivityコードを修正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.add_data);
addData.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
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クラスの各種setメソッドを呼び出してデータを設定し、最後にbook.save()メソッドを呼び出してデータの追加操作が完了します.このsave()方法はDataSupport類から中継されました.save()方法以外にもいくつかの方法があります.5.LitePalでデータを更新します.まず、最も簡単な更新方法は、格納されているオブジェクトに値を設定し、それを起動する方法です.格納されているオブジェクトとは、LitePalにとって、オブジェクトが格納されているかどうかは、model.isSaved()メソッドを呼び出した結果に基づいて判断されます.trueに戻ると、格納されていることを示します.falseに戻ると、未保存を表します.実際には、2つの場合のみmode.mol Saved()です.方法はtrueに戻ります.一つは既にmodel.save()メソッドを呼び出してデータを追加する場合、modelは既に保存されているオブジェクトと見なされます.もう一つは、modelオブジェクトはLitePalから提供されたクエリAPIで調べられます.データベースから調べられたオブジェクトなので、すでに保存されているオブジェクトと見なされます.第一の場合のコードは、MainActivityコードを修正します.public class MainActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
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コードを修正public class MainActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
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()方法とset Press()方法を直接呼び出して更新するデータを設定して、最後にudateAll()方法を呼び出して更新操作を実行します.注意:udateAll()方法で制約条件を指定することができます.SQLiteDatabaseのudate()方法のwhereパラメータの部分は似ています.条件を指定しないと同じです.すべてのデータを更新するという意味です.注意:udateAll()メソッドを使用する場合、一つのフィールドの値をデフォルト値に更新したい場合、上記の方法でsetデータを使用してはいけません.javaのいずれのデータタイプのフィールドにもデフォルト値があります.例えば、intタイプのデフォルト値は0、bollanタイプのデフォルト値はfalse、Stringタイプのデフォルト値はnullです.実際には、すべてのフィールドはデフォルト値に初期化されています.たとえば、Pagesフィールドの値は0です.データテーブルの中のpagesを0に更新したいです.book.setPages(0)を直接呼び出してもいいです.このコードを起動しなくても、pagesフィールド自体は0です.LitePalはこの列を更新しません.データをデフォルト値に更新したい操作について、LitePalはset ToDefault()の方法を提供し、その後、対応する列名を入力して実装することができます.例えば、
Book book = new Book();
book.setToDefault("pages);
book.updateAll();
6.LitePalを使ってデータを削除する方法は二つあります.最初は比較的簡単で、保存対象のdelete()を直接呼び出してもいいです.save()メソッドのオブジェクトを呼び出したり、LitePalから提供されたクエリAPIで調べられたオブジェクトは、Delete()方式でデータを削除することができます.他の削除方式のコードは以下の通りです.MainActivityコードを修正します.public class MainActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
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()方法の最初のパラメータはどのテーブルのデータを削除するかを指定します.Book.classはBookテーブルのデータを削除することを表しています.後のパラメータは制約条件を指定するために使用します.ここでのコードテーブルは、Bookテーブルの価格が15以下の本を削除します.deleteAll(方法は条件を指定しません.リストのすべてのデータを削除します.7.LitePalクエリデータLitePalクエリテーブルのすべてのデータを使います.List books = DataSuppport.findAll(Book.class);
findAll()方法はBookタイプのList集合を返します.以前のようにCursorオブジェクトの一行を通して値を取る必要はありません.LitePalはすでに自動的に私達に値付け作業を完了しました.MainActivityコードを修正します.public class MainActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
Button queryButton = (Button)findViewById(R.id.query_data);
queryButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
List 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の2列のデータだけを調べます.List books = DataSuppport.select("name", "author").find(Book.class);
where()メソッドは、クエリの制約条件を指定するために使用され、SQLのキーワードwhereに対応しています.例えば、ページ数が400より大きいデータのみを照会し、List books = DataSuppport.where("pages > ?", "400").find(Book.class);
order()方法は結果を指定するソート方式に用いられ、SQLの中のorder byキーワードに対応しています.例えば、クエリ結果を本の価格より高い順に並べ替えられたdescを降順に並べ、ascまたは書かないことは昇順配列を表します.List books = DataSuppport.order("price desc").find(Book.class);
limit()メソッドは、クエリーテーブルの最初の3つのデータだけを指定します.List books = DataSuppport.limit(3).find(Book.class);
offset()メソッドは、クエリーテーブルの第2条、第3条、第4条のデータのようなクエリー結果のオフセット量を指定するために使用される.List books = DataSuppport.limit(3).offset(1).find(Book.class);
また、この5つの方法は、任意の組み合わせの接続を行い、比較的複雑なクエリ操作クエリBookテーブルの11番目〜20番目のページ数が400より大きいという条件を満たすname、author、pagesの3列のデータを完成し、ページ数が昇順に並べられます.List 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()メソッドはCurorオブジェクトです.データを一つずつ取り出してください.