(4.2.9.1) Android数据库框架-Archiver(LiteOrm)的简单使用(一)

Android系统为开发者提供了SQLiteOpenHelper帮助类来操作数据库,当然了,系统也封装得比较好了,不过今日我们来看看其他的数据库框架。

开源地址:https://github.com/litesuits/android-lite-orm  在此要先感谢作者,作者的个人主页:http://litesuits.com

小编只提供自己的使用,当然,也是从作者提供的demo中分化而来的,目前小编的所使用的数据库还没有很繁琐,就简单的单表增删改查等等

开始:

不闹了,先上几张图片看看效果好了(只提供了部分效果):





[java]  view plain  copy
  1. package com.napoleonbai.android.model;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. import com.litesuits.orm.db.annotation.Check;  
  6. import com.litesuits.orm.db.annotation.Column;  
  7. import com.litesuits.orm.db.annotation.Ignore;  
  8. import com.litesuits.orm.db.annotation.PrimaryKey;  
  9. import com.litesuits.orm.db.annotation.PrimaryKey.AssignType;  
  10.   
  11. /** 
  12.  * 所有Model的顶层父类 
  13.  *  
  14.  * @author NapoleonBai 
  15.  * 
  16.  */  
  17. public class BaseModel implements Serializable {  
  18.   
  19.     private static final long serialVersionUID = 1L;  
  20.   
  21.     // 设置为主键,自增  
  22.     @PrimaryKey(AssignType.AUTO_INCREMENT)  
  23.     // 取名为“_id”,如果此处不重新命名,就采用属性名称  
  24.     @Column("_id")  
  25.     public int id;  
  26.   
  27.     // @Check条件检测  
  28.     @Check("description NOT NULL")  
  29.     public String description = "字段描述";  
  30.   
  31.     @Ignore  
  32.     private String ignore = "标记Ignore,并不会出现在数据库中";  
  33.   
  34.     @Override  
  35.     public String toString() {  
  36.         return "BaseModel{" + "description='" + description + '\'' + '}';  
  37.     }  
  38. }  
这是建立的一个顶层的Model父类,这里处理所有Model类都共有的字段,比如数据库的“_id”字段这些等等

然后我们还需要一个Model类,暂时我们用Users来替代

[java]  view plain  copy
  1. package com.napoleonbai.android.model;  
  2.   
  3. import com.litesuits.orm.db.annotation.Check;  
  4. import com.litesuits.orm.db.annotation.Default;  
  5. import com.litesuits.orm.db.annotation.NotNull;  
  6. import com.litesuits.orm.db.annotation.Table;  
  7. import com.litesuits.orm.db.annotation.Unique;  
  8.   
  9. /** 
  10.  * 用户信息类 
  11.  *  
  12.  * @author NapoleonBai 
  13.  * 
  14.  */  
  15. // 创建一个名为user_table的表格  
  16. @Table("user_table")  
  17. public class Users extends BaseModel {  
  18.     private static final long serialVersionUID = 1L;  
  19.     // 非空约束 形同于@Check("userName NOT NULL")  
  20.     @NotNull  
  21.     private String userName;  
  22.   
  23.     // 性别用 0 - 1 - 2替代,0=男,1=女,2=未知  
  24.     @Check("userSex >= 0 AND userSex < 3")  
  25.     // 设置默认值  
  26.     @Default("2")  
  27.     private int userSex;  
  28.   
  29.     // 唯一键约束  
  30.     @Unique  
  31.     @NotNull  
  32.     private String userPhone;  
  33.   
  34.     private String userEmail;  
  35.   
  36.     /** 
  37.      * 构造方法,传入数据 
  38.      *  
  39.      * @param name 
  40.      * @param sex 
  41.      * @param phone 
  42.      * @param email 
  43.      */  
  44.     public Users(String name, int sex, String phone, String email) {  
  45.         this.userName = name;  
  46.         this.userSex = sex;  
  47.         this.userEmail = email;  
  48.         this.userPhone = phone;  
  49.     }  
  50.   
  51.     public Users() {  
  52.     }  
  53.   
  54.     public String getUserName() {  
  55.         return userName;  
  56.     }  
  57.   
  58.     public void setUserName(String userName) {  
  59.         this.userName = userName;  
  60.     }  
  61.   
  62.     public int getUserSex() {  
  63.         return userSex;  
  64.     }  
  65.   
  66.     public void setUserSex(int userSex) {  
  67.         this.userSex = userSex;  
  68.     }  
  69.   
  70.     public String getUserPhone() {  
  71.         return userPhone;  
  72.     }  
  73.   
  74.     public void setUserPhone(String userPhone) {  
  75.         this.userPhone = userPhone;  
  76.     }  
  77.   
  78.     public String getUserEmail() {  
  79.         return userEmail;  
  80.     }  
  81.   
  82.     public void setUserEmail(String userEmail) {  
  83.         this.userEmail = userEmail;  
  84.     }  
  85.   
  86.     public void setUserID(int id) {  
  87.         super.id = id;  
  88.     }  
  89. }  
