import java.io.File;
import java.io.IOException;
import android.content.Context;
import android.content.ContextWrapper;
import android.database.DatabaseErrorHandler;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.util.Log;
/**
* 用于支持对存储在SD卡上的数据库的访问
**/
public class DatabaseContext extends ContextWrapper {
//单例模式
private static DatabaseContext databaseContext;
public static DatabaseContext getInstance(Context context) {
if (databaseContext == null) {
databaseContext = new DatabaseContext(context);
}
return databaseContext;
}
/**
* 构造函数
* @param base 上下文环境
*/
public DatabaseContext(Context context){
super(context);
}
/**
* 获得数据库路径,如果不存在,则创建对象对象
* @param name
* @param mode
* @param factory
*/
@Override
public File getDatabasePath(String name) {
//判断是否存在sd卡
boolean sdExist = android.os.Environment.MEDIA_MOUNTED.equals(android.os.Environment.getExternalStorageState());
if(!sdExist){//如果不存在,
Log.e("SD卡管理:", "SD卡不存在,请加载SD卡");
return null;
}
else{//如果存在
//获取sd卡路径
String dbDir=android.os.Environment.getExternalStorageDirectory().toString();
dbDir += "/xtwg";//数据库所在目录
String dbPath = dbDir+"/"+name;//数据库路径
//判断目录是否存在,不存在则创建该目录
File dirFile = new File(dbDir);
if(!dirFile.exists())
dirFile.mkdirs();
//数据库文件是否创建成功
boolean isFileCreateSuccess = false;
//判断文件是否存在,不存在则创建该文件
File dbFile = new File(dbPath);
if(!dbFile.exists()){
try {
isFileCreateSuccess = dbFile.createNewFile();//创建文件
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else
isFileCreateSuccess = true;
//返回数据库文件对象
if(isFileCreateSuccess)
return dbFile;
else
return null;
}
}
/**
* 重载这个方法,是用来打开SD卡上的数据库的,android 2.3及以下会调用这个方法。
*
* @param name
* @param mode
* @param factory
*/
@Override
public SQLiteDatabase openOrCreateDatabase(String name, int mode,
SQLiteDatabase.CursorFactory factory) {
SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), null);
return result;
}
/**
* Android 4.0会调用此方法获取数据库。
*
* @see android.content.ContextWrapper#openOrCreateDatabase(java.lang.String, int,
* android.database.sqlite.SQLiteDatabase.CursorFactory,
* android.database.DatabaseErrorHandler)
* @param name
* @param mode
* @param factory
* @param errorHandler
*/
@Override
public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory,
DatabaseErrorHandler errorHandler) {
SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), null);
return result;
}
}
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.provider.BaseColumns;
import com.jpxx.xtwg.android.provider.WGGLContract.BaseDataColumns;
import com.jpxx.xtwg.android.provider.WGGLContract.Event_Lixian_Common;
public class WGGLDatabase extends SQLiteOpenHelper {
private static final String DB_NAME = "xtwg.db";
private static final int DATABASE_VERSION = 1;
private static WGGLDatabase wd;
public WGGLDatabase(Context context) {
super(context, DB_NAME, null, DATABASE_VERSION);
}
//单例模式
public static SQLiteDatabase getInstance(Context context) {
if (wd == null) {
wd = new WGGLDatabase(context);
}
return wd.getWritableDatabase();
}
//单例模式
public static WGGLDatabase getDatabase(Context context) {
if (wd == null) {
wd = new WGGLDatabase(context);
}
return wd;
}
interface Tables {
String BASE_DATA = "base_data";
String GRID_TREE = "grid_tree";
String LXIAN_EVENT_COMMON = "event_lixian_common";
String POPU_ADD="popu_add";
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + Tables.BASE_DATA + "(" + BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + BaseDataColumns.TYPE
+ " INTEGER," + BaseDataColumns.CODE + " TEXT NOT NULL ," + BaseDataColumns.NAME + " TEXT NOT NULL," + BaseDataColumns.F_NAME + " TEXT NOT NULL," + BaseDataColumns.EXTRA_1
+ " TEXT," + BaseDataColumns.EXTRA_2 + " TEXT)");
db.execSQL("CREATE TABLE "
+ Tables.GRID_TREE
+ " (_id INTEGER PRIMARY KEY AUTOINCREMENT,json TEXT NOT NULL, type INTEGER)");
//人口采集
db.execSQL("CREATE TABLE "+Tables.POPU_ADD+" (_id INTEGER PRIMARY KEY AUTOINCREMENT,accesstoken TEXT NOT NULL,popu_add_json TEXT NOT NULL,time TEXT NOT NULL)");
//事件通用表
db.execSQL("CREATE TABLE " + Tables.LXIAN_EVENT_COMMON + "(" + BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + Event_Lixian_Common.ACCEESSTOKEN + " TEXT NOT NULL ," + Event_Lixian_Common.TYPE + " TEXT NOT NULL ," + Event_Lixian_Common.LIXIAN_JSON + " TEXT NOT NULL)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + Tables.BASE_DATA);
db.execSQL("DROP TABLE IF EXISTS " + Tables.GRID_TREE);
db.execSQL("DROP TABLE IF EXISTS "+Tables.POPU_ADD);
db.execSQL("DROP TABLE IF EXISTS " + Tables.LXIAN_EVENT_COMMON);
onCreate(db);
}
public boolean tabbleIsEmpty(String tableName) {
boolean result = false;
if (tableName == null) {
return false;
}
SQLiteDatabase db = null;
Cursor cursor = null;
try {
db = getReadableDatabase();
cursor = db.query(tableName, new String[] { BaseColumns._ID },
null, null, null, null, null);
if (cursor.getCount() == 0) {
result = true;
}
cursor.close();
db.close();
} catch (Exception e) {
}
return result;
}
}
使用方法:
SQLiteDatabase db = WGGLDatabase.getInstance(DatabaseContext.getInstance(this));