宁德建设银行网站,网站后台上传新闻,十大招标网站排行榜,书签制作古风一、LitePal简介
1、(新建项目LitePalTest)正式接触第一个开源库---LitePalLitePal是一款开源的Android 数据库框架#xff0c;它采用了对象关系映射#xff08;ORM#xff09;的模式。2、配置LitePal#xff0c;编辑app/build.gradle文件#xff0c;在dependencies闭包中…一、LitePal简介
1、(新建项目LitePalTest)正式接触第一个开源库---LitePalLitePal是一款开源的Android 数据库框架它采用了对象关系映射ORM的模式。2、配置LitePal编辑app/build.gradle文件在dependencies闭包中添加如下内容
dependencies {implementation fileTree(dir: libs, include: [*.jar])implementation com.android.support:appcompat-v7:26.1.0implementation com.android.support.constraint:constraint-layout:1.0.2testImplementation junit:junit:4.12androidTestImplementation com.android.support.test:runner:1.0.1androidTestImplementation com.android.support.test.espresso:espresso-core:3.0.1compile org.litepal.android:core:1.4.1
}这样我们就成功把LitePal成功引入当前项目中了接下来需要配置litepal.xml文件。右击app/src/main目录,new一个
Directory命名为assets然后在assets目录下新建一个litepal.xml。编辑添加代码如下
?xml version1.0 encodingutf-8 ?
litepaldbname value BookStore222/dbnameversion value 1/versionlist/list/litepal其中daname标签用于指定数据库名version标签用于指定数据库版本号list标签用于指定所有的映射模型。
3、最后需要配置一下LitePalApplication修改AndroidManifest.xml中的代码如下
?xml version1.0 encodingutf-8?
manifest xmlns:androidhttp://schemas.android.com/apk/res/androidpackagecom.example.litepaltestapplicationandroid:nameorg.litepal.LitePalApplicationandroid:allowBackuptrueandroid:iconmipmap/ic_launcherandroid:labelstring/app_nameandroid:roundIconmipmap/ic_launcher_roundandroid:supportsRtltrueandroid:themestyle/AppThemeactivity android:name.MainActivityintent-filteraction android:nameandroid.intent.action.MAIN /category android:nameandroid.intent.category.LAUNCHER //intent-filter/activity/application/manifest
我们项目的application配置为org.litepal.LitePalApplication只有这样才能让LitePal的所有功能都可以正常
工作关于application的作用我们再行介绍。二、创建和升级数据库LitPal采取的是对象关系映射(ORM)的模式简单说就是我们使用的编程语言是面向对象语言而使用的数据库是
关系型数据库那么将面向对象的语言和面向关系的数据库之间建立一种映射关系这就是对象关系映射。使用LitePal,可以用面向对象的思维来实现功能定义一个Book类代码如下
package com.example.litepaltest;/*** Created by ZHJ on 2018/3/4.*/public class Book {private int id;private String author;private double price;private int pages;private String name;public int getId() {return id;}public String getAuthor() {return author;}public double getPrice() {return price;}public int getPages() {return pages;}public String getName() {return name;}public void setId(int id) {this.id id;}public void setAuthor(String author) {this.author author;}public void setPrice(double price) {this.price price;}public void setPages(int pages) {this.pages pages;}public void setName(String name) {this.name name;}
}这是一个典型的Java bean在Book中我们定义了id,author,price,pages,name 这几个字段并生成相应的getter和setter
方法先将类中的字段定义好按下AltInsert在弹出的对话框中选择Getter和Setter接着使用Shift将所有字段选中。就会自动生成相应的getter和setter方法。
相信你已经猜到了Book类就会对应数据库中的Book表而类中的每个字段分别对应了表中的每个列。
接下来将Book类添加到映射模型列表中修改litepal.xml中的代码如下
?xml version1.0 encodingutf-8 ?
litepaldbname value BookStore222/dbnameversion value 1/versionlistmapping class com.example.litepaltest.Book/mapping/list/litepal这里通过mapping标签来声明我们要配置的映射模型类注意是使用完整的类名。不管多少模型类需要映射都使用同样的方式配置在list标签下。所有工作已经完成了进行任意的一次数据库操作BookStore222.db数据库就会被自动创建出来。
修改MainActivity中的代码如下
package com.example.litepaltest;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;import org.litepal.LitePal;public class MainActivity extends AppCompatActivity {Overrideprotected 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() {Overridepublic void onClick(View view) {LitePal.getDatabase();}});}
}
调用
LitePal.getDatabase()方法就是一次简单的数据库操作只要点击一下按钮数据就自动创建完成了。运行一下程序然后点击Create database按钮接着通过adb shell 主要在启动相应模拟器的情况下在命令行输入adb shell查看一下数据库创建情况。
注意
activity_main.xml的布局代码如下
?xml version1.0 encodingutf-8?
LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:orientationverticalandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentButtonandroid:idid/create_databaseandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:text Create database/Buttonandroid:idid/add_dataandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:text Add data/Buttonandroid:idid/update_dataandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:text Updata data/Buttonandroid:idid/delete_dataandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:text Delete data/Buttonandroid:idid/query_dataandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:text Query data//LinearLayout运行程序后通过adb shell 查看一下数据库创建情况(使用android 6 模拟器android 7 似乎不可以进入超级管理员状态也就不可以操作数据库)
adb shell 进入
cd data/data/com.example.项目名(listpaltest)
cd databases
ls
如下具体参考《第一行代码》第二版P234可以看到这里有3张表其中android_metadata表仍然不用管table_schema是LitePal内部使用的我么也可以直接忽视
book表是我们根据定义的Book类以及勒种的字段来自动生成的。
使用LitePal来升级数据库非常容易只需要将你想改的地方直接将版本号加1就行了。
我们要向Book表中添加一个Press(出版社)列直接修改Book类中的代码添加一个press字段即可。如下
package com.example.litepaltest;/*** Created by ZHJ on 2018/3/4.*/public class Book {.....private String press;
.....public String getPress() {return press;}
....public void setPress(String press) {this.press press;}
....}
如此同时我们还想添加一张Category表那么只需要新建一个Category类就可以了代码如下
package com.example.litepaltest;/*** Created by ZHJ on 2018/3/4.*/public class Category {private int id;private String categoryName;private int categoryCode;public void setId(int id) {this.id id;}public void setCategoryName(String categoryName) {this.categoryName categoryName;}public void setCategoryCode(int categoryCode) {this.categoryCode categoryCode;}
}
改完了我们想改的东西只需要记得将版本号加1就行了。
这里还需要添加一个新的模型类因此也需要将它添加到映射模型列表中修改litepal.xm中的代码如下
?xml version1.0 encodingutf-8 ?
litepaldbname value BookStore222/dbnameversion value 2//原来是1修改之后变为2/versionlistmapping class com.example.litepaltest.Book mapping clss com.example.litepaltest.Category/mapping//来声明沃我们要配置的模型类一定要使用完整的类名。不管有多少模型类需要映射都要以同样的方式配置在lise标签下。/list/litepal
现在重新运行一下程序点击Create database按钮查看一下最新的建表语句
C:\Users\ZHJadb shellrootgeneric_x86:/ # cd data/data/com.example.litepaltestrootgeneric_x86:/data/data/com.example.litepaltest # cd databases127|rootgeneric_x86:/data/data/com.example.litepaltest/databases # lsBookStore222.dbBookStore222.db-journalqlite3 BookStore222.db sqlite .table
如下我们可以看到book表中新增了一个press列category表也创建成功了。当然LitePal还自动帮我们做了一项非常重要的工作就是保留之前表中的所有数据这样就不用担心数据丢失的问题了。
三、使用LitePal添加数据
使用LitePal来添加数据。
1、创建出模型类的实例。
2、再将所有要存储的数据设置好。
3、最后调用一下save()方法就可以了。
开始动手实现观察现有的模型类你会发现没有继承结构的。因为LiePal进行表管理操作时不需要模型类有任何的继承结构
但是进行CRUD操作时就不行了。必须要继承自DataSupport类才行。因此我们需要把继承结构加上。修改Book类代码如下
package com.example.litepaltest;import org.litepal.crud.DataSupport;/*** Created by ZHJ on 2018/3/4.*/public class Book extends DataSupport{private int id;private String author;private double price;private int pages;
......
}
接着我们向Book表中添加数据修改MainActivity中的代码如下
package com.example.litepaltest;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;import org.litepal.LitePal;public class MainActivity extends AppCompatActivity {Overrideprotected 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() {Overridepublic void onClick(View view) {LitePal.getDatabase();}}); Button addData (Button) findViewById(R.id.add_data);addData.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View view) {Book book new Book();book.setName(The Da Vinci Code);book.setAuthor(Dan Brown);book.setPages(454);book.setPrice(16.96);book.setPress(Unknown);book.save();}});}
}
我们首先创建出一个Book的实例然后调用Book类中的各种set方法对数据进行设置最后再调用book.save()方法就能完成数据添加操作。这个save()方法是从DataSupport类中继承来的除了save()方法外DataSupport类还给我们提供了丰富的CRUD方法。
现在运行程序点击Add data按钮此时数据应该已经添加成功了。我们打开数据库看一下。我们点了4次Add Data 按钮添加了4个。
四、使用LitePal更新数据库
更新数据库比添加数据稍微复杂一些因为它的API接口比较多。
最简单的一种更新方式就是对已经存储的对象重新设值然后重新调用save()方法即可。
什么是已经存储的对象
对于LitePal来说对象是否已经存储就是根据调用model.isSaved()方法的结果来判断的返回true表示已经存储返回false就表示未存储那么什么情况下会返回true什么情况下会返回false?实际上只有两种情况下model会被认为是已经存储的对象。一种情况是已经调用过model.save()方法去添加数据了。此时model会被认为是已存储的对象。另一种情况是model对象是通过LitePal提供的查询API查出来的由于是从数据库中查到的对象因此也会被认为是已已经存储的对象。
我们先通过第一种情况来进行验证。
首先修改MainActivity中的代码如下
package com.example.litepaltest;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;import org.litepal.LitePal;public class MainActivity extends AppCompatActivity {Overrideprotected 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() {Overridepublic void onClick(View view) {LitePal.getDatabase();}});Button addData (Button) findViewById(R.id.add_data);addData.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View view) {Book book new Book();book.setName(The Da Vinci Code);book.setAuthor(Dan Brown);book.setPages(454);book.setPrice(16.96);book.setPress(Unknown);book.save();}}); Button updataData (Button)findViewById(R.id.update_data);updataData.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View view) {Book book new Book();book.setName(The Lost Symbol);book.setAuthor(Dan Brown);book.setPages(510);book.setPrice(19.95);book.setPress(Unkown);book.save();book.setPrice(10.99);book.save();}});}
}
在更新数据按钮的点击事件里面我先是们通过上一小节学习的知识添加了一条Book数据然后调用setPrice()方法将这本的价格进行了修改之后再次使用了save()方法。此时LitePal会发现当前的Book对象是存储的因此不会再向数据库中添加一条新数据而是直接会更新当前数据。
运行程序点击Update data 按钮。输入 select * from Book;我们点了两次Update data 按钮所有会更新两个数据。
但是这种更新方式只能对已存储的对象进行操作限制比较大我们学习另一种更新方式修改MainActivity中的代码如下所示
package com.example.litepaltest;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;import org.litepal.LitePal;public class MainActivity extends AppCompatActivity {Overrideprotected 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() {Overridepublic void onClick(View view) {LitePal.getDatabase();}});Button addData (Button) findViewById(R.id.add_data);addData.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View view) {Book book new Book();book.setName(The Da Vinci Code);book.setAuthor(Dan Brown);book.setPages(454);book.setPrice(16.96);book.setPress(Unknown);book.save();}});Button updataData (Button)findViewById(R.id.update_data);updataData.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View view) {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()方法来设置要更新的数据最后再调用updataAll()方法去执行更新操作。注意updataAll()方法中可以指定一个条件约束和SQLiteDatabase中的update()方法的where参数部分有点类似但更加简洁如果不指定条件语句就表示更新所有数据。这里我们指定将所有书名是The Lost Symbol 并且作者是Dan Brown 书价格更新为14.95出版社更新为Anchor。
点击Update data按钮再次查询表中的数据情况可见第二本书的几个被更新成了14.95出版社被更新成了Anchor。
在使用updateAll()方法时还有一个非常重要的知识点就是当你想把一个字段的值更新为默认值时是不可以使用上面的方式来set数据的。JAVA中任何一种数据类型都会有默认值。对于所有想要将数据更新为默认值的操作LitePal统一提供了一个setToDefault()方法然后传入相应的列名就可以了比如
Book book new Book();
book.setToDefault(pages);
book.updateAll(name ? and author,The Lost Symbol,Dan Brown);
这段代码意思是将书名是The Lost Symbol并且做作者是Dan Brown的页数设置为默认值(就是0)。
package com.example.litepaltest;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;import org.litepal.LitePal;public class MainActivity extends AppCompatActivity {Overrideprotected 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() {Overridepublic void onClick(View view) {LitePal.getDatabase();}});Button addData (Button) findViewById(R.id.add_data);addData.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View view) {Book book new Book();book.setName(The Da Vinci Code);book.setAuthor(Dan Brown);book.setPages(454);book.setPrice(16.96);book.setPress(Unknown);book.save();}});Button updataData (Button)findViewById(R.id.update_data);updataData.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View view) { Book book new Book();book.setToDefault(pages);book.updateAll(name ? and author ?,The Lost Symbol,Dan Brown);}});}
}下面来检验一下如上观看
因为updateAll()方法中制定了约束条件若没有约束条件此次更新操作会对所有的数据生效。
五、使用LitePal删除数据
使用LitePal删除数据的方式主要有两种第一种比较简单就是直接调用已存储对象的delete()方法就可以。所谓已存储的对象的含义我们再说一遍就是调用过save(方法的对象或者是通过LitePal提供的查询API查询出来的对象都是可以直接使用delete()方法来删除对数据的。这种方式我们就不演示了。
我们来看另一种删除数据的方式。
修改MainActivity中的代码如下
package com.example.litepaltest;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;import org.litepal.LitePal;
import org.litepal.crud.DataSupport;public class MainActivity extends AppCompatActivity {Overrideprotected 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() {Overridepublic void onClick(View view) {LitePal.getDatabase();}});Button addData (Button) findViewById(R.id.add_data);addData.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View view) {Book book new Book();book.setName(The Da Vinci Code);book.setAuthor(Dan Brown);book.setPages(454);book.setPrice(16.96);book.setPress(Unknown);book.save();}});Button updataData (Button)findViewById(R.id.update_data);updataData.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View view) {Book book new Book();book.setToDefault(pages);book.updateAll(name ? and author ?,The Lost Symbol,Dan Brown);}});Button deleteButton (Button)findViewById(R.id.delete_data);deleteButton.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View view) {DataSupport.deleteAll(Book.class,price?,15);}});}
}
这里调用了DataSupport.deleteAll()方法来删除数据其中deleteAll()方法的第一个参数用来指定删除哪一张表中的数据Book.class意味着删除Book表中的数据。后面的语句用于指定约束条件。这行代码的意思就是删除price小于15的书。
运行程序点击按钮查询表中数据如下可以看到低于15的书的数据已经被删除了。
另外deleteAll()方法如果不指定约束条件就意味着要删除表中所有的数据和updateAll()方法相似。
六、使用LitePal查询数据
使用LitePal来查询数据一点都不复杂LitePal在查询API方面的设计及其人性化基本上可以满足绝大多数场景的查询需求并且代码十分整洁。比如我们打算查询表中的所有数据使用LitePal如何完成同样的功能呢
只需这样写
ListBook books DataSupport.findAll(Book.class);
只需要调用一下findAll()方法的返回值是一个Book类型的List集合LitePal已经自动帮我们完成了赋值操作。
修改MainActivity中的代码如下
package com.example.litepaltest;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;import org.litepal.LitePal;
import org.litepal.crud.DataSupport;import java.util.List;public class MainActivity extends AppCompatActivity {Overrideprotected 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() {Overridepublic void onClick(View view) {LitePal.getDatabase();}});Button addData (Button) findViewById(R.id.add_data);addData.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View view) {Book book new Book();book.setName(The Da Vinci Code);book.setAuthor(Dan Brown);book.setPages(454);book.setPrice(16.96);book.setPress(Unknown);book.save();}});Button updataData (Button)findViewById(R.id.update_data);updataData.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View view) {Book book new Book();book.setToDefault(pages);book.updateAll(name ? and author ?,The Lost Symbol,Dan Brown);}});Button deleteButton (Button)findViewById(R.id.delete_data);deleteButton.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View view) {DataSupport.deleteAll(Book.class,price?,15);}});Button queryButton (Button)findViewById(R.id.query_data);queryButton.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View view) {ListBook 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对象并将其中的信息全部打印出来。现在运行一下程序点击Query data按钮。查看logcat的打印内容。这样我们就已经将这条数据查询出了。
注意事项
以上我们是基于大牛郭霖的《第一行代码》系列书籍中的数据库内容进行的解释。再一次从内心中迸发出的自由而不尴尬的崇高敬意。
此外我们还可以通过操作把输入框中输入的数据通过按钮传入到SQLite数据库以后我们会进行详细解释。