什么get、set方法都不用多说了吧,这里提供了两个构造方法,一个有参一个无参,有参的就绑定数据了,无参的就创建对象的引用,先不绑定数据,各有用处吧。

@Table是指点表名,后面的@Check这些都类似,都是Archiver(LiteOrm)框架提供的,如需深入了解,请查看源码就好。

然后就看操作类了

[java]  view plain  copy
  1. package com.napoleonbai.android.archiver;  
  2.   
  3. import java.util.ArrayList;  
  4.   
  5. import com.litesuits.android.log.Log;  
  6. import com.litesuits.orm.LiteOrm;  
  7. import com.litesuits.orm.db.DataBase;  
  8. import com.litesuits.orm.db.assit.QueryBuilder;  
  9. import com.litesuits.orm.db.model.ColumnsValue;  
  10. import com.litesuits.orm.db.model.ConflictAlgorithm;  
  11. import com.napoleonbai.android.model.Users;  
  12.   
  13. import android.app.Activity;  
  14. import android.os.Bundle;  
  15. import android.view.Menu;  
  16. import android.view.View;  
  17.   
  18. public class MainActivity extends Activity {  
  19.     /** 数据库引用对象 */  
  20.     private DataBase mainDB;  
  21.   
  22.     @Override  
  23.     protected void onCreate(Bundle savedInstanceState) {  
  24.         super.onCreate(savedInstanceState);  
  25.         setContentView(R.layout.activity_main);  
  26.     }  
  27.   
  28.     @Override  
  29.     public boolean onCreateOptionsMenu(Menu menu) {  
  30.         getMenuInflater().inflate(R.menu.main, menu);  
  31.         return true;  
  32.     }  
  33.   
  34.     /** 
  35.      * 按钮事件的监听 
  36.      *  
  37.      * @param v 
  38.      */  
  39.     public void onClick(View v) {  
  40.         managerDB(v.getId());  
  41.     }  
  42.   
  43.     /** 
  44.      * 执行数据库操作 
  45.      *  
  46.      * @param v 
  47.      */  
  48.     private void managerDB(final int id) {  
  49.         new Thread(new Runnable() {  
  50.             @Override  
  51.             public void run() {  
  52.                 switch (id) {  
  53.                 case R.id.button1:  
  54.                     // 创建数据库  
  55.                     if (mainDB == null) {  
  56.                         // 创建数据库,传入当前上下文对象和数据库名称  
  57.                         mainDB = LiteOrm.newInstance(MainActivity.this,  
  58.                                 "napoleonbai.db");  
  59.                     }  
  60.                     break;  
  61.                 case R.id.button2:  
  62.                     // 新增数据  
  63.                     Users mUser = new Users("NapoleonBai"  
  64.                             + Thread.currentThread().getId(), 1"1688888"  
  65.                             + Thread.currentThread().getId(),  
  66.                             "napoleonbaiandroid@gmail.com");  
  67.   
  68.                     mainDB.save(mUser);  
  69.                     break;  
  70.                 case R.id.button3:  
  71.                     // 删除指定数据  
  72.                     // 删除第2到第5条 ,换句话说就是删除第二、三、四、五条数据  
  73.                     // 最后一个参数可为null,默认按ID升序排列  
  74.                 <span style="white-space:pre">    </span> mainDB.delete(Users.class25"_id");  
  75.                     break;  
  76.                 case R.id.button4:  
  77.                     // 修改数据  
  78.   
  79.                     // 查询得到全部数据  
  80.                     ArrayList<Users> userDatas = mainDB.queryAll(Users.class);  
  81.                     // 设置第一个数据的Name  
  82.                     userDatas.get(0).setUserName("小白杨");  
  83.                     // 修改数据  
  84.                     mainDB.update(userDatas.get(0));  
  85.                     break;  
  86.                 case R.id.button5:  
  87.                     // 查询一条数据  
  88.                     //指定查询ID和查询对象  
  89.                     Users u2=mainDB.queryById(11,Users.class);  
  90.                     Log.i("data",u2.getUserName());  
  91.                     break;  
  92.                 case R.id.button6:  
  93.                     // 查询全部数据  
  94.                     ArrayList<Users> datas = mainDB.queryAll(Users.class);  
  95.                     //得到数据库中有多少条数据  
  96.                     Log.i("data", datas.size());  
  97.                     break;  
  98.                 default:  
  99.                     break;  
  100.                 }  
  101.             }  
  102.         }).start();  
  103.   
  104.     }  
  105. }  
