Android主要有五种重要的存储方式,分别为:文件存储,sharePreference,contentProvider,数据库SQLite和网络存储。
对于数据库SQLite的操作是Android里面数据持久化非常一个环节,而在使用原生系统中的SQLite进行CRUD可能会有点复杂,代码量比较多。因此基于SQLite的数据库操作框架Ormlite和litePal就产生了,这两个框架减轻了开发者的学习成本,非常适合Android快速开发。
先来看看ORMLite是什么东东:在官方文档的介绍中是这样的:
ORMLite provides a lightweight Object Relational Mapping between Java classes and SQL databases.
首先来讲一讲ORM(对象关系映射),ORM是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将java程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式。当开发一个应用程序的时候(不使用O/R Mapping),可能会写不少数据访问层的代码,用来从数据库保存,删除,读取对象信息,等等。而这些代码写起来总是重复的。成型的框架如Hibernate 和 iBatis 也使用了类似的框架。
来看一下官网的范例:
首先需要有几个重要的注释,@DatabaseTable表明了数据表名,@DatabaseField表明数据表字段,即每一列,加上(id=true)就是指定该字段为主键,如下范例指定了一个名为accounts的表,有两个字段name和password,其中name为主键
@DatabaseTable(tableName = "accounts")
public class Account {
@DatabaseField(id = true)
private String name;
@DatabaseField
private String password;
public Account() {
// ORMLite needs a no-arg constructor
}
public Account(String name, String password) {
this.name = name;
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
有了数据库表后,我们还需要的是对数据库的操作(最基本的是CRUD),DAO与表是分离解耦的,所以对应的DAO层应该独立出来,使用DaoManager的createDao来创建
Dao<Account, String> accountDao =
DaoManager.createDao(connectionSource, Account.class);
Dao<Order, Integer> orderDao =
DaoManager.createDao(connectionSource, Order.class);
创建完成后就可以进行操作了。
(二)在Android中的使用`
在Android方面,当然是要获得SQLite的支持了,现在我们来看看他是如何使用的:
使用它首先要用到OrmLiteSqliteOpenHelper,然后重写onCreate和onUpgrade方法等等。官方推荐的是继承OrmLiteBaseActivity,如果不继承的话,就要自己去实现其中的方法。
数据库操作比较不可见, 需要用的是单元测试,我使用的是Android Studio,默认对测试是支持的,只要在androidTest里面建立我们的ormLiteTest,右键run起来就可以了。
这里分析一下三个主要的类:
User,UserDao和DatabaseHelper
(1)User
这里主要是一个bean对象,get,set 方法
package com.lsj.ormlitetest.Bean;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.field.ForeignCollectionField;
import com.j256.ormlite.table.DatabaseTable;
import java.util.Collection;
/** * Created by lsj on 2015/11/9. */
@DatabaseTable(tableName = "table_user")
public class User {
@DatabaseField(generatedId = true)
private int id;
@DatabaseField(columnDefinition = "name")
private String name;
@ForeignCollectionField
private Collection<Article> articles;
public User() {
// need by ormlite
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Collection<Article> getArticles() {
return articles;
}
public void setArticles(Collection<Article> articles) {
this.articles = articles;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + "articles=" + articles + "]";
}
}
(2)UserDao
主要是一些方法来操作
package com.lsj.ormlitetest.Dao;
import android.content.Context;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.misc.TransactionManager;
import com.lsj.ormlitetest.Bean.User;
import java.sql.SQLException;
import java.util.concurrent.Callable;
/** * Created by lsj on 2015/11/9. */
public class UserDao {
private Context context;
private Dao<User, Integer> userDaoOpe;
private DatabaseHelper helper;
public UserDao(Context context) {
this.context = context;
try {
helper = DatabaseHelper.getHelper(context);
userDaoOpe = helper.getDao(User.class);
} catch (SQLException e) {
e.printStackTrace();
}
}
/** * 添加一个用户 * @param user */
public void add(User user) {
// //事务操作
// TransactionManager.callInTransaction(helper.getConnectionSource(), new Callable<Void>() {
// @Override
// public Void call() throws Exception {
// return null;
// }
// });
try {
userDaoOpe.create(user);
} catch (SQLException e) {
e.printStackTrace();
}
}
public User get(int id) {
try {
return userDaoOpe.queryForId(id);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
(3)DatabaseHelper
间接继承了OrmLiteSqliteOpenHelper
package com.lsj.ormlitetest.Dao;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.support.ConnectionSource;
import com.j256.ormlite.table.TableUtils;
import com.lsj.ormlitetest.Bean.Article;
import com.lsj.ormlitetest.Bean.Student;
import com.lsj.ormlitetest.Bean.User;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
/** * Created by lsj on 2015/11/9. */
public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
private static final String TABLE_NAME = "my_sqlite.db";
private Map<String, Dao> daos = new HashMap<String, Dao>();
public DatabaseHelper(Context context) {
super(context, TABLE_NAME, null, 4);
}
@Override
public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) {
try {
TableUtils.createTable(connectionSource, User.class);
TableUtils.createTable(connectionSource, Article.class);
TableUtils.createTable(connectionSource, Student.class);
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) {
try {
TableUtils.dropTable(connectionSource, User.class, true);
TableUtils.dropTable(connectionSource, Article.class, true);
TableUtils.dropTable(connectionSource, Student.class, true);
onCreate(database, connectionSource);
} catch (SQLException e) {
e.printStackTrace();
}
}
private static DatabaseHelper instance;
/** * 单例获取该Helper * * @param context * @return */
public static synchronized DatabaseHelper getHelper(Context context) {
context = context.getApplicationContext();
if (instance == null) {
synchronized (DatabaseHelper.class) {
if (instance == null){
instance=new DatabaseHelper(context);
}
}
}
return instance;
}
public synchronized Dao getDao(Class clazz)throws SQLException{
Dao dao=null;
String className=clazz.getSimpleName();
if(daos.containsKey(className)){
dao=daos.get(className);
}
if(dao==null){
dao=super.getDao(clazz);
daos.put(className,dao);
}
return dao;
}
/** * 释放资源 */
@Override
public void close() {
super.close();
for(String key:daos.keySet()){
Dao dao=daos.get(key);
dao=null;
}
}
}
配合程序来运行会理解得更深刻一些,源码地址在这
http://download.csdn.net/detail/linshijun33/9256269