Android 使用ORMLite操作数据库

进行安卓开发少不了要跟数据库打交道。然而谷歌为我们提供的数据库操作类SQLiteHelper生涩难懂,尤其是要求熟练SQL语句。

java是一门面向对象语言,使用面向对象的思想管理数据库无疑更加合适。

1、下载Jar包

  • 可以去官网下载core以及android Jar包
  • 也可以去我上传的地址下载

注意是俩个jar包哦

2、配置JavaBen

这里的javaben对应的就是数据库表里面的具体数据。国际惯例,先上代码:

//表名
DatabaseTable(tableName = "tb_user")
public class User
{
    /**
     * id列的列名
     */
    public static final String COLUMN_NAME_ID = "id";

    //表示id
    @DatabaseField(id = true) private String id;
    @DatabaseField(useGetSet = true) private String name;

    @DatabaseField(columnName="age") private int mAge;

    @DatabaseField(defaultValue="男") private String sex;

    public User()
    {
    }

    public User(String id, String name, int age)
    {
        super();
        this.id = id;
        this.name = name;
        this.mAge = age;
    }

    public String getId()
    {
        return id;
    }

    public void setId(String id)
    {
        this.id = id;
    }

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public int getmAge()
    {
        return mAge;
    }

    public void setmAge(int mAge)
    {
        this.mAge = mAge;
    }

    public String getSex()
    {
        return sex;
    }

    public void setSex(String sex)
    {
        this.sex = sex;
    }

    @Override
    public String toString()
    {
        return "id=" + id + ", name=" + name + ", age=" + mAge + ", sex=" + sex + "\n";
    }
}

注意:需要一个无参构造
其中代码与普通的javaben无多大区别,主要是注解。

3、注解含义

  1. 在类的申明第一行上面加上:
    • @DatabaseTable(tableName = "tb_user")
  2. Field注释,包含以下几种字段定义 :
    • @DatabaseField

columnName
指定列名,不指定的话默认使用变量名

     @DatabaseField(columnName="age") private String mAge;

defaultValue
指设置该列默认值

@DatabaseField(defaultValue="男") private String sex;

id
作为数据库的id存在(id、generatedId、generatedIdSequence只能同时存在一个)

      @DatabaseField(id = true) private String id;  

generatedId
自增长id(id、generatedId、generatedIdSequence只能同时存在一个)

generatedId
序列编号的名字(可理解为id,但是特殊指定columnName的值)

useGetSet
是否使用get set方法进行映射,为true时表示使用get set方法,
建议设置为true,可以提升性能

@DatabaseField(useGetSet = true) private String name;

4、OrmLiteSqliteOpenHelper子类的创建

具体用法注释已经写的很清楚了,这里就不再详细说明,主要重写俩个方法

onCreate(SQLiteDatabase dataClass, ConnectionSource source)
onUpgrade(SQLiteDatabase database, ConnectionSource source, int olderVersion,
int newVersion)

public class DatabaseHelper extends OrmLiteSqliteOpenHelper
{
    //数据库名
    private static final String TABLE_NAME = "user_tab";

    //版本号
    private static final int TABLE_VERSION = 1;

    //dao操作类,每一张表对应一个
    private Dao mUserDao;

    private DatabaseHelper(Context context)
    {
        //参数与原生的类似
        super(context, TABLE_NAME, null, TABLE_VERSION);
    }

    //数据库创建时执行的方法
    @Override
    public void onCreate(SQLiteDatabase dataClass, ConnectionSource source)
    {
        try
        {
            //创建表
            TableUtils.createTable(source, User.class);
        } catch (SQLException e)
        {
            e.printStackTrace();
        }
    }

    //版本变更执行的方法
    @Override
    public void onUpgrade(SQLiteDatabase database, ConnectionSource source, int olderVersion,
            int newVersion)
    {
        try
        {
            //新增、变更、删除表操作
            TableUtils.dropTable(source, User.class, true);
        } catch (SQLException e)
        {
            e.printStackTrace();
        }
    }

    private static DatabaseHelper mDatabaseHelper;

    //获取单例
    public static DatabaseHelper getInstance(Context context)
    {
        if (mDatabaseHelper == null )
        {
            synchronized (DatabaseHelper.class)
            {
                if (mDatabaseHelper == null)
                {
                    mDatabaseHelper = new DatabaseHelper(context);
                }
            }
        }

        return mDatabaseHelper;
    }


