void Connect(int rpUserID)
        {
            if (r_UserID == rpUserID)
                return;

            Resources?.Dispose();
            Ships?.Dispose();
            Experience?.Dispose();
            Expedition?.Dispose();
            Construction?.Dispose();
            Development?.Dispose();
            Sortie?.Dispose();
            Battle?.Dispose();
            RankingPointBonus?.Dispose();
            Fate?.Dispose();
            QuestProgress?.Dispose();
            BattleDetail?.Dispose();

            if (r_Connection != null)
            {
                r_Connection.Update -= OnDatabaseUpdate;

                r_Connection.Dispose();
            }

            foreach (var rCustomGroup in r_CustomRecordsGroups.Values)
                rCustomGroup.Dispose();

            IsConnected = false;

            r_UserID = rpUserID;

            r_Connection = new SQLiteConnection($@"Data Source=Records\{r_UserID}.db;Page Size=8192").OpenAndReturn();

            if (IsReadOnlyMode)
                using (var rSourceConnection = r_Connection)
                {
                    r_Connection = new SQLiteConnection("Data Source=:memory:;Page Size=8192").OpenAndReturn();
                    rSourceConnection.BackupDatabase(r_Connection, "main", "main", -1, null, 0);
                }

            using (var rTransaction = r_Connection.BeginTransaction())
            {
                CheckVersion();

                Resources = new ResourcesRecords(r_Connection).ConnectAndReturn();
                Ships = new ShipsRecords(r_Connection).ConnectAndReturn();
                Experience = new ExperienceRecords(r_Connection).ConnectAndReturn();
                Expedition = new ExpeditionRecords(r_Connection).ConnectAndReturn();
                Construction = new ConstructionRecords(r_Connection).ConnectAndReturn();
                Development = new DevelopmentRecords(r_Connection).ConnectAndReturn();
                Sortie = new SortieRecords(r_Connection).ConnectAndReturn();
                Battle = new BattleRecords(r_Connection).ConnectAndReturn();
                RankingPointBonus = new RankingPointBonusRecords(r_Connection).ConnectAndReturn();
                Fate = new FateRecords(r_Connection).ConnectAndReturn();

                QuestProgress = new QuestProgressRecords(r_Connection).ConnectAndReturn();

                foreach (var rProvider in r_CustomRecordsGroupProviders)
                {
                    var rGroup = rProvider.Create(r_Connection).ConnectAndReturn();
                    r_CustomRecordsGroups[rGroup.GroupName] = rGroup;
                }

                rTransaction.Commit();
            }

            BattleDetail = new BattleDetailRecords(r_Connection, r_UserID).ConnectAndReturn();

            r_Connection.Update += OnDatabaseUpdate;

            IsConnected = true;
        }
        void Connect(int rpUserID)
        {
            if (r_UserID == rpUserID)
                return;

            Disconnect();

            r_UserID = rpUserID;

            var rFilename = r_UserID + ".db";
            var rDatabaseFile = new FileInfo(Path.Combine(RecordDirectory.FullName, rFilename));

            if (!rDatabaseFile.Exists)
                TryMigrateFromOldVersion(rFilename, rDatabaseFile);

            r_Connection = new SQLiteConnection($@"Data Source={rDatabaseFile.FullName}; Page Size=8192").OpenAndReturn();

            if (IsReadOnlyMode)
                using (var rSourceConnection = r_Connection)
                {
                    r_Connection = new SQLiteConnection("Data Source=:memory:; Page Size=8192").OpenAndReturn();
                    rSourceConnection.BackupDatabase(r_Connection, "main", "main", -1, null, 0);
                }

            using (var rCommand = r_Connection.CreateCommand())
            {
                rCommand.CommandText =
                    "PRAGMA journal_mode = DELETE; " +
                    "PRAGMA foreign_keys = ON;";

                rCommand.ExecuteNonQuery();
            }

            using (var rTransaction = r_Connection.BeginTransaction())
            {
                CheckVersion();

                Resources = new ResourcesRecords(r_Connection).ConnectAndReturn();
                Experience = new ExperienceRecords(r_Connection).ConnectAndReturn();
                Expedition = new ExpeditionRecords(r_Connection).ConnectAndReturn();
                Construction = new ConstructionRecords(r_Connection).ConnectAndReturn();
                Development = new DevelopmentRecords(r_Connection).ConnectAndReturn();
                Sortie = new SortieRecords(r_Connection).ConnectAndReturn();
                Battle = new BattleRecords(r_Connection).ConnectAndReturn();
                Fate = new FateRecords(r_Connection).ConnectAndReturn();
                r_RankingPoints = new RankingPointsRecords(r_Connection).ConnectAndReturn();
                r_SortieConsumption = new SortieConsumptionRecords(r_Connection).ConnectAndReturn();

                QuestProgress = new QuestProgressRecords(r_Connection).ConnectAndReturn();

                foreach (var rProvider in r_CustomRecordsGroupProviders)
                {
                    var rGroup = rProvider.Create(r_Connection).ConnectAndReturn();
                    r_CustomRecordsGroups[rGroup.GroupName] = rGroup;
                }

                rTransaction.Commit();
            }

            BattleDetail = new BattleDetailRecords(r_Connection, r_UserID).ConnectAndReturn();

            r_Connection.Update += OnDatabaseUpdate;

            IsConnected = true;
        }