将 SQLite 数据库从 Xamarin Android 迁移到 NET Maui 应用程序?

问题描述 投票:0回答:1

我正在向我现有的 Xamarin Android 应用程序发布 NET Maui 升级版,但由于我的用户已经拥有 SQLite DB,我需要能够升级应用程序并保留 DB。我的 Xamarin 应用程序正在使用 SQLiteOpenHelper 并获取用户版本 @"PRAGMA user_version" = 8,但是当我在 Maui 应用程序中运行相同的查询时,我得到 0 作为 user_version。

我已验证我在两个应用程序上使用相同的连接字符串,即

Data Source=/data/user/0/<my app id>/databases/my_database.db

    public partial class BaseHandler : Android.Database.Sqlite.SQLiteOpenHelper
    {
        private const string DB_NAME = "my_database.db";
        Android.Content.Context _context;

        private Android.Database.Sqlite.SQLiteDatabase _db = null;
        public BaseHandler (IContext context) : base (context.AppContext, DB_NAME, null, DB_VERSION)
        {
            _context = context.AppContext;
            _db = WritableDatabase; 
            var version = ExecuteScalar(@"PRAGMA user_version");
        }

        public override void OnCreate (Android.Database.Sqlite.SQLiteDatabase db)
        {
            var sqls = this.CreateDatabaseSql();
            this.DoSql(db, sqls);
            var version = ExecuteScalar(@"PRAGMA user_version");
        }

Maui 应用程序使用 sqlite-net-pcl 包

public async Task<IEnumerable<MyItem>> GetAllItems()
        {
            var sql = "SELECT * FROM MY_ITEMS;";

            try
            {
                await using var cnn = GetCnn();
                return await cnn.QueryAsync<MyItem>(sql);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

我错过了什么?

android sqlite maui
1个回答
0
投票

经过大量挖掘,我终于找到了答案。 Xamarin Android 和 MAUI Android 文件位置似乎不同。 我的 Xamarin SQLite 数据库存储在:

Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "database.db3")

但是,在 Xamarin Android 上,文件路径是:

/data/user/0/my.app/files/.local/share/database.db3

但是当使用完全相同的代码访问 MAUI Android 中的数据库时,会导致:

/data/user/0/my.app/files/database.db3

我的解决方案是根据平台调整旧数据库的路径: '''

#if ANDROID
            var databaseV1Path = ".local/share/database.db3";
#else
            var databaseV1Path = "database.db3";
#endif

var legacyDatabasePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), databaseV1Path)

我利用这个机会优化了我的数据库并将数据重新映射到 MAUI 的新数据库,因为图像名称也需要更改以适应调整大小的蛇形情况要求,然后删除旧的数据库文件。

希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.