初步掌握ORMLite的使用

我们一般在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相同,那么就匹配上了

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

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页