进行安卓开发少不了要跟数据库打交道。然而谷歌为我们提供的数据库操作类SQLiteHelper生涩难懂,尤其是要求熟练SQL语句。
java是一门面向对象语言,使用面向对象的思想管理数据库无疑更加合适。
注意是俩个jar包哦
这里的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无多大区别,主要是注解。
@DatabaseTable(tableName = "tb_user")
@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;
具体用法注释已经写的很清楚了,这里就不再详细说明,主要重写俩个方法
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;
}
}
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();
}
}
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日志,当第一次添加数据时,会自动创建一张表:
下面是查询结果
好了,整个demo其实很简单,使用ORMLite 进行数据库操作的流程如上文所述。
demo下载地址:http://download.csdn.net/detail/q649381130/9510098