前言
这几天朋友让帮忙写个Android数据库操作的demo,花了点时间重新学习了一下SQLite的操作然后写了这个demo,写的比较简单,主要是一些入门级的操作。正好自己记录一下这次学习的过程。
关于SQLite数据库
在Android系统中,Google集成了一个轻量级的数据库:SQLite,SQLite不像我们做PC端的web开发时用的Oracle、MySQL等数据库,它支持的数据量比较小,从名字上也可以看出来是一个轻量级(lite)的数据库。SQLite支持SQL语句,但是并不需要安装、启动服务器进程等操作,连接技术也没那么复杂。SQLite数据库在Android系统中就是一个文件,比较类似于Access。
关于Android数据库的操作主要用到的两个类是SQLiteDatabase和SQLiteOpenHelper。其中SQLiteDatabase继承自SQLiteClosable,它的主要功能在Google的官方文档中的解释是:Exposes methods to manage a SQLite database,也就是提供管理SQLite数据库的方法;SQLiteOpenHelper直接继承自Object,官方解释是: A helperclass to manage database creation and version management,可见其主要功能是创建数据库和版本控制。在实际的使用中,通常会定义子类继承使用SQLiteOpenHelper,然后使用该子类的getReadableDatabase方法和getWriteableDatabase方法来打开数据库。
具体实现
程序中我主要使用了两个类:继承自SQLiteOpenHelper的子类DatabaseHelper和继承的Activity子类。首先来看一下DatabaseHelper的实现:
final String CREATE_TABLE_SQL =
"create table user(id integer primary "
+ "key autoincrement ,"
+ "username varchar(50), "
+ "password varchar(50) )";
//在DatabaseHelper的onCreat方法中执行建表语句
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL(CREATE_TABLE_SQL);
}
然后在MainActivity中的具体实现如下:
public class MainActivity extends Activity {
//两个输入框、登陆和注册按钮
private EditText editUser;
private EditText editPwd;
private Button login;
private Button register;
//显示注册与查询结果的TextView
private TextView show;
//存储用户名密码的查询结果
private String userName;
private String passWord;
//继承于SQLiteHelper,用来对数据库进行操作
DatabaseHelper db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
editUser = (EditText) findViewById(R.id.edit_user);
editPwd = (EditText) findViewById(R.id.edit_pwd);
login = (Button) findViewById(R.id.login);
register = (Button) findViewById(R.id.register);
show = (TextView)findViewById(R.id.show);
//创建数据库,数据库的名称为test.db3,数据库文件在程序安装目录的databases目录下
db = new DatabaseHelper(this, "test.db3", null, 1);
//登录按钮点击事件监听器
login.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//获取输入的文本框中的内容
String username = editUser.getText().toString();
String password = editPwd.getText().toString();
// login方法是自己定义的,具体实现在下面,有两个功能:
// 一是执行查询语句,返回的结果存在cursor中
// 二是当满足查询条件时,通过cursor的一些方法提取出数据库中用户名和密码的信息放到userName与passWord中
// 注意参数中的getReadableDatabase()方法,这是SQLiteHelper提供的打开数据库的方法
// getReadableDatabase()是以读写的方式打开数据库对应的SQLiteDatabase对象
// getWritableDatabase()是以写的方式打开数据库对应的SQLiteDatabase对象
if(login(db.getReadableDatabase(), username, password)){
//在TextView中显示相关信息
show.setText("登陸成功\n用户名:" + userName + "\n密 码:" + passWord);
}
else{
show.setText("用户名或密码错误");
}
// 关闭数据库连接
db.close();
}
});
register.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//获取输入的文本框中的内容
String username = editUser.getText().toString();
String password = editPwd.getText().toString();
//注册方法
insert(db.getReadableDatabase(), username, password);
show.setText("用户名:" + username + "\n密 码:" + password);
db.close();
}
});
}
private void insert(SQLiteDatabase db, String username, String password) {
//执行insert语句execSQL是SQLiteDatabase提供的执行SQL语句的方法,没有返回值,所以一般不用做查询
db.execSQL("insert into user values(null,?,?)", new String[] {
username, password });
}
public boolean login(SQLiteDatabase db, String username, String password) {
String sql = "select * from user where username=? and password=?";
//执行SQL查询语句,返回一个Cursor对象,类似于JDBC中的ResultSet
Cursor cursor = db.rawQuery(sql, new String[] { username, password });
if (cursor.moveToFirst() == true) {
//如果cursor中有记录,提取cursor中用户名密码信息然后关闭cursor并返回true
userName = cursor.getString(cursor.getColumnIndex("username"));
passWord = cursor.getString(cursor.getColumnIndex("password"));
cursor.close();
return true;
}
return false;
}
@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;
}
}
程序代码请移步: 程序源码