Android快速开发--使用ORMLite操作数据库

OrmLite是一个数据库操作辅助的开源框架,主要面向Java语言。在Android面向数据库开发中,是一个比较流行的开源框架,方便操作而且功能强大,今天来学习一下,最近的项目中也有所涉及,写个博客来记一下吧,感谢大神团队贡献如此实用的开源框架, 

准备工作–创建数据库及数据表

ORMlite通过Java注解的方式来建立起与数据库的映射关系,在这里我们以一个实例来进行说明,如我们现在想要建立一个简单的数据库test.db并创建一张表person来记录一个人的名字,年龄,住址等等。

创建Bean类

首先,建立我们的Bean类Person,并通过注解的方式与数据库联系起来

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<code class = "hljs" java= "" > @DatabaseTable (tableName = person)
public class Person {
 
     @DatabaseField (generatedId= true )
     private int id;
     @DatabaseField (columnName=name)
     private String name;
     @DatabaseField (columnName=age)
     private int age;
     @DatabaseField (columnName=address)
     private String address;
     /**
      * @return the id
      */
     public int getId() {
         return id;
     }
     /**
      * @param id the id to set
      */
     public void setId( int id) {
         this .id = id;
     }
     /**
      * @return the name
      */
     public String getName() {
         return name;
     }
     /**
      * @param name the name to set
      */
     public void setName(String name) {
         this .name = name;
     }
     /**
      * @return the age
      */
     public int getAge() {
         return age;
     }
     /**
      * @param age the age to set
      */
     public void setAge( int age) {
         this .age = age;
     }
     /**
      * @return the address
      */
     public String getAddress() {
         return address;
     }
     /**
      * @param address the address to set
      */
     public void setAddress(String address) {
         this .address = address;
     }
 
}</code>

在这里我们创建了Bean类,并与数据库建立了联系,有两件事是我们需要做的
1.需要在@DatabaseTable注解中填入表名
2.在@DatabaseField(columnName=”“)填入字段名,设置字段的属性等等

字段属性说明

ORMLite为我们提供了全面的字段属性的支持,下面我们来具体看一下吧:

cloumnName:指定字段名,不指定则变量名作为字段名 canBeNull:是否可以为null dataType:指定字段的类型 foreign 指定这个字段的对象是一个外键,外键值是这个对象的id foreignAutoCreate 外键不存在时是否自动添加到外间表中 foreignAutoRefresh 外键值,自动刷新 foreignColumnName外键字段指定的外键表中的哪个字段 generatedId:指定字段为自增长的id,不能id,generatedIdSequence通用 id:指定字段为id index:索引 persisted:指定是否持久化此变量,默认true throwIfNull,如果空值抛出异常 useGetSet:指定ormlite访问变量使用set,get方法默认使用的是反射机制直接访问变量 unique:字段值唯一 uniqueIndex 唯一索引 uniqueCombo整列的值唯一

创建数据库

