精华内容
下载资源
问答
  • 网络融合是当下最热门的话题之一。无线网络开始兴起,但有线网络还是主题,怎样使两网相容就是讨论的主要问题了。下文就将有线和无线网络整合需要的升级准备一一列出。希望对读者们有所帮助。
  • 网络融合是当下最热门的话题之一。无线网络开始兴起,但有线网络还是主题,怎样使两网相容就是讨论的主要问题了。下文就将有线和无线网络整合需要的升级准备一一列出。希望对读者们有所帮助。
  • 在命令行以sudo身份运行 R CMD INSTALL安装的包 或者 ...与以普通身份在Rstudio中安装的包不在同一个路径下,因此,如果存在包依赖或需要进行包的升级,需要以同样的身份安装后续包或者升级已有包。

    在命令行以sudo身份运行 R CMD INSTALL安装的包

    或者

    “以管理员身份运行“RStudio之后安装的包,

    与以普通身份在Rstudio中安装的包不在同一个路径下,因此,如果存在包依赖或需要进行包的升级,需要以同样的身份安装后续包或者升级已有包。

    展开全文
  • openssh升级

    千次阅读 2020-12-14 10:55:05
    升级前配置及说明 在实际生产环境中可能会进行安全扫描,如果你的机器openssh版本太低那么就会存在漏洞,而处理方法也很简单就是将openssh升级。由于openssh依赖于openssl所以升级openssh的同时需要一并升级openssl...

    升级前配置及说明

    在实际生产环境中可能会进行安全扫描,如果你的机器openssh版本太低那么就会存在漏洞,而处理方法也很简单就是将openssh升级。由于openssh依赖于openssl所以升级openssh的同时需要一并升级openssl,目前这里升级的版本为openssh-8.0p1openssl-1.0.2r.在升级的时候由于是通过源码编译的方式进行升级的所以还需要一些其他的依赖包。这些依赖包为了减少因为依赖以及版本的问题将通过yum来进行安装,没有网络需要通过光盘创建一个本地yum仓库。并且由于openssh为系统基础服务,升级失败会对系统产生很大的影响会导致服务器服无法通过ssh协议登录,所以升级前需要将整个系统进行备份,以及安装开启telnet服务。还有需要注意的是为了避免其他问题,在升级的时候建议使用root用户的权限来执行操作。在远程连接的时候由于是开启了telnet的,所以可以通过telnet来连接进行操作。这样可以避免权限以及程序占用的问题。由于centos6和centos7存在一定区别,所以两个版本我都会给出对应的命令。

    因为每个服务器的环境可能存在一定差异所以如果是升级生产的服务器建议在测试服务器中测试一遍

    安装开启telnet

    这一步一定要做,如果openssh升级失败,那通过ssh协议就连不上服务器了,这时我们就可以通过telnet来连接服务器进行回滚操作。不然你哭都不知道去那里哭

    • 查看是否已经安装了telnet

      • rpm -qa | grep telnet
        rpm -qa | grep xinetd
        
      • 已安装结果:

      • 在这里插入图片描述

    • 如果没有安装则进行安装

      • yum -y install xinetd
        yum -y install telnet
        yum -y install telnet-server
        
    • 配置telnet

      • centos6修改配置文件

        • 修改配置文件/etc/xinetd.d/telnet 将里面的”disable= yes”改成” disable=no” ,修改后结果
        • 在这里插入图片描述
      • centos7修改配置文件

        • 在/etc/securetty文件末尾增加一些pts终端,直接加在末尾就可以了

          • pts/0
            pts/1
            pts/2
            pts/3
            
      • 配置开机自启动

      • #centos6
        chkconfig --add xinetd
        chkconfig --add telnet
        chkconfig xinetd on 
        chkconfig telnet on
        #centos7
        systemctl enable xinetd
        systemctl enable telnet.socket
        systemctl start xinetd
        systemctl start telnet.socket
        
      • 防火墙开启23号端口,当然也可以直接关闭防火墙 ,这里选择关闭防火墙

      • #开启23号端口
        iptables -I INPUT -p tcp --dport 23 -jACCEPT 
        iptables -I INPUT -p udp --dport 23 -jACCEPT 
        #保存 
        service iptables save
        #重启防火墙 
        service iptables restart 
        
        #关闭防火墙!
        #centos6
        service iptables stop
        #centos7
        systemctl stop firewalld.service
        #查看防火墙状态
        #centos6
        service iptables status
        #centos7
        firewall-cmd --state
        
    • 测试telnet

      • telnet ip
        #或直接用远程连接工具选择telnet协议以及23号端口连接
        

    测试成功后telnet安装完成

    系统备份

    为了避免openssh升级导致ssh不可用,所以建议在升级前对系统进行备份。备份的方式有很多种,这里采用最简单的直接将文件打包备份,如果有更好的可以使用自己的方式。注意:这里最好用root用户执行

    备份方式,如果有自己的备份方式就使用自己的,这里只是给出一种备份方案。并且这种备份方式在恢复的时候需要重启机器。

    备份前准备:

    #在备份前先去看看openssh是否为开机自启动的,如果不是设置为开机自启动
    #centos6
    chkconfig --list
    #centos7
    systemctl  list-unit-files |  grep enable | grep sshd
    
    # 设置开机自启动
    #centos6
    chkconfig --add sshd
    chkconfig sshd on 
    #centos7
    systemctl enable sshd
    
    #查看SElinux是否为强制状态,如果是则修改为非强制状态
    #获取SElinux状态:
    getenforce
    #如果结果为enforcing,则进行修改
    setenforce 0
    #或修改配置文件,永久生效。
    #配置文件位置:/etc/sysconfig/selinux 以及 /etc/selinux/config
    #内容修改为
    SELINUX=permissive
    

    备份:

    
    #先创建备份目录
    mkdir /back_up
    #将还原脚本restore.sh上传到/back_up中
    
    #执行打包备份命令
    tar -czpvf /back_up/backup.tgz /etc /usr 2>>/back_up/tar.errors.log 
    #可能会有点久
    

    这里还原脚本内容为:

    #!/bin/bash
    tar -xzpvf /back_up/backup.tgz -C /;
    restorecon -Rv /;
    reboot;
    

    安装依赖包

    这里包括升级需要的组件以及跟编译相关的

    yum install  -y gcc gcc-c++ glibc make autoconf openssl openssl-devel pcre-devel  pam-devel
    yum install  -y pam* zlib*
    

    编译安装openssl和openssh

    这里需要使用有管理员权限的用户来执行,以及通过telnet连接来进行操作

    安装openssl

    1. openssl-1.0.2r.tar.gz上传到系统某个目录下面,这里上传到了/updatePackage下面

    2. 解压:tar xfz openssl-1.0.2r.tar.gz

    3. 备份会替换的文件

      mv /usr/bin/openssl /usr/bin/openssl_bak
      mv /usr/include/openssl /usr/include/openssl_bak
      
    4. 编译安装

      #进入openssl解压目录执行
       ./config shared && make && make install
       #执行完成后,查看是否编译安装成功
       echo $?
       #如果输出0表示没有问题
      
    5. 文件替换

      #为之前备份的2个文件或者目录做软链接 
      ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl
      ln -s /usr/local/ssl/include/openssl /usr/include/openssl
      
    6. 加载配置

      echo "/usr/local/ssl/lib" >> /etc/ld.so.conf
      /sbin/ldconfig
      
    7. 查看版本

      openssl version
      #如果版本为1.0.2r表示openssl升级成功
      

    安装openssh

    1. openssh-8.0p1.tar.gz上传到系统某个目录下面,这里上传到了/updatePackage下面

    2. 解压:tar xfz openssh-8.0p1.tar.gz

    3. 为了避免权限的问题可以在重新改一下权限:chown -R root.root /updatePackage/openssh-8.0p1

    4. 备份会替换的文件

      mv /etc/ssh /etc/ssh_back
      
    5. 执行编译安装

      ./configure --prefix=/usr/ --sysconfdir=/etc/ssh  --with-openssl-includes=/usr/local/ssl/include --with-ssl-dir=/usr/local/ssl   --with-zlib   --with-md5-passwords   --with-pam  && make && make install
       #执行完成后,查看是否编译安装成功
       echo $?
       #如果输出0表示没有问题
      
    6. 修改配置文件:/etc/ssh/sshd_config

      在配置文件中添加:PermitRootLogin yes(限定root用户通过ssh的登录方式,允许) 和 UseDNS no(ip反解,关闭),自己看情况是否需要这样做

      #查看修改后结果
      grep "^PermitRootLogin"  /etc/ssh/sshd_config
      grep  "UseDNS"  /etc/ssh/sshd_config
      #输出
      #PermitRootLogin yes
      #UseDNS no
      
    7. 文件替换

      cp -a /updatePackage/openssh-8.0p1/contrib/redhat/sshd.init /etc/init.d/sshd
      cp -a /updatePackage/openssh-8.0p1/contrib/redhat/sshd.pam /etc/pam.d/sshd.pam
      chmod +x /etc/init.d/sshd
      
    8. 添加开机自启动

      #centos6
      chkconfig --add sshd
      chkconfig sshd on 
      #centos7
      systemctl enable sshd
      #centos7还得多做一步,把原先的systemd管理的sshd文件删除或者移走或者删除,不移走的话影响我们重启sshd服务
      mv  /usr/lib/systemd/system/sshd.service  /back_up/
      
    9. 重启ssh

      #centos6
      service sshd restart
      #centos7
      systemctl restart sshd.service
      #看是否启动成功
      #启动成功后通过ssh -V查看版本结果应为:OpenSSH_8.0p1, OpenSSL 1.0.2r
      

    升级完成后处理

    成功

    升级完成后通过ssh来远程登录程序,没问题的话可以正常登录。然后有需要可以将telnet卸载,开机自启动删除,将23号端口的iptables规则删除。当然也可以不处理

    失败

    如果失败了,那么就将系统还原。

    #脚本添加运行权限,然后运行
    chmod +x /back_up/restore.sh
    nohup /back_up/restore.sh &
    

    注意:在运行这个脚本的时候备份文件必须要是/back_up/backup.tgz,如果备份的时候叫其他名称,请自行修改脚本。还有脚本不能运行为前台且跟终端相关进程,因为经测试发现在还原的时候ip会被冲掉。所以远程连接会断掉

    最后需要注意的是执行脚本会重启机器哦。

    展开全文
  • GreenDAO数据库升级

    千次阅读 2019-01-21 23:07:59
    GreenDao中数据库升级函数从数据库怎么的用法中讲如何修改升级如何避免删库删库问题解决了,那么我怎么升级啊???然后到了一个很关键的东西,修改实体类修改表结构信息添加表升级步骤整理 从代码角度浅析GreenDao...

    从代码角度浅析GreenDao的升级

    提示
    博主:不会随时间而改变的叫热爱 的博客
    博客地址:http://blog.csdn.net/qq_29924041


    前言

    最近在公司做项目的时候,因为要做数据缓存,所以就引入了现在极其非常流行的框架GreenDao,使用下来确实感觉方便快捷,懒人必备,只要写个实体类,基本上其他的都是用插件工具直接生成,简直不要太方便。但是前两天,因为同事在未进行数据库升级的基础上,直接对数据库结构,或者表结构信息等进行的修改,导致出现了一些异常崩溃情况。因为我之前做过的项目有一部分数据存储都是直接原生接口一路写下来的,所以也就想着怎么解决由于数据库版本管理不当导致的数据库升级异常。
    也在网上搜了一些数据库升级建议,方案,也在源码里面review了部分升级的代码。结合源码这些,再结合GreenDao实际操作的步骤,场景,做了点简单的总结

    GreenDao自带默认升级弊端:

    1.GreenDao对数据库升级函数做了重写,也就是默认情况下是会做删库,删表操作,导致数据丢失

    现行的方案
    2:在网上其实很多方案都是先将数据表中的数据进行一个备份,然后删表,建表,再做数据恢复动作。其实这种方案当然是有效的啊,but 在数据库版本控制过程中,其实对删库,删表动作有着极强的敏感性,所以有一个梗叫删库跑路,所以其实在升级过程中,如果实在没有办法进行规避的情况下,才做吧

    源码走一波先

    数据库升级需要哪些东西??

    数据库升级,顾明思议,其实也就是对数据库本身表进行增删改,对数据库表结构进行增删改改变化,由于本身android的sqlite数据库中有很强的前后版本关系,在前后升级的时候都是会有相应触发回调下来。但是你第一步要知道的就是所谓的升级,你需要哪些先决必要条件

    1:版本号控制,前后版本号肯定不能一致,也不能有降级操作
    2:需要修改的是什么??决定你要执行什么样的sql
    3:数据完整性上面要得到保证,我不能升级个数据库,完了就把我所有的数据都清掉了,那还不如不去升级

    下面之间low代码,还是从代码里面去看升级方式吧

    GreenDao中数据库升级函数

    首先数据库创建和管理的类都是的DaoMaster.DevOpenHelper,获取对应的Helper对象,不做过多应用,直接看源码

     /** WARNING: Drops all table on Upgrade! Use only during development. */
        public static class DevOpenHelper extends OpenHelper {
            public DevOpenHelper(Context context, String name) {
                super(context, name);
            }
    
            public DevOpenHelper(Context context, String name, CursorFactory factory) {
                super(context, name, factory);
            }
    
            @Override
            public void onUpgrade(Database db, int oldVersion, int newVersion) {
                Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables");
                dropAllTables(db, true);
                onCreate(db);
            }
        }
    

    源码中这个DebOpenHelper对象其实是一个静态的内部类,继承自OpenHelper,看到这几个函数,其实想到的应该SqliteOpenHelper里面也似曾相识啊,有一个doUpgrade方法

     @Override
            public void onUpgrade(Database db, int oldVersion, int newVersion) {
                Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables");
                dropAllTables(db, true);
                onCreate(db);
            }
    

    这里面就看到了,原来GreenDao数据库在升级的时候,是先dropAllTables(db, true);删除了所有数据库,然后又走了onCreate方法,难怪升级会删库重建表。

    再继续往下追一下,它的父类OpenHelper

     /**
         * Calls {@link #createAllTables(Database, boolean)} in {@link #onCreate(Database)} -
         */
        public static abstract class OpenHelper extends DatabaseOpenHelper {
            public OpenHelper(Context context, String name) {
                super(context, name, SCHEMA_VERSION);
            }
    
            public OpenHelper(Context context, String name, CursorFactory factory) {
                super(context, name, factory, SCHEMA_VERSION);
            }
    
            @Override
            public void onCreate(Database db) {
                Log.i("greenDAO", "Creating tables for schema version " + SCHEMA_VERSION);
                createAllTables(db, false);
            }
        }
    

    可以看到,父类又是一个叫DatabaseOpenHelper的类,但是构造函数其实都是继承于父类的实现形式,然后再onCreate中进行创建表的操作,但是很奇怪OpenHelper这个类使一个静态抽象内部类,但是没见到有抽象方法啊,完了我就又进去追了一把,找到DatabaseOpenHelper这个类。

    /**
     * SQLiteOpenHelper to allow working with greenDAO's {@link Database} abstraction to create and update database schemas.
     */
    public abstract class DatabaseOpenHelper extends SQLiteOpenHelper {
    
        private final Context context;
        private final String name;
        private final int version;
    
        private EncryptedHelper encryptedHelper;
        private boolean loadSQLCipherNativeLibs = true;
    
        public DatabaseOpenHelper(Context context, String name, int version) {
            this(context, name, null, version);
        }
    
        public DatabaseOpenHelper(Context context, String name, CursorFactory factory, int version) {
            super(context, name, factory, version);
            this.context = context;
            this.name = name;
            this.version = version;
        }
    
        /**
         * Flag to load SQLCipher native libs (default: true).
         */
        public void setLoadSQLCipherNativeLibs(boolean loadSQLCipherNativeLibs) {
            this.loadSQLCipherNativeLibs = loadSQLCipherNativeLibs;
        }
    
        /**
         * Like {@link #getWritableDatabase()}, but returns a greenDAO abstraction of the database.
         * The backing DB is an standard {@link SQLiteDatabase}.
         */
        public Database getWritableDb() {
            return wrap(getWritableDatabase());
        }
    
        /**
         * Like {@link #getReadableDatabase()}, but returns a greenDAO abstraction of the database.
         * The backing DB is an standard {@link SQLiteDatabase}.
         */
        public Database getReadableDb() {
            return wrap(getReadableDatabase());
        }
    
        protected Database wrap(SQLiteDatabase sqLiteDatabase) {
            return new StandardDatabase(sqLiteDatabase);
        }
    
        /**
         * Delegates to {@link #onCreate(Database)}, which uses greenDAO's database abstraction.
         */
        @Override
        public void onCreate(SQLiteDatabase db) {
            onCreate(wrap(db));
        }
    
        /**
         * Override this if you do not want to depend on {@link SQLiteDatabase}.
         */
        public void onCreate(Database db) {
            // Do nothing by default
        }
    
        /**
         * Delegates to {@link #onUpgrade(Database, int, int)}, which uses greenDAO's database abstraction.
         */
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            onUpgrade(wrap(db), oldVersion, newVersion);
        }
    
        /**
         * Override this if you do not want to depend on {@link SQLiteDatabase}.
         */
        public void onUpgrade(Database db, int oldVersion, int newVersion) {
            // Do nothing by default
        }
    
        /**
         * Delegates to {@link #onOpen(Database)}, which uses greenDAO's database abstraction.
         */
        @Override
        public void onOpen(SQLiteDatabase db) {
            onOpen(wrap(db));
        }
    
        /**
         * Override this if you do not want to depend on {@link SQLiteDatabase}.
         */
        public void onOpen(Database db) {
            // Do nothing by default
        }
    
        private EncryptedHelper checkEncryptedHelper() {
            if (encryptedHelper == null) {
                encryptedHelper = new EncryptedHelper(context, name, version, loadSQLCipherNativeLibs);
            }
            return encryptedHelper;
        }
    
        /**
         * Use this to initialize an encrypted SQLCipher database.
         *
         * @see #onCreate(Database)
         * @see #onUpgrade(Database, int, int)
         */
        public Database getEncryptedWritableDb(String password) {
            EncryptedHelper encryptedHelper = checkEncryptedHelper();
            return encryptedHelper.wrap(encryptedHelper.getWritableDatabase(password));
        }
    
        /**
         * Use this to initialize an encrypted SQLCipher database.
         *
         * @see #onCreate(Database)
         * @see #onUpgrade(Database, int, int)
         */
        public Database getEncryptedWritableDb(char[] password) {
            EncryptedHelper encryptedHelper = checkEncryptedHelper();
            return encryptedHelper.wrap(encryptedHelper.getWritableDatabase(password));
        }
    
        /**
         * Use this to initialize an encrypted SQLCipher database.
         *
         * @see #onCreate(Database)
         * @see #onUpgrade(Database, int, int)
         */
        public Database getEncryptedReadableDb(String password) {
            EncryptedHelper encryptedHelper = checkEncryptedHelper();
            return encryptedHelper.wrap(encryptedHelper.getReadableDatabase(password));
        }
    
        /**
         * Use this to initialize an encrypted SQLCipher database.
         *
         * @see #onCreate(Database)
         * @see #onUpgrade(Database, int, int)
         */
        public Database getEncryptedReadableDb(char[] password) {
            EncryptedHelper encryptedHelper = checkEncryptedHelper();
            return encryptedHelper.wrap(encryptedHelper.getReadableDatabase(password));
        }
    
        private class EncryptedHelper extends net.sqlcipher.database.SQLiteOpenHelper {
            public EncryptedHelper(Context context, String name, int version, boolean loadLibs) {
                super(context, name, null, version);
                if (loadLibs) {
                    net.sqlcipher.database.SQLiteDatabase.loadLibs(context);
                }
            }
    
            @Override
            public void onCreate(net.sqlcipher.database.SQLiteDatabase db) {
                DatabaseOpenHelper.this.onCreate(wrap(db));
            }
    
            @Override
            public void onUpgrade(net.sqlcipher.database.SQLiteDatabase db, int oldVersion, int newVersion) {
                DatabaseOpenHelper.this.onUpgrade(wrap(db), oldVersion, newVersion);
            }
    
            @Override
            public void onOpen(net.sqlcipher.database.SQLiteDatabase db) {
                DatabaseOpenHelper.this.onOpen(wrap(db));
            }
    
            protected Database wrap(net.sqlcipher.database.SQLiteDatabase sqLiteDatabase) {
                return new EncryptedDatabase(sqLiteDatabase);
            }
    
        }
    }
    

    这个类乍一看真是又臭又长,找重点,
    第一父类还是SQLiteOpenHelper,也就是其实所有的数据库调用创建和升级的形式依旧逃不过安卓提供的机制

    第二创建函数和升级函数,看看升级函数是啥onUpgrade,只是在原来基础上做了一次重写

       /**
         * Delegates to {@link #onUpgrade(Database, int, int)}, which uses greenDAO's database abstraction.
         */
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            onUpgrade(wrap(db), oldVersion, newVersion);
        }
    
        /**
         * Override this if you do not want to depend on {@link SQLiteDatabase}.
         */
        public void onUpgrade(Database db, int oldVersion, int newVersion) {
            // Do nothing by default
        }
    

    但是在这个函数 public void onUpgrade(Database db, int oldVersion, int newVersion) {}中并没有具体的实现体,然后回过头来再看子类有没有具体的实现,再一看,不就是DevOpenHelper中的升级方法么。

     @Override
            public void onUpgrade(Database db, int oldVersion, int newVersion) {
                Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables");
                dropAllTables(db, true);
                onCreate(db);
            }
    

    现在应该知道onUpgrade的调用流程了吧。。。。

    从数据库怎么的用法中讲如何修改升级

    如何避免删库

    官方开源代码中的example是这样写的

     // regular SQLite database
            DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "notes-db");
            Database db = helper.getWritableDb();
    
            // encrypted SQLCipher database
            // note: you need to add SQLCipher to your dependencies, check the build.gradle file
            // DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "notes-db-encrypted");
            // Database db = helper.getEncryptedWritableDb("encryption-key");
    
            daoSession = new DaoMaster(db).newSession();
    

    但是我对它的使用其实做了一点修改

     // regular SQLite database
            DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "notes-db"){
                public void onUpgrade(Database db, int oldVersion, int newVersion){
                    super.onUpgrade(db,oldVersion,newVersion);
                }
            };
    

    现在可以看到吧,其实在拿到helper对象的时候,就是可以去去监听具体的升级回调以及升级函数的。运用java基础知识,如果我不想用父类的方法,这个时候我改怎么办???直接注释掉不就行了啊。这样数据库版本号修改的时候,最起码不会删库了吧

    删库问题解决了,那么我怎么升级啊???

    先修改build.gradle下的数据库版本号

    
    greendao{
            schemaVersion 3
            daoPackage 'com.example.test'
            targetGenDir 'src/main/java'
    }
    

    当数据库检测到schemaVersion版本号上升之后,这个时候就会触发onUpgrade函数,然后在函数方法内部做sql

     // regular SQLite database
            DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "notes-db"){
                public void onUpgrade(Database db, int oldVersion, int newVersion){
                    db.execSQL(StringHandler.append("ALTER TABLE"," user_info"," ADD ","type"," TEXT "));
                }
            };
    

    直接在onUpgrade中执行我要修改的表的信息没毛病吧??这样不就可以对表进行改变了,而且不会删库。。

    但是这样写又面临一个问题,就是如果我每次升级的话,那不是每次都会执行啊???
    确实是这样的,所以在数据升级的过程中,可能我们自己需要比数据库更要只要当前版本号,和未来升级的版本号是多少

    正确代码应该如下所示:

     // regular SQLite database
            DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "notes-db"){
                public void onUpgrade(Database db, int oldVersion, int newVersion){
                	int currentVersion = 0;
                	if(oldVersion == 3){
                		//修改表结构信息
                    	db.execSQL(StringHandler.append("ALTER TABLE"," user_info"," ADD ","type"," TEXT "));
                    	currentVersion = newVersion;
                    }
                    if(oldVersion == 4){
                    	//修改表结构信息
    					db.execSQL(StringHandler.append("ALTER TABLE"," user_info"," ADD ","num"," TEXT "));
                    	currentVersion = newVersion;
    				}
    				if(oldVersion == 5){
    					PersonDao.createTable(db,true);
    					currentVersion = newVersion;
    				}
    				if(currentVersion != newVersion){
    					super.onUpgrade(db,oldVersion,newVersion);
    				}
                }
            };
    

    以上代码主要就是当前的版本号,升级之后的版本号,进行判断,从而决定执行的sql类型,避免在升级过程中执行到错误的sql语句,
    从代码里面其实可以看到,super的方法永远不会走,因为每次升级的时候,currentVersion应该都是和newVersion相等的,其实这部分留在这,也是为了给自己一个提示吧。

    然后到了一个很关键的东西,修改实体类

    就是我通过onUpgrade升级之后,表也改了,GreenDao提供的实体类存取性质还存在么??

    答案当然是存在的

    修改表结构信息

    答案是当然是存在的,GreenDao是一整个从编译到运行都提供了完整的方案,
    首先把你要添加的实体类的字段与在onUpgrade中的数据字段操作保持一个,如在上面sql中我给user_info添加了一个text属性,那么我在修改UserInfo这个实体类的时候,我就需要添加一个String num的属性。

    String num;
    

    自动化编译开始:CTRL+F9,自动在UserInfo这个类中添加响应函数,以及必要信息。自动编译生成UserInfoDao,这个时候升级完成的数据表的字段,与实体类的字段就是一个一一对应的关系。

    添加表

    那添加表应该怎么操作,
    操作步骤如上,第一步先自建一个实体类,比如Person这个类,然后完成GreenDao建表的必要不步骤
    第二部自动化编译开始:CTRL+F9,自动在Book这个类中添加相应函数,以及必要信息。自动编译生成PersonDao
    这个时候会再BookDao中生成静态函数

    @Entity(nameInDb = "person")
    public class Person{
    	 @Id(autoincrement = true)
        private Long id;
        @Property(nameInDb = "name")
        private String name1;
        private int age;
        @Transient
        private int gender;
    }
    

    在生成的PersonDao中的静态函数

      /** Creates the underlying database table. */
        public static void createTable(Database db, boolean ifNotExists) {
            String constraint = ifNotExists? "IF NOT EXISTS ": "";
            db.execSQL("CREATE TABLE " + constraint + "\"person\" (" + //
                    "\"_id\" INTEGER PRIMARY KEY AUTOINCREMENT ," + // 0: id
                    "\"name\" TEXT," + // 1: name1
                    "\"AGE\" INTEGER NOT NULL );"); // 2: age
        }
    

    建表函数,有了这个建表函数,其实我们就可以直接在onUpgrade中直接进行调用了啊,何必费事自己写Create table 语句

    if(oldVersion == 5){
    					PersonDao.createTable(db,true);
    					currentVersion = newVersion;
    				}
    

    这个时候升级的表也已经建立好了,数据库表信息也没删,然后又保持了GreenDao中具体的接口的完整性。

    升级步骤整理

    我简单整理了下升级需要操作顺序性啊:
    1:要知道升级什么,就需要先对实体类进行优化,修改哪个字段,增加什么样的表格

    2:CTRL+F9 这个就不解释了,调用GreenDao插件,然后生成必要的Dao文件,Master等等

    3:查看之前的版本,以及即将要升级的版本号,重写onUpgrade方法也是最重要的,然后通过前后版本号的区分,执行不同的sql语句,达到对数据库表以及结构的修改

    4:当然是修改build.gradle中的schemaVersion 1 //数据库版本号

    以上方法亲测过,没遇到什么问题,你再也不需要担心数据表丢失。

    欢迎继续访问,我的博客

    展开全文
  • 区块链与大数据究竟有着怎样关系?进入大数据时代,云计算成为大数据基础设施,也使得大数据的核心思想和云计算一脉相承。大数据和区块链两者之间有个共同的关键词:分布式,代表了一种从技术权威垄断到去中心化的...

    今天,很多人还没弄懂大数据,区块链又来了。区块链与大数据究竟有着怎样的关系?

    进入大数据时代,云计算成为大数据基础设施,也使得大数据的核心思想和云计算一脉相承。

    大数据和区块链两者之间有个共同的关键词:分布式,代表了一种从技术权威垄断到去中心化的转变。


    区块链让数据真正“放心”流动起来

    区块链以其可信任性、安全性和不可篡改性,让更多数据被解放出来。用一个典型案例来说明,即区块链是如何推进基因测序大数据产生的。区块链测序可以利用私钥限制访问权限,从而规避法律对个人获取基因数据的限制问题,并且利用分布式计算资源,低成本完成测序服务。区块链的安全性让测序成为工业化的解决方案,实现了全球规模的测序,从而推进数据的海量增长。

    分布式的储存

    大数据,指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。大数据需要应对海量化和快增长的存储,这要求底层硬件架构和文件系统在性价比上要大大高于传统技术,能够弹性扩张存储容量。

    区块链,是比特币的底层技术架构,它在本质上是一种去中心化的分布式账本。区块链技术作为一种持续增长的、按序整理成区块的链式数据结构,通过网络中多个节点共同参与数据的计算和记录,并且互相验证其信息的有效性。从这一点来说,区块链技术也是一种特定的数据库技术。由于去中心化数据库在安全、便捷方面的特性,很多业内人士看好其发展,认为它是对现有互联网技术的升级与补充。区块链则是纯粹意义上的分布式系统。

    分布式计算

    大数据的分析挖掘是数据密集型计算,需要巨大的分布式计算能力。节点管理、任务调度、容错和高可靠性是关键技术。Google是这种分布式计算技术的代表,通过添加服务器节点可线性扩展系统的总处理能力,在成本和可扩展性上都有巨大的优势。现在,除了批计算,大数据还包括了流计算、图计算、实时计算、交互查询等计算框架。

    区块链的共识机制,就是所有分布式节之间怎么达成共识,通过算法来生成和更新数据,去认定一个记录的有效性,这既是认定的手段,也是防止篡改的手段。区块链主要包括四种不同的共识机制,适用于不同的应用场景,在效率和安全性之间取得平衡。以比特币为例,采用的是“工作量证明”,只有在控制了全网超过51%的记账节点的情况下,才有可能伪造出一条不存在的记录。

    大数据与区块链的不同点

    2011年,“大数据”第一次上榜,位于技术萌芽期的爬坡阶段,当时还统称为“Big Data and Extreme Information Processing and Management”(“大数据”和极端信息处理和管理)。2012年更进一步,并在2013年几乎达到了过热期顶峰。经历了2014年的下滑,从2015年开始,“大数据”突然从曲线中消失,可解读为Gartner对大数据的定位已从“新兴”转为“主流”。当前,大数据对于企业的意义已从能力要素上升为战略核心。相对而言,“区块链”直到2016年才第一次出现在《技术成熟度曲线》中,并直接进入“过热期”。总的来看,“大数据”和“区块链”所处的生命周期阶段大不相同,两者约有5年左右的差距。

    大数据通常用来描述数据集足够大,足够复杂,以致很难用传统的方式来处理。区块链能承载的信息数据是有限的,离“大数据”标准还差得很远。

    大数据与区块链的差异:

    结构化 vs 非结构化:区块链是结构定义严谨的块,通过指针组成的链,典型的结构化数据,而大数据需要处理的更多的是非结构化数据。

    独立 vs 整合:区块链系统为保证安全性,信息是相对独立的,而大数据着重的是信息的整合分析。

    直接 vs 间接:区块链系统本身就是一个数据库,而大数据指的是对数据的深度分析和挖掘,是一种间接的数据。

    数学 vs 数据:区块链试图用数学说话,区块链主张“代码即法律”,而大数据试图用数据说话。

    匿名 vs 个性:区块链是匿名的(公开账本,匿名拥有者,相对于传统金融机构的公开账号,账本保密),而大数据有意的是个性化。

    在区块链中使用大数据技术

    区块链是一种不可篡改的、全历史的分布式数据库存储技术,巨大的区块链数据集合包含着每一笔交易的全部历史,随着区块链技术的应用迅速发展,数据规模会越来越大,不同业务场景区块链的数据融合会进一步扩大数据规模和丰富性。

    区块链以其可信任性、安全性和不可篡改性,让更多数据被解放出来,推进数据的海量增长。

    区块链的可追溯性使得数据从采集、交易、流通,以及计算分析的每一步记录都可以留存在区块链上,使得数据的质量获得前所未有的强信任背书,也保证了数据分析结果的正确性和数据挖掘的效果。

    区块链能够进一步规范数据的使用,精细化授权范围。脱敏后的数据交易流通,则有利于突破信息孤岛,建立数据横向流通机制,形成“社会化大数据”。基于区块链的价值转移网络,逐步推动形成基于全球化的数据交易场景。

    区块链提供的是账本的完整性,数据统计分析的能力较弱。大数据则具备海量数据存储技术和灵活高效的分析技术,极大提升区块链数据的价值和使用空间。

    Bingdata优网助帮汇聚多平台采集的海量数据,通过大数据技术的分析及预测能力为企业提供智能化的数据分析、运营优化、投放决策、精准  营销、竞品分析等整合营销服务。

    北京优网助帮信息技术有限公司(简称优网助帮)是以大数据为基础,并智能应用于整合营销的大数据公司,隶属于亨通集团。Bingdata是其旗下品牌。优网助帮团队主要来自阿里、腾讯、百度、金山、搜狐及移动、电信、联通、华为、爱立信等著名企业的技术大咖,兼有互联网与通信运营商两种基因,为大数据的算法分析提供强大的技术支撑。

     

     

    展开全文
  • 选择关系型数据库还是非关系型数据库.
  • 只需升级:PostgreSQL12怎样提升性能

    千次阅读 2019-09-20 12:32:33
    只需升级:PostgreSQL12怎样提升性能 翻译自:PostgreSQL Performance 世界上最先进的开源关系型数据库的最新版本PostgreSQL 12即将在最近的几周内发布,除非出现任何挫折。在此之前,该项目每年提供一次新的数据库...
  • android升级升级包的制作

    千次阅读 2015-04-21 09:34:21
    1、前言 最近刚好在做android升级这一块,这是我在工作中总结和参考网上资料整理出来的文档,...当然说到升级,当然就要有升级包,升级包又分为完整包和增量包,所以我们得先从制作升级包说起。然后是Android系统的
  • 文章目录因果关系的三个层级迷你图灵测试论概率与因果关系 上帝问的是“什么”,他们回答的却是“为什么”。上帝询问事实,他们回答理由。 而且,两人都深信,列举原因可以以某种方式美化他们的行为。他们是从哪里得到...
  • QEMU版本升级

    千次阅读 2019-04-23 11:17:58
    QEMU版本升级卸载QEMU依赖包安装源码下载及编译安装创建链接版本检查 部署环境:CentOS7.6 原QEMU版本:1.5.3 目标QEMU版本:3.1.0 卸载QEMU [root@Dell ~]# yum -y remove qemu-kvm 由于有依赖的关系,除了卸掉...
  • 由于工作需要,把AS的版本从现在的4.0.1版本升级到4.2.1版本,为了把项目迁移到AndroidX的各种依赖库上去,在升级AS的时候直接在菜单栏--->Help中check for updates,后面就直接升级了。 二、升级AS4.2.1遇到...
  • 在红烧肉HSR上线公链之后升级为HC 目前要全力打造共识, 正式招募全球300个资本社区节点加盟 HC超级社区团队领秀人威 芯: kygj1431 本团队直接对接许子敬总裁,第一手资讯,欢迎团队长对接合作共赢!
  • OTA制作及升级过程

    千次阅读 2019-04-16 17:48:06
    OTA制作及升级过程1、概述1.1 文档概要前段时间学习了AndroidRecovery模式及OTA升级过程,为加深理解和防止以后遗忘,所以写这篇文档进行一个总结和梳理,以便日后查阅回顾。文档主要包括两部分,第一部分为OTA升级...
  • SpringMVC项目升级SpringBoot项目参考

    千次阅读 2019-07-30 19:51:35
    升级原因 首先纠正以前一个错误认识:SpringMVC与SpringBoot没有半毛钱关系! Spring Boot本身并不提供Spring框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于Spring框架的应用程序。也就是说,...
  • 当你计划你的升级过程中,您就可以准备群集升级。此页面包含操作步骤,您现在可以执行,而现有集群已全面投入使用。 此页面包含了以下主题:  1。验证所有节点的系统要求 2。准备包和库的升级 3。阶段配置...
  • OTA制作及升级过程笔记

    千次阅读 2017-11-02 14:56:57
    1、概述 ...文档主要包括两部分,第一部分为OTA升级包的制作过程分析,第二部分为Recovery模式下OTA升级包安装过程的分析,其中包括Recovery模式分析及服务流程。 1.2 参考文献 《Recovery 开发指导》
  • 升级厂家源码的方法

    2015-03-25 23:14:10
    升级厂商代码的方法总结,希望对大家以后的项目有帮助,在以后会慢慢更新这些文字
  • NoSQL与关系型数据库全面对比

    千次阅读 2020-09-01 09:56:17
    我们总在说各种数据库的使用,以及各个数据库的优缺点,每个数据库都有自己的所擅长的领域,但选择什么的数据库才是重点,那么问题来了,数据库到底是怎么划分的,有什么讲究呢? 数据库大致分为两大类:关系型...
  • 线上升级Redis纪实

    千次阅读 2017-10-27 16:27:50
    然后通过一个redis-cli的monitor命令监视下slave,看看在master中的某些key发生变化的时候,slave会做出什么的反应。 下面让7777作为6666的slave。 同时在7777server的终端下会出现其作为6666的slave...
  • 怎样将 Debian 3.1 Sarge 升级到 4.0 Etch

    千次阅读 2007-04-11 20:42:00
    怎样将 Debian 3.1 Sarge 升级到 4.0 Etch Submitted by larry on Mon, 2007-04-09 15:34. Debian, etch, Sarge, 升级 <!--google_ad_client = "pub-2487486127216473";google_ad_type =
  • 企业转型升级怎么落实?

    千次阅读 热门讨论 2009-08-12 08:44:00
    我们要打造一个对于消费者感知来说什么的品牌,我们的产品应该怎么设计,我们的定价应该如何,我们的店面应该如何,我们的网站应该如何,我们的广告应该如何,我们的社会形象应该如何?这都是分解到各个部门各个...
  • HDFS的滚动升级: Rolling Upgrade

    千次阅读 2016-07-28 19:46:01
    可能看完官方文档的解释,我们还是会有点迷惑,没有关系,下面我们直接定位到相关代码,来深入了解其背后的操作原理. hdfs dfsadmin的入口类为DFSAdmin,顺着此类,我们可以找到对应服务端的处理方法,在...
  • 对象关系映射

    万次阅读 2007-04-20 19:51:00
    作者:林学鹏ORM的全称是Object Relational Mapping,即对象关系映射。它的实质就是将关系数据(库)中的业务数据用对象的形式表示出来,并通过面向对象(Object-Oriented)的方式将这些对象组织起来,实现系统业务...
  • 手动创建repomd.xml (存放rpm安装依赖关系的文件) 正是因为有了rpm安装包之间的依赖关系,而无需管理员逐个、手工的去安装每一个rpm包。 将系统光盘挂载到mnt/目录下 [root@localhost ~]# mount /dev/cdrom /...
  • 有不少朋友问到C#Winform程序怎么样配置升级怎么样打包,怎么样发布的,在这里我解释一下打包和发布 关于打包的大家可以看我的文章C# winform程序怎么打包成安装项目(图解) 其实打包是打包,发布是发布两者是...
  • 随着SSD的发展,只要电脑一卡顿,人们会第一想的是换SSD就可以升级电脑性能,其实不尽然。电脑卡顿跟固态硬盘固然有关系,但是它跟CPU和内存条的关系也很多,接下来带大家了解下三者之间的关系。 CPU是一块超大规模...
  • WIN7系统下如何把IE8升级成IE9

    万次阅读 2018-03-26 18:25:04
    Windows7系统升级IE8为IE9
  • 浅谈以太坊智能合约的设计模式与升级方法 1. 最佳实践 2. 实用设计案例 2.1 控制器合约与数据合约: 1->1 2.2 控制器合约与数据合约: 1->N 2.3 控制器合约与数据合约: N->1 2.4 控制器合约与...
  • 用实体关系图进行数据库建模

    千次阅读 2018-11-07 13:56:46
    用实体关系图进行数据库建模

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 79,465
精华内容 31,786
关键字:

怎样升级关系