安卓ORM框架之activeandroid
最近由于项目需要,需要用到手机本地数据库,本来打算自己实现SQLiteOpenHelper来自己写,但后来被sql语句打败。我就搜索了下关于数据库框架,便找到了activeandroid,自己学习了下,感觉不错。该框架使用简单方便,易操作,而且该创建的表的bean跟一般使用的bean对象没有太大差别,几乎看不到SQL语句,对SQL语句比较薄弱的开发人员,开发帮助比较大。于是小弟不敢独享,简单的写了一个demo特来分享,望有什么理解错误的地方,还往大神多多指点。
jar包的下载地址:https://github.com/pardom/ActiveAndroid
1.配置数据库
把jar包导入到/libs目录下,在/AndroidManifest.xml文件下的application标签下配置数据库的名称和版本号:
<meta-data
android:name="AA_DB_NAME"
android:value="subscridera.db" />
<meta-data
android:name="AA_DB_VERSION"
android:value="1" />
注意:当表结构有修改时一定记得要升级数据库的版本号。
2.对数据库进行一个绑定
在你的MyApplication中做如下操作(一定要记得把你的MyApplication 在AndroidManifest.xml下声明):
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// 绑定数据库
ActiveAndroid.initialize(this);
}
}
注意:一定记得在配置文件下声明该MyApplication.
3.创建数据表
以bean对象的加注解的格式,创建出表和表的字段
@Table(name = “subscr”):是你要创建表的名字
@Column(name = “tid”):是你要创建的字段的名字也可做表关联,另外一个表设置为该表的一个字段即可。
import java.io.Serializable;
import com.activeandroid.Model;
import com.activeandroid.annotation.Column;
import com.activeandroid.annotation.Table;
//创建的表名
@Table(name="subscr")
public class Subscriber extends Model implements Serializable{
//无产构造,一定要写
public Subscriber() {
super();
}
//表字段
@Column(name="name")
private String name;
@Column(name="age")
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Subscriber [name=" + name + ", age=" + age + "]";
}
}
注意:无参构造一定要写,不然有可能会报错
4.查看数据库是否创建成功:
上面几部完成后,数据库以及数据表和字段应该就创建好了。你可以去/data/data/该项目的包名/databases目录下找到该数据库,导出查看是否成功创建(模拟器是可以直接访问该目录的,真机需要root权限)。如果没有成功请在检查上面几部是否有什么遗漏或是配置出错的地方。
5.上面几部完成,数据库已经创建好了,让咱对其进行操作吧。
import java.util.List;
import com.activeandroid.query.Select;
import android.os.Bundle;
import android.app.Activity;
public class MainActivity extends Activity {
private Subscriber sub;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initAdd();
initquery();
initReplace();
//initDelet();
}
/**
* 添加
* 创建bean对象,添加数据,
* 然后使用save把数据添加到数据库中
*/
private void initAdd() {
for (int i = 0; i < 5; i++) {
sub = new Subscriber();
sub.setName("name" + i);
sub.setAge(i + 10);
sub.save();
}
}
/**
* 删除
* 先查询所有然后一条一条删除
* 或是按查找出来的结果进行删除
* 批处理不知道该怎么搞,
* 有知道的大神告诉下,O(∩_∩)O谢谢
*/
private void initDelet() {
// 先查询在通过遍历删除,批处理不知道怎么搞要,删除某条同理,查询出来,删除掉
List<Subscriber> list4 = new Select().from(Subscriber.class).execute();
for (int i = 0; i < list4.size(); i++) {
list4.get(i).delete();
}
}
/**
* 查询
* 可以查询所有,查询的结果是一个集合
* 也可以按条件查询
*/
private void initquery() {
// 查询所有,得到一个结果集合
List<Subscriber> list1 = new Select().from(Subscriber.class).execute();
ergodic(list1, "list1");
// 条件查询
List<Subscriber> list2 = new Select().from(Subscriber.class)
.where("age=?", "12").execute();
ergodic(list2, "list2");
}
/**
* 替换 先查询出要替换的对象,然后进行替换
* 如果要操作的行存在那么save操作就是替换了。
*/
private void initReplace() {
List<Subscriber> list3 = new Select().from(Subscriber.class)
.where("age=?", "12").execute();
for (int i = 0; i < list3.size(); i++) {
list3.get(i).setAge(100);
list3.get(i).save();
}
}
// 遍历输出
private void ergodic(List<Subscriber> list, String str) {
for (int i = 0; i < list.size(); i++) {
System.out.println(str + "_" + i + ":" + list.get(i).toString());
}
}
}
补充:
该创建的表的bean跟一般使用的bean对象没有太大差别;但是要注意的是,如果你是如果你是使用Gson来解析数据的话,查询得到的集合,在转为json字符串时,会报错:“java.lang.UnsupportedOperationException: Attempted to serialize java.lang.Class: [your model]. Forgot to register a type adapter?”,这是由于ActiveAndroid框架需要模型继承com.activeandroid.Model类,而这个类貌似不能序列化,你需要让bean类实现Serializable序列化接口,并创建序列化器,在Gson解析的时候,Gson gson=new GsonBuilder().setExclusionStrategies(new SpecificClassExclusionStrate(null,com.activeandroid.Model.class)).create();然后在进行解析转换为json字符串。
关于该Gson问题详情可以查看:http://www.cnblogs.com/i0air/p/3723474.html