之前使用的greendao数据库存储服务器所有的历史推送消息,但是后来消息需要加几个新的字段
举个栗子,比如要新增红色框住的字段到数据库中:
本仙女作为一只思想成熟的菜鸡,当然是加了字段就赶紧重新往里存,然后就一通报错android.database.sqlite.SQLiteException: no such column: T.XXX (code 1): , while compiling...
emm, 这种时候,求上进的仙女一般都会上网找问题
然后发现,原来是数据库没升级
嗯,
好的,
编不下去了
升级方法:
①.将新增的字段加入需要存储的bean类;
②.数据库版本号上升一个版本(我之前的version是1,升级改为2)
③.修改getDaoMaster()方法,原先是调用greendao里自动生成的
现在改成自己重写的helper类里的方法,是介锅样子的
相关代码了解一下
public class MyOpenHelper extends DaoMaster.OpenHelper { public MyOpenHelper(Context context, String name) { super(context, name); } public MyOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) { super(context, name, factory); } /** * 数据库升级 */ @Override public void onUpgrade(Database db, int oldVersion, int newVersion) { //操作数据库的更新 有几个表升级都可以传入到下面 MigrationHelper.getInstance().migrate(db, MyBeanDao.class); } }
public class DbManager { // 是否加密 public static final boolean ENCRYPTED = true; private static final String DB_NAME = "petssions.db"; private static DbManager mDbManager; private static DaoMaster.DevOpenHelper mDevOpenHelper; private static DaoMaster mDaoMaster; private static DaoSession mDaoSession; private Context mContext; public DbManager(Context context) { this.mContext = context; // 初始化数据库信息 mDevOpenHelper = new DaoMaster.DevOpenHelper(context, DB_NAME); getDaoMaster(context); getDaoSession(context); } public static DbManager getInstance(Context context) { if (null == mDbManager) { synchronized (DbManager.class) { if (null == mDbManager) { mDbManager = new DbManager(context); } } } return mDbManager; } /** * 获取可读数据库 * * @param context * @return */ public static SQLiteDatabase getReadableDatabase(Context context) { if (null == mDevOpenHelper) { getInstance(context); } return mDevOpenHelper.getReadableDatabase(); } /** * 获取可写数据库 * * @param context * @return */ public static SQLiteDatabase getWritableDatabase(Context context) { if (null == mDevOpenHelper) { getInstance(context); } return mDevOpenHelper.getWritableDatabase(); } /** * 获取DaoMaster * * 判断是否存在数据库,如果没有则创建数据库 * @param context * @return */ public static DaoMaster getDaoMaster(Context context) { if (null == mDaoMaster) { synchronized (DbManager.class) { if (null == mDaoMaster) { MyOpenHelper helper = new MyOpenHelper(context,DB_NAME,null); mDaoMaster = new DaoMaster(helper.getWritableDatabase()); } } } return mDaoMaster; } /** * 获取DaoSession * * @param context * @return */ public static DaoSession getDaoSession(Context context) { if (null == mDaoSession) { synchronized (DbManager.class) { mDaoSession = getDaoMaster(context).newSession(); } } return mDaoSession; }
④.可以直接用DBManager里的方法获取dao类了,比如
DbManager.getDaoSession(getApplicationContext()).getBeanDao();
且原数据库中数据依旧保留。
详细代码取自 https:///huangxiaoguo1/article/details/54574713