1、SQLite: Android提供了SQLiteOpenHelper来连接数据库,通过SQLiteDatabase来操作数据库,SQLiteDatabase类下由许多操作数据库的方法,最常见的有添加、删除和查询等操作。
SQLite提供了两种操作数据库的方法:
方法一:使用原生的数据库语句,关于数据库语句可以复习Java的SQLite相关语句操作
execSQL(String sql);
execSQL(String sql, Object[] bindArgs)
注:补充相关语句:
增——“insert into student(name,age) values(‘”+stu.getName()+”’”+”,”+stu.getAge()+”)”
删——“delete from student where studentid=?”,new String[]{id+”“}
改——“update student set name=?, age=? where studentid=?”,new String[] {stu.getName(),stu.getAge()+”“,stu.getStudentid()+”“}
查—— “select * from student where studentid=?”, new String[]{id+”“}
查询全部—-“select * from student “, null
方法二:
删:delete(String table, String whereClause, String[] whereArgs)
插入(增):insert(String table, String nullColumnHack, ContentValues values)
查询:query 、rawQuery
更新(改):update(String table, ContentValues values, String whereClause, String[] whereArgs)
下面封装了数据库的dao层和helper层,通过新建helper层新建了一个表格后,再通过dao层来操作数据表。
(1)helper层,新建类继承SQLiteOpenHelper,在构造方法中传入数据表名和上下文对象,重写onCreate执行数据库命令新建一个表格。
package com.example.wechatr.sqliteUtils;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class SqlDataBasehelper extends SQLiteOpenHelper {
public SqlDataBasehelper(Context context) {
super(context, "user.db", null,1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table user(userId integer primary key autoincrement,account" +
" varchar(20),password varchar(20))");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
(2)dao层,获取helper层的数据表对象,通过getReadableDatabase获取操作对象后进行数据操作。
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import com.example.wechatr.user_message;
import java.util.ArrayList;
import java.util.List;
public class UserDao {
private SQLiteDatabase db = null;
private SqlDataBasehelper sbh = null;
public UserDao(Context context)
{
sbh = new SqlDataBasehelper(context);
}
public boolean queryuser(String account,String code)
{
db = sbh.getReadableDatabase();
//查询语句
Cursor Query= db.query("User",null,null,null,null,null,null);
while (Query.moveToNext())
{
String Ac = Query.getString(Query.getColumnIndex("account"));
String Co = Query.getString(Query.getColumnIndex("password"));
if (account.equals(Ac)&&code.equals(Co))
{
db.close();
return true;
}
}
db.close();
return false;
}
public List queryuser()
{
List list = new ArrayList<>();
db = sbh.getReadableDatabase();
Cursor Query= db.query("User",null,null,null,null,null,null);
while (Query.moveToNext())
{
String Ac = Query.getString(Query.getColumnIndex("account"));
String Co = Query.getString(Query.getColumnIndex("password"));
user_message user = new user_message(Ac,Co);
list.add(user);
}
db.close();
return list;
}
public boolean adduser(String Ac,String Co)
{
db = sbh.getReadableDatabase();
ContentValues values = new ContentValues();
values.put("account",Ac);
values.put("password",Co);
//插入语句
db.insert("user",null,values);
db.close();
return true;
}
public boolean deleteuser(String Ac)
{
db = sbh.getReadableDatabase();
//删除语句
db.delete("user","acconut=?", new String[]{Ac});
db.close();
return true;
}
}
2、litepal litepal是开源的Android数据库框架,对平时用到的数据库功能进行封装,使得不用编写SQL语句就可以完成各种建立表格,增删改查等操作。
使用litepal之前需要对module进行配置:
(1)在配置文件.gradle中配置依赖:compile ‘org.litepal.android:core:1.4.1’
(2)配置litepal.xml:在assert文件夹下(若没有该文件夹,通过右击module目录–>New–>Directory创建)新建一个litepal.xml文件,编写如下内容:(具体意义看注释)
<litepal>
<dbname value="Bookbean" >dbname>
<version value="1" >version>
<list>
<mapping
class = "com.example.litepaltest.book">mapping>
list>
litepal>
(3)修改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">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
intent-filter>
activity>
application>
manifest>
到此就已经配置好litepal环境,接下来使用litepal。
litepal使用LitePal.getDatabase()即可创建一个数据表,数据表名即是litepal.xml中的
package com.example.litepaltest;
import org.litepal.crud.DataSupport;
/**
* 让book bean 类继承DataSupport,以能够进行ARUD操作。
*/
public class book extends DataSupport{
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 getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setAuthor(String author) {
this.author = author;
}
public double getPrice() {
return price;
}
public void setPages(int pages) {
this.pages = pages;
}
public void setPrice(double price) {
this.price = price;
}
public int getPages() {
return pages;
}
public String getAuthor() {
return author;
}
}
通过getDatabase建立表才能开始操作数据表。
LitePal.getDatabase();
(1)添加数据操作:定义一个addData方法,里面新建一个book对象,将各自的数据元set设置初始化,最后调用save提交,将数据写入数据库表中。
public void addData()
{
book bookbean = new book();
bookbean.setAuthor("vincent");
bookbean.setId(10);
bookbean.setName("litepal");
bookbean.setPages(450);
bookbean.setPrice(20);
bookbean.save();
}
(2)更改数据表中已存在的数据:
创建实例后,通过setPrice和setId方法来更新数据, 最后调用updateAll方法来执行更新操作。这里的updateAll指定了限制条件,和database中的where指定条件类似,不指定的时候表示更新所有的数据。但如果想将所有数据复位为默认值,需要调用setDefault来设置。如下。
/*
* 注:这里要注意,创建实例后,说有数据库的数据成员都已经被
* 默认设置为默认值,比如id默认是0,name默认是null等,
* 如果想把某个字段设置为默认值,使用set方法不能起到作用,
* 因为本身默认字段就是想设置的值,可以通过调用
* book bookbean = new book();
* book.setDefault("id");
* book.updateAll();
* 这样所有书的id都被更新为0了,所有书是因为updateAll里面没有指定
* 约束的条目。
* */
public void updataData()
{
book bookbean = new book();
bookbean.setPrice(13.33);
bookbean.setId(1);
bookbean.updateAll("name = ? and author = ?","The Lost Symbol","Dan Brown");
}
(3)删除数据操作:使用deleteAll,指定数据表名和后面两个约束条件,如下,删除所有价格低于15元的数据。如果不指定则表示删除所有的数据。
/*使用litepal删除数据
* */
public void deleteData()
{
//删除所有价格低于15的书
DataSupport.deleteAll(book.class,"price","15");
}
(4)查询数据操作:
/*使用litepal查询数据
* findAll查询所有
* findFirst查询第一条
* findLast查询最后一条
* select:指定查询那几列数据,例如下面例子指查询name和author两列数据
* List list = DataSupport.select("name","author").find(book.class);
* where方法:指定查询约束条件,例如查询页数大于400的书
* List list = DataSupport.where("page>?","400").find(book.class);
* order方法:指定结果的排序方式,例如将查询结果按照价格高到低排序
* List list = DataSupport.order("price desc").find(book.class);
* limit方法:指定查询结果数量,例如只查询表中的前三条数据
* List list = DataSupport.limit(3).find(book.class);
* offset方法:指定查询结果的偏移量,例如查询第2、3、4条
* List list = DataSupport.limit(3).offset(1).find(book.class);
* 可以对着5个方法连缀使用:
* List list = DataSupport.select("name","author","pages")
* .where("pages>?","400")
* .order("price desc")
* .limit(10)
* .find(book.class);
* */
public void queryData()
{
List list = DataSupport.findAll(book.class);
for (book b:list)
{
Log.e("tag","b :"+b.toString());
}
}
同时,litepal还支持连缀使用:
List books = DataSupport.select("name","author","pages")
.where("pages>?","100")
.limit(10)
.order("pages")
.find(book.class);
当然,党litepal提供的接口不能满足我们的需求是,也可以使用原生的SQL语句来操作:
Cursor cursor = DataSupport.findBySQL("select * from book where id >?and name = ?","2","harry");
...
...
...
关于数据库的操作使用就到此。
附:############本次deamon########: