我们一般在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个字段,分别是主键id
, name
,age
,sex
三个字段
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相同,那么就匹配上了
好了,今天的介绍到此为止,如有问题,请留言,咱们一起研究。