    public Dao getUserDao()
    {
        if (mUserDao == null)
        {
            try
            {
                mUserDao = getDao(User.class);
            } catch (SQLException e)
            {
                e.printStackTrace();
            }
        }

        return mUserDao;
    }

    //释放资源
    @Override
    public void close()
    {
        super.close();
        mUserDao = null;

        mDatabaseHelper.close();
        mDatabaseHelper = null;
    }
}

5、创建数据库操作Dao类

Dao主要用于对数据库的操作,可以避免直接通过help来进行相关,实现功能拆分。这样做符合设计模式中的单一职责原则。
ORMLite的功能是非常强大的,可以让开发人员方便的进行数据库的增删查改,提高开发效率,减少开发难度。
public class UserDao
{
    protected Dao mDao;
    protected DatabaseHelper mHelper;

    public UserDao(Context context)
    {
        getDao(context);
    }

    private void getDao(Context context)
    {
        mHelper = DatabaseHelper.getInstance(context);
        try
        {
            mDao = mHelper.getDao(User.class);
        } catch (SQLException e)
        {
            e.printStackTrace();
        }
    }

    /**
     * 添加集合中的数据到数据库
     * @date 2016-4-14 下午6:45:05  
     * @param list 需要插入的数据列表
     */
    public void add(List list)
    {
        if (list == null || list.isEmpty())
        {
            return;
        }

        for (User item : list)
        {
            add(item);
        }
    }

    /**
     * 添加一个数据
     * @date 2016-4-14 下午6:20:59  
     * @param item  需要插入的数据
     */
    public void add(User item)
    {
        try
        {
            mDao.createIfNotExists(item);
        } catch (SQLException e)
        {
            e.printStackTrace();
        }
    }

    /**
     * 删除所有数据
     * @date 2016-4-14 下午6:42:54
     */
    public void deleted()
    {
        try
        {
            mDao.delete(queryAll());
        } catch (SQLException e)
        {
            e.printStackTrace();
        }
    }

    /**
     * 查询所有数据
     * @author 漆可
     * @date 2016-4-14 下午6:37:42  
     * @return
     */
    public List queryAll()
    {
        List list = null;

        try
        {
            list = mDao.queryForAll();
        } catch (SQLException e)
        {
            e.printStackTrace();
        }

        return list;
    }

    /**
     * 根据id查询
     * @date 2016-4-18  
     * @param areacode
     * @return
     */
    public User getItemById(String id)
    {
        User areaItem = new User();

        try
        {
            List list = mDao.queryBuilder().where().eq(User.COLUMN_NAME_ID, id).query();
            if (list != null && !list.isEmpty())
            {
                areaItem = list.get(0);
            }

        } catch (SQLException e)
        {
            e.printStackTrace();
        }

        return areaItem;
    }

    public void close()
    {
        mHelper.close();
    }
}

6、使用

程序页面,请自动忽视美观
Android 使用ORMLite操作数据库_第1张图片

Activity代码

public class MainActivity extends Activity
{
    private UserDao mUserDao;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mUserDao = new UserDao(this);
    }

    /**
     * 添加按钮点击事件
     * @author 漆可
     * @date 2016-5-4 下午5:33:12  
     * @param v
     */
    public void addBtn(View v)
    {
        User user = null;
        for (int i = 0; i < 10; i++)
        {
            user = new User(i+"", "张三", i+10);
            mUserDao.add(user);
        }
    }

    /**
     * 查询按钮点击事件
     * @author 漆可
     * @date 2016-5-4 下午5:33:24  
     * @param v
     * @throws SQLException
     */
    public void queryBtn(View v) throws SQLException
    {
        List users = mUserDao.queryAll();

        Log.d("users", users.toString());
    }
}

布局就不不贴了,就是俩个按钮,一个添加数据,一个查询数据。文章最后提供了demo下载地址。其中添加按钮点击后添加10条数据,查询按钮查询表中所有数据。
下面是log日志,当第一次添加数据时,会自动创建一张表:
建表日志
下面是查询结果
Android 使用ORMLite操作数据库_第2张图片

好了,整个demo其实很简单,使用ORMLite 进行数据库操作的流程如上文所述。

demo下载地址:http://download.csdn.net/detail/q649381130/9510098

你可能感兴趣的:(安卓进阶)