初步掌握ORMLite的使用

来源:互联网 发布:知天命是几岁 编辑:程序博客网 时间:2024/04/28 20:36

我们一般在android开发中都是使用SQLIte进行数据库操作。你要告诉我不会SQL怎么办?没关系,现在教你一个新的方式,使用关系型数据库———ORMLite

ORMlite与数据库之间的映射关系通过注解来说明

先看看配置方面,去ormlite官网下载相关jar
这里写图片描述

现在最新版本是4.49,我们需要core.jar与android.jar就可以了,然后配置在我们的项目中

这里写图片描述

这样就配置结束了,我们开始码字了

1

首先配置好对象

@DatabaseTable(tableName = "user")public class User {    @DatabaseField(generatedId = true)    int id;    @DatabaseField(columnName = "name")    String name;    @DatabaseField(columnName = "age")    String age;    @DatabaseField(columnName = "sex")    String sex;    public User() {    }    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 String getAge() {        return age;    }    public void setAge(String age) {        this.age = age;    }    public String getSex() {        return sex;    }    public void setSex(String sex) {        this.sex = sex;    }}

从字面上很好理解其中的意思,我们定义了一个User这张表,里面有4个字段,分别是主键idnameagesex 三个字段

2

创建好表对象之后,我们就要创建这个表了。我们一般情况下是继承SQLiteOpenHelper,这边也差不多,只不过多了OrmLite字符串而已——OrmLiteSqliteOpenHelper

public class DB extends OrmLiteSqliteOpenHelper {    final static String databaseName="demo.db";    final static int databaseVersion=1;    static DB instance=null;    private DB(Context context) {        super(context, databaseName, null, databaseVersion);    }    @Override    public void onCreate(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource) {        try {            TableUtils.createTableIfNotExists(connectionSource, User.class);        } catch (SQLException e) {            e.printStackTrace();        }    }    @Override    public void onUpgrade(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource, int i, int i1) {    }    public static synchronized DB getInstance(Context context) {        if (instance==null) {            synchronized (DB.class) {                if (instance==null) {                    instance=new DB(context);                }            }        }        return instance;    }}

这样我们就创建好表了,以及提供一个获取helper对象的单例方法

3

接下来我们要往其中添加数据,在单独一个Dao里面

public class UserDao {    Dao<User, Integer> dao=null;    public UserDao(Context context) {        try {            dao=DB.getInstance(context).getDao(User.class);        } catch (SQLException e) {            e.printStackTrace();        }    }    public void add(User user) {        try {            dao.create(user);        } catch (SQLException e) {            e.printStackTrace();        }    }}

一句话添加数据,是不是很简单dao.create(user);

4

接下来测试了,我们先添加10条数据

UserDao dao=new UserDao(this);for (int i=0;i<10;i++) {    User user=new User();    user.setName("random" + new Random().nextInt(10));    user.setAge("" + new Random().nextInt(30));    user.setSex(""+new Random().nextInt(2));    dao.add(user);}

用REExplorer查看结果
这里写图片描述
10条数据顺利的添加进来了

5

现在再来测试下查询

public void queryAll() {    try {        ArrayList<User> users= (ArrayList<User>) dao.queryForAll();        for (int i=0;i<users.size();i++) {            User user=users.get(i);            System.out.println("name:"+user.getName()+" sex:"+user.getSex()+" age:"+user.getAge());        }    } catch (SQLException e) {        e.printStackTrace();    }}

看看结果
这里写图片描述
没问题

6

再来试试更新数据

public void updateOne(ContentValues cv, int age) {    UpdateBuilder<User, Integer> updateBuilder=dao.updateBuilder();    try {        updateBuilder.where().eq("age", age);        Iterator it=cv.keySet().iterator();        while (it.hasNext()) {            String key= (String) it.next();            String value= (String) cv.get(key);            updateBuilder.updateColumnValue(key, value);        }        updateBuilder.update();    } catch (SQLException e) {        e.printStackTrace();    }}

这边有几个注意的地方,一个是updateBuilder.where().eq("age", age);这句话相当于sql中where age=’xxxx’,然后遍历一下contentValues,然后用updateColumnValue方法更新,最后再update一下

ContentValues cv=new ContentValues();cv.put("sex", "1");dao.updateOne(cv, 4);

仅仅修改age为4的那条记录的sex为1
这里写图片描述
修改成功

7

再来试试删除

public void delete(int age) {    DeleteBuilder builder=dao.deleteBuilder();    try {        builder.where().eq("age", age);        builder.delete();    } catch (SQLException e) {        e.printStackTrace();    }}

这边同更新一样,有个deleteBuilder对象提供where的能力

我们删除年龄为29的那条记录 dao.delete(29);

这里写图片描述
ok,记录没了

8

再多试试几个方法

根据条件查询

public void queryOne(int age) {    HashMap<String, Object> map=new HashMap<>();    map.put("age", ""+age);    ArrayList<User> users=null;    try {        users= (ArrayList<User>) dao.queryForFieldValues(map);    } catch (SQLException e) {        e.printStackTrace();    }    for (int i=0;i<users.size();i++) {        User user=users.get(i);        System.out.println("name:"+user.getName()+" sex:"+user.getSex()+" age:"+user.getAge());    }}

查询年龄为22岁的 dao.queryOne(22)

正确返回1条记录
这里写图片描述

9

最后我们试一下多表查询,刚才我们是创建了user,现在我们要给每个人设置一个权限,比如某几个id的user才有权限做什么事情,那么我们依葫芦画瓢创建一个权限表Authority,比较重要的地方在于设置外键部分

@DatabaseField (columnName = "user_id", canBeNull = true, foreign = true)public User user;

虽然设置了User对象,但是实际上也就是user中的id被存进了数据库中,关联的时候就是这个Authority中的user对象的id跟User表中的id去做关联

public void getQuery(Context context) {    try {        ArrayList<Authority> authorities= (ArrayList<Authority>) dao.queryForAll();        for (int i=0;i<authorities.size();i++) {            Authority authority=authorities.get(i);            if (DB.getInstance(context).getDao(User.class).refresh(authority.getUser())==1) {                System.out.println(authority.getUser().getName());            }        }    } catch (SQLException e) {        e.printStackTrace();    }}

这边简单的分析以下,我们首先遍历表里面所有的Authority对象,然后去User表里面查,发现Authority中user_id与User中id相同,那么就匹配上了

好了,今天的介绍到此为止,如有问题,请留言,咱们一起研究。

0 0
原创粉丝点击