总感觉用原始的SQLLiteHelper操作数据库有点麻烦,上网找了些android数据库orm框架,对比了一下,现在使用ormlite的人貌似挺多的,在网上找了ormlite官方文档,根据官方文档,今天写了个demo,主要是用户注册,用户信息查看以及删除,运行效果如图:以前也用过一个同样的orm框架Afinal,但是感觉Afinal没有ormlite之强大。
Ormlite官网:http://ormlite.com/ 开发文档下载(pdf)。 但是是英文文档哦,不要一看到是英文的就害怕了,其实里面单词比较简单,能够看得懂的,多看看英文文档还是挺有帮助的。
一:要使用ormlite很简单,只需要下载相应的两个jar包(目前最新的jar包ormlite-android-4.48.jar,ormlite-core-4.48.jar下载)并导入工程即可。
二:创建实体类
@DatabaseTable(tableName = "tb_user")
//如果没有特别指出tableName = "tb_user",那么默认情况将类名作为表名
//这里也可以使用注解@Entity,因为ORMLite既支持它自己的注解(@DatabaseTable和 @DatabaseField)也支持很多来自javax.persistence包中标准的注解。
//你可以使用来自javax.persistence包的更多的标准JPA注解。
public class User {
//用户编号
/**
* id:这个字段是否为主键,默认为false
* generatedId:字段是否自动增加。默认为false。
* 注意:id和generatedId只能指明一个,否则会报错的
*/
//可以用javax.persistence注解: @Id,@Column
@DatabaseField(generatedId=true)
private int userId;
//用户名
@DatabaseField
private String userName;
//密码
@DatabaseField
private String password;
public User() {
//必须提供无参构造函数,这样查询的时候可以返回查询出来的对象
}
public User( int userId,String userName, String password) {
this.userId = userId;
this.userName = userName;
this.password = password;
}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
三:创建SQLLiteOpenHelper,在这里有两个比较重要的类OrmLiteSqliteOpenHelper(当你的应用被加载时创建和更新数据库以及为其他的类提供DAO类,必须实现onCreate(SQLiteDatabasesqliteDatabase, ConnectionSource
connectionSource) and onUpgrade(SQLiteDatabasedatabase, ConnectionSource
connectionSource, intoldVersion, int newVersion).这两个类),RuntimeExceptionDao(默认情况下,大多数的dao方法都会抛出SQLException,因为SQLException是大部分jdbc以及其他的sql调用时抛出的默认异常。 但是在android平台上,尤其是,绝大部分的异常继承了RuntimeException,添加了一个RuntimeExceptionDao来封装所有在运行时因调用底层dao方法所抛出的运行时异常。)
public class DatabaseHelper extends OrmLiteSqliteOpenHelper{
// 数据库名称
private static final String DATABASE_NAME = "helloAndroid.db";
// 数据库version
private static final int DATABASE_VERSION = 1;
/**
* 包含两个泛型:
* 第一个泛型表DAO操作的类
* 第二个表示操作类的主键类型
*/
private Dao<User, Integer> userDao = null;
private RuntimeExceptionDao<User, Integer> simpleRuntimeDao = null;
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase sqliteDatabase, ConnectionSource connectionSource) {
try {
Log.i(DatabaseHelper.class.getName(), "onCreate");
TableUtils.createTable(connectionSource, User.class);
} catch (SQLException e) {
Log.e(DatabaseHelper.class.getName(), "Can‘t create database", e);
throw new RuntimeException(e);
}
}
/**
* 插入一条数据
*/
public void insert(User user){
RuntimeExceptionDao<User, Integer> dao = getSimpleDataDao();
//通过实体对象创建在数据库中创建一条数据,成功返回1,说明插入了一条数据
Log.i("test", "dao = " + dao+" user= "+user);
int returnValue = dao.create(user);
Log.i("test", "插入数据后返回值:"+returnValue);
}
/**
* 查询所有的用户信息
* @return
*/
public List<User> findAllUser(){
RuntimeExceptionDao<User, Integer> dao = getSimpleDataDao();
return dao.queryForAll();
}
/**
* 删除第一条用户信息
*/
public void deleteById(){
RuntimeExceptionDao<User, Integer> dao = getSimpleDataDao();
List<User> list = dao.queryForAll();
//删除成功返回1(删除了一条数据)
if(list.size()>0){
int returnValue = dao.deleteById(list.get(0).getUserId());
Log.i("test", "删除一条数据后返回值:"+returnValue);
}
}
/**
* 批量删除用户信息
*/
public void deleteByIds(){
RuntimeExceptionDao<User, Integer> dao = getSimpleDataDao();
List<User> list = dao.queryForAll();
List<Integer> ids = new ArrayList<Integer>();
if(list.size()>0){
for(User u:list){
ids.add(u.getUserId());
}
//返回删除的记录数
int returnValue = dao.deleteIds(ids);
Log.i("test", "批量删除后返回值:"+returnValue);
}
}
public RuntimeExceptionDao<User, Integer> getSimpleDataDao() {
if (simpleRuntimeDao == null) {
simpleRuntimeDao = getRuntimeExceptionDao(User.class);
}
Log.i("test", "simpleRuntimeDao ======= "+simpleRuntimeDao);
return simpleRuntimeDao;
}
/**
* 这个方法在你的应用升级以及它有一个更高的版本号时调用。所以需要你调整各种数据来适应新的版本
*/
@Override
public void onUpgrade(SQLiteDatabase sqliteDatabase, ConnectionSource connectionSource, int oldVersion,
int newVersion) {
Log.i("test", "更新....");
try {
Log.i(DatabaseHelper.class.getName(), "onUpgrade");
//删掉旧版本的数据
TableUtils.dropTable(connectionSource, User.class, true);
//创建一个新的版本
onCreate(sqliteDatabase, connectionSource);
} catch (SQLException e) {
Log.e(DatabaseHelper.class.getName(), "Can‘t drop databases", e);
throw new RuntimeException(e);
}
}
public Dao<User, Integer> getDao() throws SQLException {
if (userDao == null) {
userDao = getDao(User.class);
}
return userDao;
}
}
四:接下来就是Activity了。
MainActivity:当程序运行便进入该类,主要是显示页面的那几个按钮以及显示查询出来的用户信息。
public class MainActivity extends Activity {
Button button1;//注册按钮
Button button2;//显示按钮
Button button3;//删除按钮
Button button4;//批量删除按钮
TextView textView;//用来显示查询到的用户信息
DatabaseHelper helper = new DatabaseHelper(this);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button1 = (Button)this.findViewById(R.id.main_btn_regist);
button2 = (Button)this.findViewById(R.id.main_btn_show);
button3 = (Button)this.findViewById(R.id.main_btn_delete);
button4 = (Button)this.findViewById(R.id.main_btn_deleteAll);
textView = (TextView)this.findViewById(R.id.main_show_user);
//点击注册按钮跳转到注册页面
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setClass(MainActivity.this, RegistActivity.class);
startActivity(intent);
}
});
//点击“显示”按钮跳转到用户信息显示页面并将注册用户信息显示出来
button2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
List<User> userList = helper.findAllUser();
String str = "";
if(userList.size()>0){
//将查询到的用户信息显示出来
for(User user:userList){
str+="用户"+user.getUserId()+":"+user.getUserName()+" 密码:"+user.getPassword();
}
textView.setText(str);
}else{
textView.setText("亲!还没注册吧!");
}
}
});
//删除一条记录
button3.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
helper.deleteById();
}
});
//批量删除
button4.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
helper.deleteByIds();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
对应的布局文件:main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
android:gravity="center"
tools:context=".MainActivity" >
<Button
android:id="@+id/main_btn_regist"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="注册"/>
<Button
android:id="@+id/main_btn_show"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="显示"/>
<Button
android:id="@+id/main_btn_delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="删除"/>
<Button
android:id="@+id/main_btn_deleteAll"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="批量删除"/>
<TextView
android:id="@+id/main_show_user"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
RegistActivity:用户注册类
/**
* 用户注册
* @author leox
*
*/
public class RegistActivity extends Activity {
EditText userNameEdit;//用户名编辑框
EditText passwordEdit;//密码编辑框
Button reButton;//注册按钮
DatabaseHelper helper = new DatabaseHelper(this);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
userNameEdit = (EditText)this.findViewById(R.id.et_username);
passwordEdit = (EditText)this.findViewById(R.id.et_password);
reButton = (Button)this.findViewById(R.id.btn_regist);
reButton.setOnClickListener(new myClickListener());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
class myClickListener implements OnClickListener{
@Override
public void onClick(View v) {
//用户名
String userName = userNameEdit.getText().toString();
//密码
String password = passwordEdit.getText().toString();
User user = new User();
user.setUserName(userName);
user.setPassword(password);
//插入注册用户信息
helper.insert(user);
Intent intent = new Intent();
intent.setClass(RegistActivity.this, MainActivity.class);
startActivity(intent);
}
}
}
对应的布局文件:activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
android:gravity="center"
tools:context=".RegistActivity" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20dp"
android:text="用户注册" />
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="用户名:"/>
<EditText
android:id="@+id/et_username"
android:layout_width="200px"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="密码:"/>
<EditText
android:id="@+id/et_password"
android:layout_width="200px"
android:layout_height="wrap_content"
android:password="true"/>
</LinearLayout>
<Button
android:id="@+id/btn_regist"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="注册"/>
</LinearLayout>