首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

GreenDao 兼容升级,保留旧数据的---全方面解决方案

产品级别的可能错误 你的顾虑 出问题的的情形: 字段添加,导致旧表格字段与新的不匹配引发 android.database.sqlite.SQLiteException 类异常。...思路参考 在上面的基础上做出如下步骤总结: (看不懂的看下面的符号描述) 创建之前旧表中不存在的新表 创建中间表 & 把旧表的数据迁移到中间表 把旧表全部删除 创建所有新表 把中间表的数据迁移到新表 &...& 把旧表的数据迁移到中间表 */ if(!...(Database db, int oldVersion, int newVersion) { // 不要调用父类的,它默认是先删除全部表再创建 // super.onUpgrade...1, 答: sqlLite 的源码里面调用 onUpdrade方法的入口皆加上了同步琐,这样不会造成在升级中还能让你去读写的情况。 这点设计得非常优秀!表太多的,几百张?那么就放入子线程升级。

1.4K50

Android中SQLite数据库小计

当程序运行时,执行的代码请求一个数据库实例时,帮助类会检查数据库文件是否存在,不存在就创建对应名称的数据库文件,之后执行onCreate方法完成对数据库结构(主要就是各种表)的初始化。...帮助类在检查数据库的存在性时,同时会检查数据库的版本,如果当前的version参数和现有数据库的版本号不一致,则根据大小关系执行onUpgrade和onDowngrade方法。...可以使用以下两个方法来达到暂时性的开启和关闭外键约束这样的目的: onConfigure 方法在数据库连接成功后立即执行——在onCreate、onUpgrade和onDowngrade方法的前面。...例如像简单的改表名这样的操作,应该暂时无视外键约束。...——没有任何未提交的事务,没有任何对大对象文件的打开的连接时——去纠缠那些很快就会被释放的内存显然是没必要的。

2.1K90
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【Android 应用开发】Android 数据存储 之 SQLite数据库详解

    ,创建和删除表 触发器 视图 索引等,重建数据库表的索引,数据库升级,事物中保存点,没有返回值的语句; 参数介绍 :  -- 参数① sql: 要执行的SQL语句, 只能执行一条, 多条语句用分号隔开不管用..." 后面的列名也为null, 这样SQL语句就不合法了, 因此这里必须加上一个默认的列名, 以防values参数为null; 实例 :  //创建表数据, 键 为 列名, 值 为 对应的表数据..., 没有严格的某个字段 必须存放某个类型的数据这样的限制, 因此创建数据库 和 插入数据的时候不用关心这个列的数据类型; -- eg: 在SQLite中可以将字符串数据放到整型字段中, 但是主键id,...在异常捕获的try catch 代码块中创建表, 这样操作很繁琐; SQLiteOpenHelper作用 : 该类用来管理数据库的创建 和版本更新, 通常使用其子类, 实现onCreate() 和 onUpgrade...更新数据库 : 升级软件的时候更新数据库表结构, 在数据库版本发生变化的时候调用; public abstract void onUpgrade (SQLiteDatabase db, int oldVersion

    2.5K10

    【Android开发基础系列】数据持久化专题

    ("ALTER TABLE person ADD COLUMN other STRING");     } }         正如上面所述,数据库第一次创建时onCreate方法会被调用,我们可以执行创建表的语句...,当系统发现版本变化之后,会调用onUpgrade方法,我们可以执行修改表结构等语句。        ...PS:        路径(path)可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下:     1、要操作person表中id为10的记录,可以构建这样的路径:/person/10     ...2、要操作person表中id为10的记录的name字段,person/10/name     3、要操作person表中的所有记录,可以构建这样的路径:/person     4、要操作xxx表中的记录...,可以构建这样的路径:/xxx     5、当然要操作的数据不一定来自数据库,也可以是文件、xml或网络等其他存储方式,如下: 要操作xml文件中person节点下的name节点,可以构建这样的路径:/

    47220

    Android:SQLiteOpenHelper类(SQLlite数据库操作)详细解析

    SQLiteOpenHelper类的数据库操作方法介绍 方法名 作用 备注 onCreate() 创建数据库 创建数据库时自动调用 onUpgrade() 升级数据库 close() 关闭所有打开的数据库对象...; //作用:创建数据库表:将创建数据库表的 execSQL()方法 和 初始化表数据的一些 insert()方法写在里面; @Override public void onCreate...//数据库实际上是没有被创建或者打开的,直到getWritableDatabase() 或者 getReadableDatabase() 方法中的一个被调用时才会进行创建或者打开 //...,记得调用SQLiteDatabase的close()方法释放数据库连接,否则容易出现SQLiteException。...db.execSQL(sql); //数据库实际上是没有被创建或者打开的,直到getWritableDatabase() 或者 getReadableDatabase(

    30.7K1611

    Android开发笔记(三十)SQLite数据库基础操作

    sqlite的多数sql语法与oracle是一样的,下面只列出不同的地方: 1、建表时为避免重复操作,应加上“IF NOT EXISTS”关键词,例如:CREATE TABLE IF NOT EXISTS...table_name 2、同样的,删表时为避免重复操作,应加上“IF EXISTS”关键词,例如:DROP TABLE IF EXISTS table_name 3、变更表结构使用ALTER TABLE...执行本方法时,系统会判断是否已执行setTransactionSuccessful,如之前已设置则提交,如没有设置则回滚。...其中onCreate只在第一次打开数据库时执行,而onUpgrade在打开数据库发现版本变化时都会执行,在onUpgrade函数内部,我们可以根据不同的新旧版本号进行相应的处理。...另外我们还得对该类运用单例模式,确保每次取出的数据库对象都是唯一的,这样就避免了重复打开数据库。

    65830

    Android数据库高手秘籍(三)——使用LitePal升级表

    因此,升级表的操作对于任何一个项目也是至关重要的,那么今天我们就一起来学习一下,在Android传统开发当中升级表的方式,以及使用LitePal来进行升级表操作的用法。...如果你还没有看过前一篇文章,建议先去参考一下 Android数据库高手秘籍(二)——创建表和LitePal的基本用法 。...那么如果是从旧版本升级过来的呢?也没有问题,我们在onUpgrade()方法中已经把升级逻辑都处理好了,当oldVersion等于2的时候,会执行alter语句来添加publishdate这一列。...这大概就是传统开发当中升级数据库表的方式了,虽说能写出这样的代码表示你已经对数据库的升级操作理解的比较清楚了,但随着版本越来越多,onUpgrade()方法中的逻辑也会变得愈发复杂,稍微一不留神,也许就会产生错误...好了,今天对LitePal的介绍就到这里吧,下篇文章当中我们会学习使用LitePal来进行表关联的操作,感兴趣的朋友请继续阅读 Android数据库高手秘籍(四)——使用LitePal建立表关联 。

    88050

    Android数据库高手秘籍(三)——使用LitePal升级表

    因此,升级表的操作对于任何一个项目也是至关重要的,那么今天我们就一起来学习一下,在Android传统开发当中升级表的方式,以及使用LitePal来进行升级表操作的用法。...如果你还没有看过前一篇文章,建议先去参考一下 Android数据库高手秘籍(二)——创建表和LitePal的基本用法 。...,我们先把news表删除掉,然后重新执行了一次onCreate()方法,这样就保证数据库中的表都是最新的了。...那么如果是从旧版本升级过来的呢?也没有问题,我们在onUpgrade()方法中已经把升级逻辑都处理好了,当oldVersion等于2的时候,会执行alter语句来添加publishdate这一列。...这大概就是传统开发当中升级数据库表的方式了,虽说能写出这样的代码表示你已经对数据库的升级操作理解的比较清楚了,但随着版本越来越多,onUpgrade()方法中的逻辑也会变得愈发复杂,稍微一不留神,也许就会产生错误

    99090

    Carson带你学Android:SQLlite数据库操作全解析(SQLiteOpenHelper类)

    数据库第1次创建时 则会调用,即 第1次调用 getWritableDatabase() / getReadableDatabase()时调用 // 在继承SQLiteOpenHelper类的子类中复写...数据库升级时自动调用 // 在继承SQLiteOpenHelper类的子类中复写 onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion...(SQLiteDatabase db) { // 创建数据库1张表 // 通过execSQL()执行SQL语句(此处创建了1个名为person的表...() * 调用时刻:当数据库升级时则自动调用(即 数据库版本 发生变化时) * 作用:更新数据库表结构 * 注:创建SQLiteOpenHelper子类对象时,必须传入一个...db.execSQL(sql); //数据库实际上是没有被创建或者打开的,直到getWritableDatabase() 或者 getReadableDatabase(

    98420

    Android SQLite数据库

    让onUpgrade()方法执行: SQLiteOpenHeloer的第四个参数版本号,当时传入的1,只要传入比1大的数就可以让onUpgrade执行。...升级数据库的最佳写法 之前升级数据库是简单的在onUpgrade()方法中删除当前所有表然后重新执行一遍onCreate()。 这样做的弊端为如果你的应用升级一次数据库用户之前的数据就会被清空。...当指定的数据库版本号大于当前数据库版本号的时候,就会进入onUpgrade()方法中执行更新操作,这里需要为每一个版本号赋予其所对应的数据库变动,然后再onUpgrade()方法中对当前数据库的版本号就行判断...这样当用户直接安装第2班程序时,就会进入onCreate()方法,将两张表一起创建,而当用户使用第2班的程序覆盖第1版的程序时,就会进入升级数据库的操作,由于Book已经存在,就会只创建个Category...老用户升级时如果当前数据库版本号为2就会执行alter命令,为Book表新增一个category_id列。

    2.1K20

    【Android从零单排系列四十二】《Android数据存储方式-SQLite数据库》

    数据库版本管理:如果需要修改数据库结构或添加新表,可以通过增加数据库版本号,并在SQLiteOpenHelper的onUpgrade方法中执行相应的数据库升级操作。...数据库迁移:当应用程序升级时,可能需要对数据库进行迁移操作,以保持数据的一致性。可以使用SQLiteOpenHelper的onUpgrade方法来执行迁移逻辑。...二 SQLite数据库使用方法 创建数据库和表: 创建一个继承自SQLiteOpenHelper的子类,并实现它的构造方法、onCreate()和onUpgrade()等方法。...你可以根据自己的具体需求,使用合适的SQL语句和API来完成数据库的增删改查操作。同时,要确保在进行数据库操作时遵循良好的数据库设计原则,并注意处理异常情况以及对数据库性能进行优化。...onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion):在数据库版本更新时调用,可以在其中执行数据迁移或更新表结构的操作。

    25630

    【Android】数据存储(三) 数据库(SQLite)

    SQLite 前言 之前介绍过Android中保存数据的两种方式:SharedPreferences和File,这篇介绍另一种存储数据的方式——数据库。...进入正题,在Android开发的过程中,保存数据是难免的。...可以填写null默认值; version:数据库版本,需要升级数据库时将版本号加一,将升级的内容写在onUpgrade中即可。...onUpgrade 数据库升级时会调用onUpgrade()方法,这里的onUpgrade()方法往user表中添加了性别(gender)属性。 操作数据库 操作数据库,增删查改是免不了的。...第一次使用id为1的用户; 第二次是年龄被修改为30的用户; 第三次是被删除的用户,因为用户不存在了,所以没有第三条log (由于helper.readAUser(1)没有获取到数据,返回null

    1.2K70

    Android十八章:是时候在你项目用上greenDAO3GreenDao

    +更加便捷生成DaoMaster和DaoSession 本文项目地址 首先让你的android studio配置Greendao数据库 在build.gradle目录下 dependencies {...代表自增长的id,你还可以为user表插入unique的userid User user1 = new User(null, "ag1", "123456"); User...下面来说GreenDao的升级数据库,在user表插入age 1、修改build.gradle下面的schemaVersion 2 2、在user类,新增age对象 public class User...Context,super(context,DB_NAME,null);还要重写onUpgrade方法(注意这里的参数一是Database),然后创建表(传入true,这里使用IF NOT EXISTS...改为自定义DBHelper,这样子升级数据库就不会丢失原来的数据了 DBHelper dbHelper = new DBHelper(context); DaoMaster daoMaster = new

    59130

    Android存储数据的三种方式

    今天来给大家讲一下Android中如何存储数据。我编写Android使用的是Java语言,所以今天讲的也是Java版的数据存储。在Android中,数据存储主要有三种,文件存储、Sp、SQLite。...文件存储就是我们平时的IO流,是非常传统的一种方式。而Sp是Android中的,利用XML文件存储数据的一种方式,要比文件存储简单。SQLite就是一个数据库了,基本操作和数据库大致一样。...我这里直接用#来拼接,这样是有问题的。这里只是为了方便。...获取的时候直接用存储时的文件名创建一个Sp对象,就可以读取数据: private void initData(){ //创建一个文件名为data的sp对象 SharedPreferences...onCreate()在数据库创建时调用,而onUpgrade()在数据库升级时调用()(Version改变时)。所以onCreate()用于初始化表结构、onUpgrade()用于更新表结构。

    1.2K20

    Android数据库多线程并发操作异常

    在我们做项目的过程中经常会有多线程异步处理的情况,那么Android中多线程操作数据我们一般会遇到什么样的问题?...同时进行数据库的读操作不会产生任何问题; 如果都需要创建表,那么多次创建可能会出现问题; android.database.sqlite.SQLiteException:table key_value_alerady...5) 因为Android的数据库默认配置是不支持多个多线程读写的,enableWriteAheadLogging=true 可以进行多线程的读写。...默认情况下, 连接池中只有一条主连接, 所以同一时间只能进行一项操作,多线程读写几乎是无用功; enableWriteAheadLogging()方法可以使得多链接并发查询可行,但默认没有开启该功能,...该方法会根据配置在连接池中创建多条连接; 为什么Android数据库链接池默认只有一条链接,请阅读 Android中的数据库连接池 这篇文章~!

    1.9K30
    领券