From a7d83aa6f012fdac9d4d8b886b0f26b0b8d82e64 Mon Sep 17 00:00:00 2001 From: Yan Maniez Date: Mon, 22 Oct 2018 00:07:23 +0200 Subject: [PATCH] Versioning db Android --- .../AideDeJeu.Android.csproj | 3 + AideDeJeu/AideDeJeu.Android/NativeAPI.cs | 77 ++++++++++++------- Data/library.ver | 1 + 3 files changed, 54 insertions(+), 27 deletions(-) create mode 100644 Data/library.ver diff --git a/AideDeJeu/AideDeJeu.Android/AideDeJeu.Android.csproj b/AideDeJeu/AideDeJeu.Android/AideDeJeu.Android.csproj index 86fb8bf2..f05d2181 100644 --- a/AideDeJeu/AideDeJeu.Android/AideDeJeu.Android.csproj +++ b/AideDeJeu/AideDeJeu.Android/AideDeJeu.Android.csproj @@ -109,6 +109,9 @@ Assets\library.db + + Assets\library.ver + diff --git a/AideDeJeu/AideDeJeu.Android/NativeAPI.cs b/AideDeJeu/AideDeJeu.Android/NativeAPI.cs index 5ad1c48a..cd68568d 100644 --- a/AideDeJeu/AideDeJeu.Android/NativeAPI.cs +++ b/AideDeJeu/AideDeJeu.Android/NativeAPI.cs @@ -1,6 +1,5 @@ using AideDeJeu.Tools; using Android.Content.PM; -using System; using System.IO; using System.Threading.Tasks; @@ -30,36 +29,60 @@ namespace AideDeJeu.Droid public async Task GetDatabasePathAsync(string databaseName) { - //string path = Environment.GetFolderPath(Environment.SpecialFolder.Personal); - //string dbPath = Path.Combine(path, databaseName); - //return dbPath; - var documentsDirectoryPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal); - var path = Path.Combine(documentsDirectoryPath, $"{databaseName}.db"); + if (await CheckDatabaseVersionAsync(databaseName)) + { + await CopyOldToNewFileAsync(databaseName, "db"); + await CopyOldToNewFileAsync(databaseName, "ver"); + } + return GetNewFilePath(databaseName, "db"); + } - // This is where we copy in our pre-created database + public Stream GetOldFileStream(string fileName, string extension) + { + return Android.App.Application.Context.Assets.Open($"{fileName}.{extension}"); + } + public string GetNewFilePath(string fileName, string extension) + { + var documentsDirectoryPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal); + return Path.Combine(documentsDirectoryPath, $"{fileName}.{extension}"); + } + public async Task CopyOldToNewFileAsync(string fileName, string extension) + { + using (var inStream = GetOldFileStream(fileName, extension)) + { + using (var outStream = new FileStream(GetNewFilePath(fileName, extension), FileMode.Create)) + { + await inStream.CopyToAsync(outStream); + } + } + } + + public async Task CheckDatabaseVersionAsync(string databaseName) + { + var path = GetNewFilePath(databaseName, "ver"); if (!File.Exists(path)) { - using (var inStream = Android.App.Application.Context.Assets.Open($"{databaseName}.db")) - { - using (var outStream = new FileStream(path, FileMode.Create)) - { - await inStream.CopyToAsync(outStream); - } - } - //using (var binaryReader = new BinaryReader(Android.App.Application.Context.Assets.Open(databaseName))) - //{ - // using (var binaryWriter = new BinaryWriter(new FileStream(path, FileMode.Create))) - // { - // byte[] buffer = new byte[2048]; - // int length = 0; - // while ((length = binaryReader.Read(buffer, 0, buffer.Length)) > 0) - // { - // binaryWriter.Write(buffer, 0, length); - // } - // } - //} + return true; } - return path; + int newVersion = 0; + int oldVersion = -1; + using (var newStream = GetOldFileStream(databaseName, "ver")) + { + using (var sr = new StreamReader(newStream)) + { + var str = await sr.ReadToEndAsync(); + int.TryParse(str, out newVersion); + } + } + using (var oldStream = new FileStream(path, FileMode.Open)) + { + using (var sr = new StreamReader(oldStream)) + { + var str = await sr.ReadToEndAsync(); + int.TryParse(str, out oldVersion); + } + } + return newVersion > oldVersion; } } } \ No newline at end of file diff --git a/Data/library.ver b/Data/library.ver new file mode 100644 index 00000000..bf0d87ab --- /dev/null +++ b/Data/library.ver @@ -0,0 +1 @@ +4 \ No newline at end of file