SQLite在android开发中是用的比较多的,究竟怎样组织代码要好点呢?综合人家优秀的代码,如下去组织代码要好得多:
package com.example.dbtest;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Environment;
import android.util.Log;
/**
* 数据库访问类,单例模式。提供访问数据库的对象
*/
public class DBHelper {
private final static int db_version = 1 ;
private final static String tb_name = "test";
private static DBHelper mInstance = null ;
private SQLiteOpenHelper mSQLiteDBHelper ;
private SQLiteDatabase db ;
private static final String db_name = "dxd";
private static final String package_name = "com.example.dbtest";
private static final String db_path = "/data"+ Environment.getDataDirectory().getAbsolutePath() + "/"+ package_name; // 数据库的保存目录
/**
* 建立数据库表的类,dxd.db 下的 test 表。
* @author Administrator
*
*/
private static class SQLiteHelper extends SQLiteOpenHelper {
public SQLiteHelper(Context context) {
super(context, db_name, null, db_version);
}
@Override
public void onCreate(SQLiteDatabase db) {
Log.e("SQLiteHelper","onCreate");
String sql = "create table "+tb_name+"( "+
"id Integer PRIMARY KEY AUTOINCREMENT NOT NULL ," +
"number Integer,"+
"age Integer," +
"name VARCHAR" +
")" ;
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.e("SQLiteHelper","onUpgrade");
db.execSQL("DROP TABLE IF EXISTS " + tb_name);
onCreate(db);
}
}
private DBHelper(Context c){
mSQLiteDBHelper = new SQLiteHelper(c);
}
public static DBHelper getInstance(Context c){
if(null == mInstance){
mInstance = new DBHelper(c);
}
return mInstance ;
}
/**
* insert
* @param num
* @param age
* @param name
* @return
*/
public synchronized boolean insert(int num ,int age,String name){
Log.e("DBHelper","insert");
boolean flag = false ;
try{
db = mSQLiteDBHelper.getWritableDatabase();
String sql = "insert into "+tb_name+"(number,age,name) values(?,?,?)";
db.execSQL(sql, new String[]{String.valueOf(num),String.valueOf(age),name});
flag = true ;
}catch(Exception e){
Log.d("","insert data exception");
}finally{
db.close();
}
return flag;
}
/**
* delete
* @param num
* @return
*/
public synchronized boolean deleteByNum(int num){
boolean flag = false ;
try{
db = mSQLiteDBHelper.getWritableDatabase();
String sql = "delete from " + tb_name + "where number = ?";
db.execSQL(sql, new String[]{String.valueOf(num)});
flag = true ;
}catch(Exception e){
Log.d("","deleteByNum exception");
}finally{
db.close();
}
return flag ;
}
/**
* select by number
* @param num
* @return
*/
public synchronized boolean selectByNum(int num){
boolean flag = false ;
try{
db = mSQLiteDBHelper.getWritableDatabase();
String sql = "select from " + tb_name + "where number = ?";
Cursor c = null;
c = db.rawQuery(sql, new String[]{String.valueOf(num)});
if(c != null){
if(c.moveToFirst()){
do{
int number = c.getInt(0);
int age = c.getInt(1);
String name = c.getString(2);
Log.e("","number = " + number + " age = " + age +" name = " + name);
}while(c.moveToNext());
}
}
flag = true ;
}catch(Exception e){
Log.d("","selectByNum data exception");
}finally{
db.close();
}
return flag ;
}
/**
* select all
* @return
*/
public synchronized boolean selectAll(){
Log.e("DBHelper","selectAll");
boolean flag = false ;
try{
db = mSQLiteDBHelper.getWritableDatabase();
String sql = "select * from " + tb_name;
Cursor c = null;
c = db.rawQuery(sql, null);
if(c != null){
if(c.moveToFirst()){
do{
int pk = c.getInt(0);
int number = c.getInt(1);
int age = c.getInt(2);
String name = c.getString(3);
Log.e("","pk = " + pk + " number = " + number + " age = " + age +" name = " + name);
}while(c.moveToNext());
}
}
flag = true ;
}catch(Exception e){
Log.d("","selectAll data exception");
}finally{
db.close();
}
return flag ;
}
}
SQLiteOpenHelper对象作为静态类在DBHelper加载的时候就会去创建数据库,这2个重载的方法是SQLiteOpenHelper类的子类必须要实现的接口,主要是负责数据库的创建和更新,将我们自己定义的数据库访问类DBHelper设计成单例模式,在用的时候只需要getInstance即可,通过同步操作不会引起混乱。这里只是写出了插入和查询的方法,如果需要可以增加很多访问数据库的方法,这就要看项目的需要了。