Android数据存储之数据库(SQLite和litepal)

Android数据存储之数据库(SQlite和litepal)

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<user_message> queryuser()
    {
        List<user_message> 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文件,编写如下内容:(具体意义看注释)

<?xml version="1.0" encoding="utf-8"?>
<litepal>
    <!--数据表名-->
    <dbname value="Bookbean" ></dbname>
<!--这里版本号的值用来控制数据得升级备份,在原来的数据基础上修改而不会删除原来的数据-->
    <version value="1" ></version>
    <list><!--使用mapping标签来声明我们要配置的映射模型类-->
        <mapping
        class = "com.example.litepaltest.book"></mapping>
    </list>
</litepal>

(3)修改AndroidManifest.xml文件:在该文件的

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.litepaltest">
<!--将项目的application配置为org.litepal.LitePalApplication-->
    <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<book> list = DataSupport.select("name","author").find(book.class);
    * where方法:指定查询约束条件,例如查询页数大于400的书
    *         List<book> list = DataSupport.where("page>?","400").find(book.class);
    *  order方法:指定结果的排序方式,例如将查询结果按照价格高到低排序
    *         List<book> list = DataSupport.order("price desc").find(book.class);
    * limit方法:指定查询结果数量,例如只查询表中的前三条数据
    *         List<book> list = DataSupport.limit(3).find(book.class);
    * offset方法:指定查询结果的偏移量,例如查询第234条
    *         List<book> list = DataSupport.limit(3).offset(1).find(book.class);
    * 可以对着5个方法连缀使用:
    *         List<book> list = DataSupport.select("name","author","pages")
    *                                      .where("pages>?","400")
    *                                      .order("price desc")
    *                                      .limit(10)
    *                                      .find(book.class);
    * */
    public void queryData()
    {
        List<book> list = DataSupport.findAll(book.class);
        for (book b:list)
        {
            Log.e("tag","b :"+b.toString());
        }
    }

同时,litepal还支持连缀使用:

 List<book> 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########

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值