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

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

我想发布对我现有的 Xamarin Android 应用程序的 NET Maui 升级,但由于我的用户已经拥有 SQLite 数据库,我需要能够升级应用程序并保留数据库。

我的 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.