这里的界面布局是六个按钮组成的,onClick是布局中设置的点击事件监听方法,采用子线程的方式来更新数据库,当然了,这里就没有对线程进行优化,这不是重点。

重点是:代码中没有给全操作方法,当然了,一眼就能看出来,是不是呢?嘻嘻

那么就请看补充:

1.在删除数据的时候,我们只是说明了删除从某到某的数据

那么,我们如果要删除指定字段的数据呢?要删除全部数据呢?

[java]  view plain  copy
  1. // 删除某个对象(类似于删除某条数据,比如按照ID删除)  
  2. Users user = new Users();  
  3. user.setUserID(1);  
  4. mainDB.delete(user);  
  5. // 当然,删除全部数据,就只需要使用  
  6.  mainDB.deleteAll(Users.class);  
这样就好了,没错!

2.修改数据,上面小编也只是说了从数据库中查询出来,然后根据查询回来的数据进行修改,当然了,也可以得到判断ID,进行指定的数据修改,不过上面的方式

这样做的话, 显得太力不从心了。所以,那么有没有直接点的方法呢?能不能更新指定数据的指定字段,指定数据的全部数据呢?

结果是:

[java]  view plain  copy
  1. //修改指定ID的指定字段数据  
  2.                     Users u1 = new Users();  
  3.                     u1.setUserID(10);  
  4.                     //更改userName字段的数据  
  5.                     ColumnsValue cv = new ColumnsValue(new String[] { "userName" },  
  6.                             new Object[] { "大白杨" });  
  7.                     //仅能在已经存在时更新:ConflictAlgorithm.Replace  
  8.                     mainDB.update(u1, cv,ConflictAlgorithm.Replace);  
  9.                       
  10.                     //更新指定ID所有数据  
  11.                     u1.setUserPhone("188888888");  
  12.                     u1.setUserName("小白杨");  
  13.                     mainDB.update(u1, ConflictAlgorithm.Fail);  
  14.                       
  15.                     //当然了,save也可以用来修改数据,类似于更改指定ID的所有数据  

没错,你看到的结果就是小编所说的那样。嘻嘻

3.查询所有数据,上面也提到了获取所有数据,当然也可以判断数据库中到底有多少条数据。

但是很多时候我们只需要判断有多少条数据,并不用取出所有数据,那么有没有方法完成呢?

而且,我们能不能进行模糊查询,按条件查询呢?

恭喜,这些都有!

[java]  view plain  copy
  1. //如果这样去获取数据库中有多少条数据,是不是有点蠢呢?嘻嘻  
  2.                     //有提供这样的方法:  
  3.                     long count = mainDB.queryCount(Users.class);  
  4.                       
  5.                     Log.i("data", count);  
  6.                       
  7.                     //那么,如果想要按照条件查询呢?  
  8.                     //请看如下:  
  9.                     QueryBuilder qb = new QueryBuilder(Users.class)  
  10.                     .columns(new String[] { "_id" })  
  11.                     .appendOrderAscBy("_id")  
  12.                     .appendOrderDescBy("userPhone")  
  13.                     .distinct(true)  
  14.                     .where("userName" + " like ?",  
  15.                             new String[] { "%杨" });  
  16.   
  17.                     count = mainDB.queryCount(qb);  
  18.                     Log.i("data""查询出UserName中带\"杨\"字的共有"+count+"条");  

到这里,单表操作也就算完成得差不多了,最后,在退出、或者不使用数据库的时候,关闭数据库释放内存就好了

[java]  view plain  copy
  1. <span style="white-space:pre">    </span>mainDB.close();  

我们下期再见,谢谢

哦,提供jar下载:http://download.csdn.net/detail/napoleonbai/8265407(使用的框架jar包)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值