ormlite 框架对数据的版本升级
2017-01-21 11:22
288 查看
ormlite 框架对数据的版本升级
本文属于原创,请尊重笔者劳动成功(其实我很懒)本文只对ormlite 框架对数据的版本升级做一些自己额阐述
其他相关对于ormlite框架的了解的话请参考
http://blog.csdn.net/lmj623565791/article/details/39122981
Android 本地数据库又叫SQLite,它有自己的一些原则:
1. 我们只能重命名据据库中的表名和向旧表中增加新的字段
2. Android版SQLite不支持修改表中的字段名和删除表中的字段,也不允许改变表中字段的约束条件(但是修改也可以通过增加来实现,我这里叫它打引号的’修改’)
3. Android版SQLite在存储字段数据时不分类型,所以可以改变字段的类型而无需要升级
(参考地址:http://ormlite.com/javadoc/ormlite-core/doc-files/ormlite_4.html#Upgrading-Schema)
对于原生sqlite数据库升级的操作,请参考最下面的git地址,在testdb包下有描述
废话不多说直接上代码(代码最新的所以跟结果截图会有些出入):
package com.myframe.www.testormlite; import android.content.Context; import android.content.pm.*; import android.database.sqlite.SQLiteDatabase; import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper; import com.j256.ormlite.dao.Dao; import com.j256.ormlite.support.ConnectionSource; import com.j256.ormlite.table.TableUtils; import java.sql.SQLException; import java.util.HashMap; import java.util.Map; import www.wuhai.common.utils.L; /** * Created by wuhai on 2017/01/18 16:18. * 描述: */ public class DBHelper extends OrmLiteSqliteOpenHelper{ /** * 数据库名字 */ private static final String DB_NAME = "test.db"; /** * 数据库版本 */ private static final int VERSION = 3; /** * 用来存放Dao的map */ private Map<String, Dao> daos = new HashMap<String, Dao>(); private static DBHelper instance; /** * 构造方法 * @param context */ public DBHelper(Context context) { super(context, DB_NAME, null, VERSION); } /** * 获取单例 * @param context * @return */ public static synchronized DBHelper getHelper(Context context) { context = context.getApplicationContext(); if (instance == null) { synchronized (DBHelper.class) { if (instance == null) { instance = new DBHelper(context); } } } return instance; } /** * 这里创建表 */ @Override public void onCreate(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource) { L.e(OrmliteActivity.TAG, "执行onCreate,VERSION="+VERSION); // 创建表 try { /** * 逻辑混乱下面的表 */ TableUtils.createTable(connectionSource, PackageInfo.class); TableUtils.createTable(connectionSource, Photographer.class); TableUtils.createTable(connectionSource, Theme.class); TableUtils.createTable(connectionSource, Img.class); /** * 以下面的为主 */ TableUtils.createTable(connectionSource, User.class); TableUtils.createTable(connectionSource, Article.class); } catch (SQLException e) { e.printStackTrace(); } } /** * 这里进行更新表操作 */ @Override public void onUpgrade(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource, int oldVersion, int newVersion) { L.e(OrmliteActivity.TAG, "执行onUpgrade,VERSION="+VERSION); try { // /** // * 逻辑混乱下面的表 // */ // TableUtils.dropTable(connectionSource, PackageInfo.class, true);//这种是直接删掉表了 // TableUtils.dropTable(connectionSource, Photographer.class, true); // TableUtils.dropTable(connectionSource, Theme.class, true); // TableUtils.dropTable(connectionSource, Img.class, true); // /** // * 以下面的为主 // */ // TableUtils.dropTable(connectionSource, User.class, true); // TableUtils.dropTable(connectionSource, Article.class, true); // onCreate(sqLiteDatabase, connectionSource); String sql1 = ""; for(int i=oldVersion;i<newVersion;i++) { switch (i) { case 1://数据库版本1 升级到 版本2 //对table 增加字段 sql1 = "alter table tb_user add age integer"; getDao(User.class).executeRawNoArgs(sql1); break; case 2://数据库版本2 升级到 版本3 sql1 = "alter table tb_user add height integer"; getDao(User.class).executeRawNoArgs(sql1); break; } } } catch (SQLException e) { e.printStackTrace(); } } /** * 通过类来获得指定的Dao */ public synchronized Dao getDao(Class clazz) throws SQLException { Dao dao = null; String className = clazz.getSimpleName(); if (daos.containsKey(className)) { dao = daos.get(className); }else{ dao = super.getDao(clazz); daos.put(className, dao); } return dao; } /** * 释放资源 */ @Override public void close() { super.close(); for (String key : daos.keySet()) { Dao dao = daos.get(key); dao = null; } } }
demo MyFrame../testormlite
User表和Article表 user表测试升级版本,下面是测试结果
版本1 升级到 2 再升级到 3
※version=1 run一次 add;version=2 run一次 add;version=3 run一次 add;
※注意要对应操作user.java类的字段增加 下面的亦如此
logcat:
执行onCreate,START_VERSION=1
add success result=1
执行onUpgrade,START_VERSION=2
add success result=1
执行onUpgrade,START_VERSION=3
add success result=1
版本1 升级到 3
※version=1 run一次 add;version=3 run一次 add
执行onCreate,START_VERSION=1
add success result=1
执行onUpgrade,START_VERSION=3
add success result=1
用户第一安装就是版本3
※version=1 run一次 add
执行onCreate,START_VERSION=3
add success result=1
版本不升级,删除字段(接3继续操作)
删除height,可以添加,不会报错,但height无值
执行onCreate,START_VERSION=3
add success result=1
add success result=1
版本不升级,增加字段,这个是会报错的呢
接4操作,回复height字段,并追加一个weight字段(注意此时版本还是没变,依然是3)
执行onCreate,START_VERSION=3
add success result=1
add success result=1
add fail result=0,Message=Unable to run insert stmt on object User [id=102, name=weight]: INSERT INTO
tb_user(
id,
name,
age,
height,
weight) VALUES (?,?,?,?,?)
数据库没有插入成功,通过root权限后的工具查看,user表没有发生变化
git项目下载地址
https://github.com/oceanhai/MyFrame.git
项目里比较杂,还涉及到ndk什么的,自己工具除了需要sdk,还需要对应ndk工具等
相关文章推荐
- Android数据库ORMLite版本升级及数据的迁移
- 数据存储之ORMlite框架总结
- DataRabbit 轻量的数据访问框架(13)--DataRabbit 3.0 ORM性能大幅度提升!
- 发布NBearLite v1.0.0: 提供强类型查询语法的非ORM数据访问组件 [8/2 更新至v1.0.0.9 beta - 修复NBearLite参考手册某些操作系统打开错误的问题]
- mysql版本升级,原数据无法访问,mysql报错代码1558
- CYQ.Data 数据框架 V2.0 版本 开放源码 继续开源之路
- CYQ.Data 数据框架 发放V1.5版本源码
- 发布NBearLite v1.0.0: 提供强类型查询语法的非ORM数据访问组件 [8/2 更新至v1.0.0.9 beta - 修复NBearLite参考手册某些操作系统打开错误的问题]
- mysql 主从同步如何 把从数据的版本升级到指定的版本
- CYQ.Data 数据框架 V3.0 版本 开放源码下载有[CYQ.Blog(秋色园QBlog) 完全开放所有源码]
- CYQ.Data 数据框架 V3.0 版本 开放源码下载有[CYQ.Blog(秋色园QBlog) 完全开放所有源码]
- CYQ.Data 轻量数据层之路 优雅V1.4版本 框架开源
- DbEntry.Net---又一个国产开源ORM数据访问及 WEB 框架
- CYQ.Data 轻量数据层之路 优雅V1.4版本 框架开源
- CYQ.Data 轻量数据层之路 华丽V1.3版本 框架开源
- CYQ.Data 数据层框架 V4.5.5 版本发布
- DataRabbit 轻量的数据访问框架(13)--DataRabbit 3.0 ORM性能大幅度提升!
- 关于C++二进制文件读取转换,数据版本升级,增加字段等结构调整工具的思路。
- DataRabbit 轻量的数据访问框架(13)-DataRabbit 3.0 ORM性能提升
- 【Android】在Android上使用OrmLite数据库框架 之 使用表配置文件