如何解决如何访问Xamarin.forms应用程序内置的预填充SQLite数据库?
我需要我的应用程序包含一个在应用程序外部创建的预填充数据库,该应用程序可以使用和更新该数据库。
这似乎是基本必需品,我希望这样会很容易:
- 将MyData.db文件添加到项目中
- 为其选择正确的构建操作属性,例如资源
- 获取应用程序资源的路径,DBPath = App.PathToResources +“ MyData.db”
- connection =新的SQLiteConnection(DBPath)
- 使用SQL查询读取/写入数据
我没有发现任何有效的方法。似乎不可能在我的项目中包含db文件并通过代码访问它。
问题是,如何将数据构建到我的应用程序中?这里正确的范式是什么?
谢谢。
解决方法
数据库文件既不是项目文件,也不是可以添加到项目中的嵌入式资源文件。而是在最初启动应用程序并打开SQLite连接时创建数据库文件。因此,您需要确保您的移动应用程序具有访问文件存储的权限。如果您具有文件存储权限,则SQLite API会为您创建一个数据库文件,当打开连接时,您必须指定数据库文件路径,包括文件名和扩展名。我强烈建议您使用EntityFrameworkCore
代码优先方法来创建,访问和操作数据库。您可以参考以下example。当您指定数据库的连接字符串时,如果该文件已经存在,它将打开连接,否则它将为您创建一个db文件。
->这是部分解决方案,因为现在无法写入数据库。
我通过kc70找到了一个准确回答这个问题的视频:https://www.youtube.com/watch?v=aQtNynTLhl4。
以下是10个步骤的摘要:
1-创建Xamarin移动应用
2-选择具有UWP的主详细信息
3-将SQLite-net-pcl添加到共享项目中
4-在Models / Item.cs
中- Add Using SQLite;
- Change string id to int
- Change the references to that too in Services/MockDataStore.cs and Services/IDataStore.cs
5-新文件夹数据
6-数据中新增了RestaurantDatabase类:
using SQlite;
public class RestaurantDatabase
{
static SQLiteAsyncConnection Database;
public Restaurant()
{
string DatabasePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),"Restaurant.db");
Assembly assembly = IntrospectionExtensions.GetTypeInfo(typeof(App)).Assembly;
Stream embeddedDatabaseStream = assembly.GetManifestResourceStream("ExampleMobile.Restaurant.db"); // NameOfProgram.NameOfDB.DBExtension
if (!File.Exists(DatabasePath))
{
FileStream fileStreamToWrite = File.Create(DatabasePAth);
embeddedDatabasestream.Seek(0,SeekOrigin.Begin);
embeddedDatabaseStream.CopyTo(fileStreamToWrite);
fileStreamToWrite.Close();
}
Database = new SQLiteAsyncConnection(DatabasePath);
Database.CreateTableAsync<Item>().Wait();
}
public Task<List<Item>> GetItemsAsync()
{
return Database.Table<Item>().ToListAsync();
}
}
7-在App.xaml.cs中
添加到App类:
private static RestaurantDatabase restaurantDatabase;
public static RestaurantDatabase RestaurantDatabase
{
get
{
if (restaurantDatabase == null)
{
restaurantDatabase = new RestaurantDatabase();
}
return restaurantDatabase;
}
}
8-在mockdatastore.cs中替换
public async Task<IEnumerable<Item>> GetItemsAsync(bool forceRefresh = false)
{
return await Task.FromResult(items);
}
使用
public async Task<IEnumerable<Item>> GetItemsAsync(bool forceRefresh = false)
{
return await App.RestaurantDatabase.GetItemsAsync();
}
9-将Restaurant.db文件复制到共享项目中
10-将数据库属性设置为Embeddedresource
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。