zoukankan      html  css  js  c++  java
  • [ 转]Android快速开发–使用ORMLite操作数据库

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

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

    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
    @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;
        }
     
    }

    在这里我们创建了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
    public class MySqlOpenHelper extends OrmLiteSqliteOpenHelper {
     
        private Dao<Person, Integer> mPersonDao;
     
        public MySqlOpenHelper(Context context) {
            super(context, "test"null1);
            // 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;
        }
     
    }

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

    数据库操作

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

    插入操作

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

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

    查询操作

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

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

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

    1
    2
    3
    QueryBuilder builder = dao.queryBuilder();
    builder.where().eq("字段名1","条件1").and.eq(""字段名2","条件2");
    builder.query();

    2.查询并按顺序输出

    1
    2
    3
    QueryBuilder<Person, Integer> builder = dao.queryBuilder();
    builder.orderBy("字段名"true);
    builder.query();

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

    3.分页查询

    1
    2
    3
    4
    QueryBuilder<Person, Integer> builder = dao.queryBuilder();
    builder.offset(10);//表示查询的起始位置
    builder.limit(10);//表示总共获取的对象数量
    builder.query();

    删除和更改操作

    与查询操作类似,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
    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;
        }
    }

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

    1
    2
    SdCardDBHelper dbHelper = new SdCardDBHelper(new DatabaseContext(
                    MainActivity.this, path), "person.db");

    ORMLite相关文件下载

    附上ORMLite相关jar文件以及官方文档说明:点击下载

  • 相关阅读:
    django
    水仙花数 Python
    Python 实现两个矩形重合面积
    Linux文件目录
    grep 命令
    软件测试的一些心得(转)
    压力测试和负载测试
    如何在mysql数据库生成百万条数据来测试页面加载速度
    CentOS7下部署java+tomcat+mysql项目及遇到的坑
    MongoDB的安装
  • 原文地址:https://www.cnblogs.com/qianyukun/p/5196498.html
Copyright © 2011-2022 走看看