我想发布对我现有的 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;
}
}
我错过了什么?
经过大量挖掘,我终于找到了答案。 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 的新数据库,因为图像名称也需要更改以适应调整大小的蛇形情况要求,然后删除旧的数据库文件。
希望这有帮助!