Android数据库框架-Archiver(LiteOrm)的简单使用(一)
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;
-
-
-
-
-
-
-
- public class BaseModel implements Serializable {
-
- private static final long serialVersionUID = 1L;
-
-
- @PrimaryKey(AssignType.AUTO_INCREMENT)
-
- @Column("_id")
- public int id;
-
-
- @Check("description NOT NULL")
- public String description = "字段描述";
-
- @Ignore
- private String ignore = "标记Ignore,并不会出现在数据库中";
-
- @Override
- public String toString() {
- return "BaseModel{" + "description='" + description + '\'' + '}';
- }
- }
这是建立的一个顶层的Model父类,这里处理所有Model类都共有的字段,比如数据库的“_id”字段这些等等
然后我们还需要一个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;
-
-
-
-
-
-
-
-
- @Table("user_table")
- public class Users extends BaseModel {
- private static final long serialVersionUID = 1L;
-
- @NotNull
- private String userName;
-
-
- @Check("userSex >= 0 AND userSex < 3")
-
- @Default("2")
- private int userSex;
-
-
- @Unique
- @NotNull
- private String userPhone;
-
- private String userEmail;
-
-
-
-
-
-
-
-
-
- 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;
- }
- }
什么get、set方法都不用多说了吧,这里提供了两个构造方法,一个有参一个无参,有参的就绑定数据了,无参的就创建对象的引用,先不绑定数据,各有用处吧。
@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;
- }
-
-
-
-
-
-
- public void onClick(View v) {
- managerDB(v.getId());
- }
-
-
-
-
-
-
- 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:
-
-
-
- <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);
-
- userDatas.get(0).setUserName("小白杨");
-
- mainDB.update(userDatas.get(0));
- break;
- case R.id.button5:
-
-
- 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();
-
- }
- }
这里的界面布局是六个按钮组成的,onClick是布局中设置的点击事件监听方法,采用子线程的方式来更新数据库,当然了,这里就没有对线程进行优化,这不是重点。
重点是:代码中没有给全操作方法,当然了,一眼就能看出来,是不是呢?嘻嘻
那么就请看补充:
1.在删除数据的时候,我们只是说明了删除从某到某的数据
那么,我们如果要删除指定字段的数据呢?要删除全部数据呢?
-
- Users user = new Users();
- user.setUserID(1);
- mainDB.delete(user);
-
- mainDB.deleteAll(Users.class);
这样就好了,没错!
2.修改数据,上面小编也只是说了从数据库中查询出来,然后根据查询回来的数据进行修改,当然了,也可以得到判断ID,进行指定的数据修改,不过上面的方式
这样做的话, 显得太力不从心了。所以,那么有没有直接点的方法呢?能不能更新指定数据的指定字段,指定数据的全部数据呢?
结果是:
-
- Users u1 = new Users();
- u1.setUserID(10);
-
- ColumnsValue cv = new ColumnsValue(new String[] { "userName" },
- new Object[] { "大白杨" });
-
- mainDB.update(u1, cv,ConflictAlgorithm.Replace);
-
-
- u1.setUserPhone("188888888");
- u1.setUserName("小白杨");
- mainDB.update(u1, ConflictAlgorithm.Fail);
-
-
没错,你看到的结果就是小编所说的那样。嘻嘻
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包)