与Android中的数据库创建相似,使用OrmLite创建数据库需要我们创建一个SqlOpenHelper继承OrmLiteSqliteOpenHelper,在OrmLiteSqliteOpenHelper也有两个重要方法,分别是onCreate和onUpgrade,负责数据库创建以及升级时的操作

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<code class = "hljs" java= "" > public class MySqlOpenHelper extends OrmLiteSqliteOpenHelper {
 
     private Dao<person, integer= "" > mPersonDao;
 
     public MySqlOpenHelper(Context context) {
         super (context, test, null , 1 );
         // TODO Auto-generated constructor stub
     }
 
     @Override
     public void onCreate(SQLiteDatabase arg0, ConnectionSource arg1) {
         // TODO Auto-generated method stub
         try {
             //创建数据表
             TableUtils.createTableIfNotExists(arg1, Person. class );
         } catch (java.sql.SQLException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
     }
 
     @Override
     public void onUpgrade(SQLiteDatabase arg0, ConnectionSource arg1, int arg2,
             int arg3) {
         // TODO Auto-generated method stub
 
     }
 
     public Dao<person, integer= "" > getPersonDao() throws java.sql.SQLException {
         if (mPersonDao == null ) {
             mPersonDao = getDao(Person. class );
         }
         return mPersonDao;
     }
 
}</person,></person,></code>

Dao是一个很重要的类, 这些Dao对象用于以后的数据库操作,其包含两个泛型,第一个泛型表DAO操作的类,第二个是标记数据表的ID。

数据库操作

创建了我们自己的数据库之后就可以来,对数据库操作了,接下来我们看看如何进行数据库的增删查改

插入操作

这些方法使用起来都比较简单,我们只需将自己的Bean传入到下列方法中即可

create:插入一条数据 createIfNotExists:如果不存在则插入 createOrUpdate:如果存在则更新

查询操作

OrmLite为我提供了一系列的查询操作,方法很多,而且很多都是只看方法名就可以知道的,这里就不逐一介绍了,在这里介绍一下如何使用QueryBuilder进行复杂查找。

首先调用personDao.queryBuilder();获得该Dao下的QueryBuilder对象, 接下来设置QueryBuilder的查询条件, 最后通过QueryBuilder的query方法获得List对象,

下面介绍几个常用的builder下的查询,
1.多字段条件查询:

?
1
2
3
<code class = "hljs" perl= "" >QueryBuilder builder = dao.queryBuilder();
builder.where().eq(字段名 1 ,条件 1 ).and.eq(字段名 2 ,条件 2 );
builder.query(); </code>

2.查询并按顺序输出

?
1
2
3
<code class = "hljs" erlang= "" >QueryBuilder<person, integer= "" > builder = dao.queryBuilder();
builder.orderBy(字段名, true );
builder.query();</person,></code>

orderBy的方法第一参数表示按那个字段进行排序,第二个参数表示是否为升序。

3.分页查询

?
1
2
3
4
<code avrasm= "" class = "hljs" >QueryBuilder<person, integer= "" > builder = dao.queryBuilder();
builder.offset( 10 ); //表示查询的起始位置
builder.limit( 10 ); //表示总共获取的对象数量
builder.query();</person,></code>

删除和更改操作

与查询操作类似,ORMLite同样为我们提供了一系列的方法,同时也提供了复杂删除,复杂更改的DeleteBuilder和UpdateBuilder,其用法与QueryBuilder相似,就不详细介绍了。

将数据库放置在SD卡

Android创建数据库默认的存储路径是在/data/data/packagename/database 目录之下,一方面如果数据库庞大将占用系统存储空间,另一方面如果没有获得系统ROOT权限,将不能直观的看到该数据库。所以在最后介绍一下如何将数据库建立在指定的SD卡目录之下。

这个在ORMLite中并没有提供,自己来动手写一写吧。阅读一下Android的源码可以很容易发现,Android数据库存放的目录是由ContextWrapper类下的public File getDatabasePath(String name)方法决定的,那么我们只需创建自己的Context覆盖该方法即可。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
<code class = "hljs" java= "" > public class DatabaseContext extends ContextWrapper {
 
     private static final String ROOT_SDCARD = Environment
             .getExternalStorageDirectory().getAbsolutePath();
     private String dbDir;
 
     public DatabaseContext(Context base, String path) {
         super (base);
         dbDir = path;
     }
 
     @Override
     public File getDatabasePath(String name) {
         // 判断是否存在sd卡
         boolean sdExist = android.os.Environment.MEDIA_MOUNTED
                 .equals(android.os.Environment.getExternalStorageState());
         if (!sdExist) { // 如果不存在,
             Log.e(Database error, SD卡不存在);
             return null ;
         }
 
         // 判断目录是否存在,不存在则创建该目录
         File dirFile = new File(dbDir);
         if (!dirFile.exists())
             dirFile.mkdirs();
 
         // 标记数据库文件是否创建成功
         boolean isFileCreateSuccess = false ;
         String dbPath = dbDir + / + name; // 数据库路径
         File dbFile = new File(dbPath);
         // 如果数据库文件不存在则创建该文件
         if (!dbFile.exists()) {
             try {
                 isFileCreateSuccess = dbFile.createNewFile(); // 创建文件
             } catch (IOException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
             }
         } else
             isFileCreateSuccess = true ;
 
         // 返回数据库文件对象
         if (isFileCreateSuccess)
             return dbFile;
         else
             return null ;
 
     }
 
     @Override
     public SQLiteDatabase openOrCreateDatabase(String name, int mode,
             SQLiteDatabase.CursorFactory factory) {
         SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase(
                 getDatabasePath(name), null );
         return result;
     }
 
     /**
      * Android 4.0会调用此方法获取数据库。
      *
      */
     @Override
     public SQLiteDatabase openOrCreateDatabase(String name, int mode,
             CursorFactory factory, DatabaseErrorHandler errorHandler) {
         SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase(
                 getDatabasePath(name), null );
         return result;
     }
}</code>

之后我们在创建SQLOpenHelper时,只需传入我们自己的DatabaseContext 即可,如

?
1
2
<code class = "hljs" cs= "" >SdCardDBHelper dbHelper = new SdCardDBHelper( new DatabaseContext(
                 MainActivity. this , path), person.db);</code>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值