网友通过本文主要向大家介绍了GreenDao 数据库:使用Raw文件夹下的数据库文件以及数据库升级,greendaoraw等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
GreenDao 数据库:使用Raw文件夹下的数据库文件以及数据库升级,greendaoraw
一、使用Raw文件夹下的数据库文件
在使用GreenDao框架时,数据库和数据表都是根据生成的框架代码来自动创建的,从生成的DaoMaster中的OpenHelper类可以看出:
public static abstract class OpenHelper extends SQLiteOpenHelper { public OpenHelper(Context context, String name, CursorFactory factory) { super(context, name, factory, SCHEMA_VERSION); } @Override public void onCreate(SQLiteDatabase db) { Log.i("greenDAO", "Creating tables for schema version " + SCHEMA_VERSION);
//修改第二个参数为true
createAllTables(db, false); } }
对应的createAllTables函数代码:
/** Creates underlying database table using DAOs. */ public static void createAllTables(SQLiteDatabase db, boolean ifNotExists) { xxxxxDao.createTable(db, ifNotExists); }
再接着往下看:
/** Creates the underlying database table. */ public static void createTable(SQLiteDatabase db, boolean ifNotExists) { String constraint = ifNotExists? "IF NOT EXISTS ": ""; db.execSQL("CREATE TABLE " + constraint + "'DOCTOR' (" + // "'_id' INTEGER PRIMARY KEY AUTOINCREMENT ," + // 0: id "'NAME' TEXT," + // 1: name }
从以上的代码可以看出GreenDao在第一次使用的时候会强制创建数据表,如果这样的话很可能就会导致程序崩溃。
public static abstract class OpenHelper extends SQLiteOpenHelper { public OpenHelper(Context context, String name, CursorFactory factory) { super(context, name, factory, SCHEMA_VERSION); } @Override public void onCreate(SQLiteDatabase db) { Log.i("greenDAO", "Creating tables for schema version " + SCHEMA_VERSION); //修改第二个参数为true createAllTables(db, true); } }
所以要使用Raw文件中的数据库文件需要以下几步:
1)修改参数:
public static abstract class OpenHelper extends SQLiteOpenHelper { public OpenHelper(Context context, String name, CursorFactory factory) { super(context, name, factory, SCHEMA_VERSION); } @Override public void onCreate(SQLiteDatabase db) { Log.i("greenDAO", "Creating tables for schema version " + SCHEMA_VERSION); //修改第二个参数为true createAllTables(db, true); } }
2)添加GreenDaoContextWrapper.java文件到项目中
public class GreenDaoContextWrapper extends ContextWrapper {
private Context mContext;
public GreenDaoContextWrapper(Context base) {
super(base);
this.mContext= base;
}
@Override
public File getDatabasePath(String name) {
Log.d("GreenDao","getDatabasePath");
Log.d("GreenDao",mContext.getDatabasePath(name).getAbsolutePath());
String filePath=mContext.getDatabasePath(name).getAbsolutePath();
File file=new File(filePath);
if (!file.exists()){
buildDatabase(filePath);
}
return file;
}
/**
* 创建数据库文件,其实就是将raw文件夹下的数据库文件复制到应用的database文件夹下:
* /data/data/com.xxxx/databases/
* @param filePath
*/
private void buildDatabase(String filePath){
Log.d("GreenDao","buildDatabase");
InputStream inputStream=mContext.getResources().openRawResource(R.raw.accurmedicine);
FileOutputStream fos= null;
try {
fos = new FileOutputStream(filePath);
byte[] buffer=new byte[1024];
int length;
while ((length=inputStream.read(buffer))>0){
fos.write(buffer,0,length);
}
fos.close();
inputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory) {
Log.d("GreenDao","openOrCreateDatabase");
SQLiteDatabase result= SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name),factory);
return result;
}
@Override
public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory, DatabaseErrorHandler errorHandler) {
Log.d("GreenDao","openOrCreateDatabase");
SQLiteDatabase result= SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name),factory);
return result;
}
}
这里提一下:ContextWrapper是一个Context包装类,需要包含一个真正的Context,详细介绍看:
http://www.jianshu.com/p/94e0f9ab3f1d
3)在创建DevOpenHelper的时候使用GreenDaoContextWrapper
String DBName="xxx"; DaoMaster.DevOpenHelper helper=new DaoMaster.DevOpenHelper(new GreenDaoContextWrapper(context),DBName,null);
这样就大功告成了!
二、数据库版本升级
这个办法是从网上看到的,还不错,就搬过来了。
public class MigrationHelper { private static MigrationHelper instance; public static MigrationHelper getInstance() { if (instance==null){ instance=new MigrationHelper(); } return instance; } /** * 创建临时表->删除旧表->创建新表->导入数据 * @param database * @param daoClasses */ public void migrate(SQLiteDatabase database, Class<? extends AbstractDao<?,?>>...daoClasses){ generateTempTables(database,daoClasses); DaoMaster.dropAllTables(database,true); DaoMaster.createAllTables(database,false); restoreData(database,daoClasses); } /** * 临时表生产 * @param database * @param daoClasses */ private void generateTempTables(SQLiteDatabase database,Class<? extends AbstractDao<?,?>>...daoClasses){ for (int i=0;i<da