首先创建Bean
package com.devchina.ormdemo;
import java.util.Date;
public class User {
private int id;
private String name;
private String email;
private Date registerDate;
private Double money;
/getter and setter 不能省略哦///
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 getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Date getRegisterDate() {
return registerDate;
}
public void setRegisterDate(Date registerDate) {
this.registerDate = registerDate;
}
public Double getMoney() {
return money;
}
public void setMoney(Double money) {
this.money = money;
}
}
在Bean创建完成之后,开始使用afinal.
package com.devchina.ormdemo;
import java.util.Date;
import java.util.List;
import net.tsz.afinal.FinalActivity;
import net.tsz.afinal.FinalDb;
import net.tsz.afinal.annotation.view.ViewInject;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
public class AfinalOrmDemoActivity extends FinalActivity {
@ViewInject(id=R.id.textView) TextView textView; //这里使用了afinal的ioc功能,以后将会讲到
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
FinalDb db = FinalDb.create(this);
User user = new User();
user.setEmail("afinal@tsz.net");
user.setName("探索者");
user.setRegisterDate(new Date());
db.save(user);
List<User> userList = db.findAll(User.class);//查询所有的用户
Log.e("AfinalOrmDemoActivity", "用户数量:"+ (userList!=null?userList.size():0));
textView.setText(userList.get(0).getName()+":"+user.getRegisterDate());
}
}
在finalDb中其封装的操作为创建数据库,创建表,然后自动查询返回结果。一切都是使用少量简单代码来实现的。
这时候,估计大家的疑问又起来了
afinal自动创建了数据库afinal.db,同时自动创建了表com_devchina_ormdemo_User。可是,我们不想创建数据库afinal.db,也不想让我们的表示com_devchina_ormdemo_User,那我们应该怎么办呢?
这一些呀,afinal都已经想好了。
接下来,我们来介绍下afinal的orm注解功能。
第一个,配置数据库中的表名 net.tsz.afinal.annotation.sqlite.Table,我们来给user,java配置一下:
package com.devchina.ormdemo;
import java.util.Date;
import net.tsz.afinal.annotation.sqlite.Table;
@Table(name=”user_test”)//设置这个表单的Table name
public class User {
private int id;
private String name;
private String email;
private Date registerDate;
private Double money;
/getter and setter///
//代码太长,略getter setter,开发中不能省略
}
由此,我们可以看出来,afinal又自动给我们创建了表user_test,但是要注意的是com_devchina_ormdemo_User这个表afinal并没有去删除,所以这里也要提醒下大家,我们在重新设计了类的结构或者属性的时候,先手动删除掉直接的数据,否则就会有垃圾数据保存在数据库里面,当然,不删除也可以,不会有任何的影响。
在上面的讲述中,细心的朋友可能会注意到了一个问题,afinal自动把user的id的这个属性当做了主键。而且自动增长。
可是,可是在我们的开发过程中,我们的user可能没有id这个属性啊,可能是userId,或者又可能是其他我们喜欢的属性,那怎么办呢?
没有关系:afinal有给我们准备了另一个注解:net.tsz.afinal.annotation.sqlite.Id,通过这个,我们就可以给我们的实体类定义主键啦
afinal的主键机制是:
当给某个属性添加注解@id的时候,该属性就是主键(一个类中只有一个主键),保存在数据库中的列名为属性的名称,@Id(column=”userId”)给属性添加注解的时候,保存在数据库的列名是userId,当这个属性没有的时候,afinal自动回去该类查找_id属性,_id属性也没有的时候,afinal就会自动去查找id属性。如果连id属性也没有,那么afinal就报错啦,afinal的orm规则中,表示必须有主键的,而且只能有一个(目前暂时不支持复合主键)。
回到刚才的问题,afinal给我们自动创建数据库afinal.db,可是,我们不想创建让数据库名是afinal.db,那怎么办呢?
afinal的创建时候有多个方法的重载。
补充:
1.FinalDb是一个单例对象,即不管使用哪个create对象都会得到单一的FinalDb对象,不会重复创建。
2. 查看save方法源码,可以得知,在进行数据插入之前会进行表的存在性判断,如果不存在则会先创建表后,再行插入数据。
原码为
public void save(Object entity)
{
checkTableExist(Object entity.getClass());
exeSqlInfo(SqlBuilder.builInsertSql(entity));
}
3.默认创建的表名为:packageName_db_BeanName
4.拿到afinal对象FinalDb db = FinalDb.create(MainDBActivity.this, “user.db”);
5.进行删除
// db.delete(user); //根据对象主键进行删除
// db.deleteById(user, 1); //根据主键删除数据
// db.deleteByWhere(User.class, “name=AoTuMan”); //自定义where条件删除
db.deleteAll(User.class); //删除Bean对应的数据表中的所有数据
6.数据查询
String searchKey = searchKeyET.getText().toString();
//拿到FinalDb对象引用
FinalDb db = FinalDb.create(MainDBActivity.this, “user.db”);
// 注意这里的”where”语句参数是没有where关键字的
List resultList = db.findAllByWhere(User.class, ” name=\”” + searchKey + “\”“);
// List resultList = db.findAll(User.class); //查找指定Bean的所有数据记录
StringBuilder _sb = new StringBuilder();
for(int i=0;i