SQLite是一个轻量级的、嵌入式的关系型数据库,它遵守ACID的关联式数据库管理系统,是主要针对于嵌入式设备专门设计的数据库,由于其本身占用的存储空间较小,所以目前已经在Android操作系统中广泛使用,而且SQLite数据库可以方便的使用SQL语句实现数据库的增、删、改、查、事务控制等操作。
在Android系统中,每一个android.database.sqlite.SQLiteDatabase类的实例都代表了一个SQLite数据库的操作,SQLiteDatabase类本身只是一个数据库的操作类,但是如果想要进行数据库的操作,还是需要android.database.sqlite.SQLiteOpenHelper类的帮助,但是其是个抽象类,使用时需要定义其自雷,并且在子类中覆写相应的抽象方法。
定义SQLiteOpenHelper的子类------MyDatabaseHelper.java
package cn.norysn.createdb;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
public class MyDatabaseHelper extends SQLiteOpenHelper {
//数据库名称
private static final String DATABASE_NAME = "norysn.db";
//数据库版本
private static final int DATABASE_VERSION = 1;
//数据表名称
private static final String TABLE_NAME = "mytab";
public MyDatabaseHelper(Context context) {
//调用父类构造
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
//创建数据表
String sql = "CREATE TABLE "+TABLE_NAME+"("+
"id INTEGER PRIMARY KEY,"+
"name VARCHAR(50) NOT NULL,"+
"birthday DATE NOT NULL)";
try {
db.execSQL(sql);
} catch (SQLiteException e) {
//e.printStackTrace();
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
String sql = "DROP TABLE IF EXISTS "+TABLE_NAME;//SQL语句
try {
db.execSQL(sql);
} catch (SQLiteException e) {
// TODO: handle exception
}
//创建表
this.onCreate(db);
}
}
在子类中覆写了里面的onCreate()和onUpgrade()的方法,其中,onCreate()方法负责表的创建,但是此方法并不是在实例化SQLiteOpenHelper类的对象时调用,而是通过对象调用了getReadableDatabase()或getWriteableDatabase()方法时才会调用,而onUpgrade()方法负责表的删除,并且在删除之后重新创建数据表,当数据库需要升级时会调用此方法。
=======================================================================================
定义一个操作类(MytabOperate.java)来封装数据库的创建、增加、删除、修改、查询的方法
package cn.norysn.operatedb;
import java.util.ArrayList;
import java.util.List;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
public class MyTabOperate{
//数据表名称
private static final String TABLE_NAME = "mytab";
private SQLiteDatabase db = null;
//构造方法
public MyTabOperate(SQLiteDatabase db){
this.db = db;
}
//insert operate
public void insert(String name, String birthday){
String sql = "insert into "+TABLE_NAME+
" (name, birthday) values(?,?)";
Object args[] = new Object[]{name, birthday};
try {
db.execSQL(sql, args);
db.close();
} catch (SQLiteException e) {
// TODO: handle exception
}
}
//update operate
public void update(int id, String name, String birthday){
String sql = "update "+TABLE_NAME+
" set name=?,birthday=? where id=?";
Object args[] = new Object[]{name, birthday, id};
db.execSQL(sql, args);
db.close();
}
//delete operate
public void delete(int id){
String sql = "delete from "+TABLE_NAME+
" where id=?";
Object args[] = new Object[]{id};
db.execSQL(sql, args);
db.close();
}
//query operate
public List<String> query(){
//定义List集合
List<String> all = new ArrayList<String>();
//定义sql语句
String sql = "select * from "+TABLE_NAME;
Cursor result = db.rawQuery(sql, null);
//result.moveToLast()
for(result.moveToFirst(); !result.isAfterLast(); result.moveToNext()){
//设置集合数据
all.add(" ["+result.getInt(0)+"] "+" "+result.getString(1)+", "
+result.getString(2));
}
db.close();
return all;
}
}
有过JDBC学习的读者都清除,由于本程序采用的是拼凑SQL语句的形式,因此代码存在SQL注入漏洞以及无法处理一些敏感字符的问题,为了解决这个问题,在开发中往往会使用占位符的形式俩完成。
=======================================================================================
定义一个Activity(MySQLiteDemo.java)程序,通过监听按钮事件来完成相应的数据操作
package cn.norysn.sqlitedata;
import cn.norysn.createdb.MyDatabaseHelper;
import cn.norysn.operatedb.MyTabOperate;
import android.app.Activity;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListView;
public class MySQLiteDemo extends Activity {
//数据库操作
private SQLiteOpenHelper helper = null;
//定义按钮
private Button createBtn = null;
private Button insertBtn = null;
private Button updateBtn = null;
private Button deleteBtn = null;
private Button queryBtn = null;
private LinearLayout mylayout = null;
//实例化对象
private MyTabOperate myTab = null;
//计数统计
private static int count = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_sqlite_demo);
//定义数据库创建的辅助类
helper = new MyDatabaseHelper(this);
//取得可更新的数据库
//myTab = new MyTabOperate(helper.getWritableDatabase());
//获取组件
createBtn = (Button)findViewById(R.id.createbtn);
insertBtn = (Button)findViewById(R.id.insertbtn);
updateBtn = (Button)findViewById(R.id.updatebtn);
deleteBtn = (Button)findViewById(R.id.deletebtn);
queryBtn = (Button)findViewById(R.id.querybtn);
mylayout = (LinearLayout)findViewById(R.id.LinearLayout1);
//设置监听事件
createBtn.setOnClickListener(new BtnListener());
insertBtn.setOnClickListener(new BtnListener());
updateBtn.setOnClickListener(new BtnListener());
deleteBtn.setOnClickListener(new BtnListener());
queryBtn.setOnClickListener(new BtnListener());
}
//设置监听类
public class BtnListener implements OnClickListener{
@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.createbtn:
create();
break;
case R.id.insertbtn:
insert();
break;
case R.id.updatebtn:
update();
break;
case R.id.deletebtn:
delete();
break;
case R.id.querybtn:
query();
break;
}
}
}
//设置按钮的响应方法
public void create(){
//以修改的方式打开数据库
helper.getWritableDatabase();
}
public void insert(){
//取得可更新的数据库
myTab = new MyTabOperate(helper.getWritableDatabase());
myTab.insert("Norysn"+count++, "1991-01-01");
}
public void update(){
//取得更新的数据库
myTab = new MyTabOperate(helper.getWritableDatabase());
myTab.update(1, "Norysn", "1989-02-01");
}
public void delete(){
myTab = new MyTabOperate(helper.getWritableDatabase());
myTab.delete(3);
}
public void query(){
myTab = new MyTabOperate(helper.getReadableDatabase());
//定义ListView组件
ListView listView = new ListView(this);
//将数据包装
//单行显示
listView.setAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, myTab.query()));
//追加组件
mylayout.addView(listView);
//setContentView(listView);
}
}
页面布局和查询效果截图:
创建的数据库文件位置截图
源码下载 密码:w9hd