Reaml 数据库版本升级

本文介绍了一个使用Java实现的Realm数据库迁移示例。当数据库版本从1升级到2时,该示例展示了如何添加新的字段'sex'到现有的'Person'表中,并通过示例代码演示了数据的插入和查询过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import io.realm.DynamicRealm;
import io.realm.RealmMigration;
import io.realm.RealmObjectSchema;
import io.realm.RealmSchema;

/**
 * 修改版本号后会执行此代码
 * 当版本号修改为 2 时 ,判断老版本号为1时此处举 例如 添加字段 'sex'
 *
 */
public class DbMigration implements RealmMigration {

    @Override
    public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {

        RealmSchema schema = realm.getSchema();

         if (oldVersion == 1){
             RealmObjectSchema petSchema = schema.get("Person");
             petSchema.addField("sex",int.class,null);
             oldVersion++;
        }
    }
}
findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Person person = new Person();
                person.setAge(11);
                person.setName("xiao");
                person.setSex(1);
                realm.beginTransaction();
                realm.copyToRealmOrUpdate(person);
                realm.commitTransaction();
                Log.i("insert ------", "" + person.getName() + " " + person.getAge());

            }
        });

        //2
        findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Person person = realm.where(Person.class).equalTo("name","xiao").findFirst();
                Log.i("info ------","" + person.getName() + " "+ person.getAge() +"  "+person.getSex());
            }
        });

官网 https://realm.io/docs/java/latest/
<think>好的,我现在需要帮助用户了解如何使用Shiro框架通过INI配置和JDBC Realm进行项目搭建。首先,我需要回顾用户提供的引用内容,看看有哪些相关信息可以利用。 用户提到了三个引用:第一个引用[^1]指出JdbcRealm灵活性不足,可能需要自定义Realm。第二个引用[^2]提到已经存在的数据库结构和包结构,如dao、pojo、utils,以及jdbc.properties配置文件。第三个引用[^3]提到Shiro的INI配置类似于Spring的IoC容器,从securityManager根对象开始。 用户的问题是关于使用Shiro的INI配置和JDBC Realm实现用户认证和授权的示例教程。我需要结合这些引用来构建一个清晰的步骤说明。 首先,Shiro的核心是通过SecurityManager来管理安全操作,而INI配置是用来初始化这些组件的。虽然JdbcRealm可能存在灵活性限制,但用户可能还是想先了解基础配置,后续再考虑自定义Realm。引用[^2]提到已有的数据库结构,所以需要配置数据源,连接到用户的数据库。 接下来,步骤可能包括:1. 添Shiro依赖;2. 配置INI文件,包括数据源、JdbcRealm、SecurityManager;3. 实现用户认证和授权的代码示例。 需要注意的是,用户可能已经有一些现有的数据库和结构,如用户、角色、权限。需要明确这些的结构是否符合JdbcRealm的默认查询,或者是否需要自定义SQL。例如,JdbcRealm默认可能查询users,用户是否遵循了这样的结构?如果不同,可能需要调整SQL语句,如引用[^2]提到的自定义Realm。 此外,引用[^1]提到自定义Realm的情况,但用户的问题是关于JDBC Realm的,所以可能需要先展示基础配置,再提到如果默认配置不满足时如何扩展。 在示例代码部分,需要展示如何载INI配置,获取SecurityManager,执行登录和权限检查。同时,要处理可能的异常,比如认证失败的情况。 可能还需要提到如何配置jdbc.properties文件,设置数据库连接参数,然后在INI文件中引用这些参数。引用提到jdbc.properties已经存在,所以需要说明如何将INI配置与现有的属性文件结合使用。 最后,生成的相关问题需要考虑用户可能的后续疑问,比如自定义Realm密配置、动态权限管理等,这有助于用户进一步探索。 现在需要将这些思考整理成一个结构化的回答,确保步骤清晰,代码示例正确,并正确引用提供的资料。同时,按照用户的格式要求,使用$...$和$$...$$格式的数学达式,但在这个上下文中可能不涉及数学公式,所以可能不需要使用。但需要检查是否有地方需要用到,比如如果有算法说明,但目前看来主要是配置和代码,可能不需要数学达式。不过仍需遵守用户的指令,确保行内达式正确。 最后,验证所有步骤是否符合Shiro的实际配置方式,确保示例代码正确无误,特别是SQL查询部分是否正确,以及权限检查的方法是否正确使用。</think>### Shiro框架通过INI配置和JDBC Realm实现认证授权 #### 一、环境准备 1. 添Maven依赖 ```xml <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.9.0</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-jdbc</artifactId> <version>1.9.0</version> </dependency> ``` 2. 数据库准备(需符合JdbcRealm默认结构) - 用户:`users(username, password)` - 角色:`user_roles(username, role_name)` - 权限:`roles_permissions(role_name, permission)` #### 二、INI配置实现 创建`shiro-jdbc.ini`文件: ```ini [main] # 配置数据源 dataSource = org.apache.commons.dbcp2.BasicDataSource dataSource.driverClassName = com.mysql.jdbc.Driver dataSource.url = jdbc:mysql://localhost:3306/testdb dataSource.username = root dataSource.password = 123456 # 配置JDBC Realm jdbcRealm = org.apache.shiro.realm.jdbc.JdbcRealm jdbcRealm.dataSource = $dataSource jdbcRealm.authenticationQuery = SELECT password FROM users WHERE username = ? jdbcRealm.userRolesQuery = SELECT role_name FROM user_roles WHERE username = ? jdbcRealm.permissionsQuery = SELECT permission FROM roles_permissions WHERE role_name = ? # 启用权限缓存 jdbcRealm.authorizationCachingEnabled = true securityManager.realms = $jdbcRealm ``` #### 三、认证授权实现 ```java public class ShiroJDBCDemo { public static void main(String[] args) { Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro-jdbc.ini"); SecurityManager securityManager = factory.getInstance(); SecurityUtils.setSecurityManager(securityManager); // 用户认证 Subject currentUser = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken("admin", "secret"); try { currentUser.login(token); System.out.println("认证成功"); // 权限验证 if(currentUser.hasRole("admin")) { System.out.println("拥有admin角色"); } if(currentUser.isPermitted("user:delete")) { System.out.println("拥有删除用户权限"); } } catch (AuthenticationException ae) { System.out.println("认证失败: " + ae.getMessage()); } } } ``` #### 四、关键配置说明 1. `authenticationQuery`:定义用户认证SQL查询,返回密码用于比对[^2] 2. `userRolesQuery`:获取用户角色信息的SQL语句 3. `permissionsQuery`:获取角色权限的SQL语句 4. 通过`securityManager.realms`注册Realm实现[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值