Android系统为开发者提供了SQLiteOpenHelper帮助类来操作数据库,当然了,系统也封装得比较好了,不过今日我们来看看其他的数据库框架。
开源地址:https://github.com/litesuits/android-lite-orm 在此要先感谢作者,作者的个人主页:http://litesuits.com
小编只提供自己的使用,当然,也是从作者提供的demo中分化而来的,目前小编的所使用的数据库还没有很繁琐,就简单的单表增删改查等等
开始:
不闹了,先上几张图片看看效果好了(只提供了部分效果):
- package com.napoleonbai.android.model;
- import java.io.Serializable;
- import com.litesuits.orm.db.annotation.Check;
- import com.litesuits.orm.db.annotation.Column;
- import com.litesuits.orm.db.annotation.Ignore;
- import com.litesuits.orm.db.annotation.PrimaryKey;
- import com.litesuits.orm.db.annotation.PrimaryKey.AssignType;
- /**
- * 所有Model的顶层父类
- *
- * @author NapoleonBai
- *
- */
- public class BaseModel implements Serializable {
- private static final long serialVersionUID = 1L;
- // 设置为主键,自增
- @PrimaryKey(AssignType.AUTO_INCREMENT)
- // 取名为“_id”,如果此处不重新命名,就采用属性名称
- @Column("_id")
- public int id;
- // @Check条件检测
- @Check("description NOT NULL")
- public String description = "字段描述";
- @Ignore
- private String ignore = "标记Ignore,并不会出现在数据库中";
- @Override
- public String toString() {
- return "BaseModel{" + "description='" + description + '\'' + '}';
- }
- }
然后我们还需要一个Model类,暂时我们用Users来替代
- package com.napoleonbai.android.model;
- import com.litesuits.orm.db.annotation.Check;
- import com.litesuits.orm.db.annotation.Default;
- import com.litesuits.orm.db.annotation.NotNull;
- import com.litesuits.orm.db.annotation.Table;
- import com.litesuits.orm.db.annotation.Unique;
- /**
- * 用户信息类
- *
- * @author NapoleonBai
- *
- */
- // 创建一个名为user_table的表格
- @Table("user_table")
- public class Users extends BaseModel {
- private static final long serialVersionUID = 1L;
- // 非空约束 形同于@Check("userName NOT NULL")
- @NotNull
- private String userName;
- // 性别用 0 - 1 - 2替代,0=男,1=女,2=未知
- @Check("userSex >= 0 AND userSex < 3")
- // 设置默认值
- @Default("2")
- private int userSex;
- // 唯一键约束
- @Unique
- @NotNull
- private String userPhone;
- private String userEmail;
- /**
- * 构造方法,传入数据
- *
- * @param name
- * @param sex
- * @param phone
- * @param email
- */
- public Users(String name, int sex, String phone, String email) {
- this.userName = name;
- this.userSex = sex;
- this.userEmail = email;
- this.userPhone = phone;
- }
- public Users() {
- }
- public String getUserName() {
- return userName;
- }
- public void setUserName(String userName) {
- this.userName = userName;
- }
- public int getUserSex() {
- return userSex;
- }
- public void setUserSex(int userSex) {
- this.userSex = userSex;
- }
- public String getUserPhone() {
- return userPhone;
- }
- public void setUserPhone(String userPhone) {
- this.userPhone = userPhone;
- }
- public String getUserEmail() {
- return userEmail;
- }
- public void setUserEmail(String userEmail) {
- this.userEmail = userEmail;
- }
- public void setUserID(int id) {
- super.id = id;
- }
- }
@Table是指点表名,后面的@Check这些都类似,都是Archiver(LiteOrm)框架提供的,如需深入了解,请查看源码就好。
然后就看操作类了
- package com.napoleonbai.android.archiver;
- import java.util.ArrayList;
- import com.litesuits.android.log.Log;
- import com.litesuits.orm.LiteOrm;
- import com.litesuits.orm.db.DataBase;
- import com.litesuits.orm.db.assit.QueryBuilder;
- import com.litesuits.orm.db.model.ColumnsValue;
- import com.litesuits.orm.db.model.ConflictAlgorithm;
- import com.napoleonbai.android.model.Users;
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.Menu;
- import android.view.View;
- public class MainActivity extends Activity {
- /** 数据库引用对象 */
- private DataBase mainDB;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.main, menu);
- return true;
- }
- /**
- * 按钮事件的监听
- *
- * @param v
- */
- public void onClick(View v) {
- managerDB(v.getId());
- }
- /**
- * 执行数据库操作
- *
- * @param v
- */
- private void managerDB(final int id) {
- new Thread(new Runnable() {
- @Override
- public void run() {
- switch (id) {
- case R.id.button1:
- // 创建数据库
- if (mainDB == null) {
- // 创建数据库,传入当前上下文对象和数据库名称
- mainDB = LiteOrm.newInstance(MainActivity.this,
- "napoleonbai.db");
- }
- break;
- case R.id.button2:
- // 新增数据
- Users mUser = new Users("NapoleonBai"
- + Thread.currentThread().getId(), 1, "1688888"
- + Thread.currentThread().getId(),
- "napoleonbaiandroid@gmail.com");
- mainDB.save(mUser);
- break;
- case R.id.button3:
- // 删除指定数据
- // 删除第2到第5条 ,换句话说就是删除第二、三、四、五条数据
- // 最后一个参数可为null,默认按ID升序排列
- <span style="white-space:pre"> </span> mainDB.delete(Users.class, 2, 5, "_id");
- break;
- case R.id.button4:
- // 修改数据
- // 查询得到全部数据
- ArrayList<Users> userDatas = mainDB.queryAll(Users.class);
- // 设置第一个数据的Name
- userDatas.get(0).setUserName("小白杨");
- // 修改数据
- mainDB.update(userDatas.get(0));
- break;
- case R.id.button5:
- // 查询一条数据
- //指定查询ID和查询对象
- Users u2=mainDB.queryById(11,Users.class);
- Log.i("data",u2.getUserName());
- break;
- case R.id.button6:
- // 查询全部数据
- ArrayList<Users> datas = mainDB.queryAll(Users.class);
- //得到数据库中有多少条数据
- Log.i("data", datas.size());
- break;
- default:
- break;
- }
- }
- }).start();
- }
- }
重点是:代码中没有给全操作方法,当然了,一眼就能看出来,是不是呢?嘻嘻
那么就请看补充:
1.在删除数据的时候,我们只是说明了删除从某到某的数据
那么,我们如果要删除指定字段的数据呢?要删除全部数据呢?
- // 删除某个对象(类似于删除某条数据,比如按照ID删除)
- Users user = new Users();
- user.setUserID(1);
- mainDB.delete(user);
- // 当然,删除全部数据,就只需要使用
- mainDB.deleteAll(Users.class);
2.修改数据,上面小编也只是说了从数据库中查询出来,然后根据查询回来的数据进行修改,当然了,也可以得到判断ID,进行指定的数据修改,不过上面的方式
这样做的话, 显得太力不从心了。所以,那么有没有直接点的方法呢?能不能更新指定数据的指定字段,指定数据的全部数据呢?
结果是:
- //修改指定ID的指定字段数据
- Users u1 = new Users();
- u1.setUserID(10);
- //更改userName字段的数据
- ColumnsValue cv = new ColumnsValue(new String[] { "userName" },
- new Object[] { "大白杨" });
- //仅能在已经存在时更新:ConflictAlgorithm.Replace
- mainDB.update(u1, cv,ConflictAlgorithm.Replace);
- //更新指定ID所有数据
- u1.setUserPhone("188888888");
- u1.setUserName("小白杨");
- mainDB.update(u1, ConflictAlgorithm.Fail);
- //当然了,save也可以用来修改数据,类似于更改指定ID的所有数据
没错,你看到的结果就是小编所说的那样。嘻嘻
3.查询所有数据,上面也提到了获取所有数据,当然也可以判断数据库中到底有多少条数据。
但是很多时候我们只需要判断有多少条数据,并不用取出所有数据,那么有没有方法完成呢?
而且,我们能不能进行模糊查询,按条件查询呢?
恭喜,这些都有!
- //如果这样去获取数据库中有多少条数据,是不是有点蠢呢?嘻嘻
- //有提供这样的方法:
- long count = mainDB.queryCount(Users.class);
- Log.i("data", count);
- //那么,如果想要按照条件查询呢?
- //请看如下:
- QueryBuilder qb = new QueryBuilder(Users.class)
- .columns(new String[] { "_id" })
- .appendOrderAscBy("_id")
- .appendOrderDescBy("userPhone")
- .distinct(true)
- .where("userName" + " like ?",
- new String[] { "%杨" });
- count = mainDB.queryCount(qb);
- Log.i("data", "查询出UserName中带\"杨\"字的共有"+count+"条");
到这里,单表操作也就算完成得差不多了,最后,在退出、或者不使用数据库的时候,关闭数据库释放内存就好了
- <span style="white-space:pre"> </span>mainDB.close();
我们下期再见,谢谢
哦,提供jar下载:http://download.csdn.net/detail/napoleonbai/8265407(使用的框架jar包)