在本地保存图像,然后将文件路径作为字符串保存到 Xamarin Forms 中的数据库中
Save image locally and then save file path as a string into a database in Xamarin Forms
拍完照片/ select一张图片(不管怎样都会覆盖同一个图片变量),将图片保存到本地,然后将文件路径作为字符串保存到变量中插入到现有的 SQLite 数据库中。
我有同样的问题-
这是我如何让它工作的
首先,在您为表格创建列的模型中,确保有一个 属性 作为图像路径的字符串
[PrimaryKey, AutoIncrement]
public int Id { get; set; }
public string Image { get; set; }
然后我们需要一个方法来在本地上传和保存您的图像,另一个方法来获取文件路径并将其设置为字符串。假设这将在您的 code-behind 中,首先添加这些:
public static string photofilename;
public static string imagePath;
static SQLiteConnection db;
YourModel yourmodel = new YourModel();
然后是LoadPhoto方法
async void LoadPhotoAsync(FileResult photo)
{
// canceled
string PhotoPath;
if (photo == null)
{
PhotoPath = null;
return;
}
// save the file into local storage
var newFile = Path.Combine(FileSystem.AppDataDirectory, photo.FileName);
using (var stream = await photo.OpenReadAsync())
using (var newStream = File.OpenWrite(newFile))
await stream.CopyToAsync(newStream);
PhotoPath = newFile;
}
然后是 upload/save 照片(在这种情况下,我让用户从设备上传)的方法,我已将其附加到“上传图片”按钮。在这种方法中,我将图像显示到我的 XAML ImageViewer 中的图像,但这对您来说可能不是必需的。
async void Image_ClickedAsync(System.Object sender, System.EventArgs e)
{
try
{
var photo = await MediaPicker.PickPhotoAsync();
LoadPhotoAsync(photo);
photofilename = photo.FileName;
imagePath = Path.Combine(FileSystem.AppDataDirectory, photofilename);
}
catch (FeatureNotSupportedException fnsEx)
{
// Feature is not supported on the device
}
catch (PermissionException pEx)
{
// Permissions not granted
}
catch (Exception ex)
{
Console.WriteLine($"CapturePhotoAsync THREW: {ex.Message}");
}
ImageViewer.Source = imagePath;
ImageViewer.IsVisible = true;
}
这样做是打开 MediaPicker,允许用户选择一个图像并将图像路径设置为字符串 imagePath。在我这里的例子中,我还有“ImageViewer”,它是我 XAML 中的一个图像,用于显示图像,但我们还没有完成——我们还没有将它保存到您的 SQLite 数据库中。这是我在“保存”按钮上使用的方法-
private void SaveEvent(object sender, EventArgs e)
{
var databasePath = Path.Combine(FileSystem.AppDataDirectory, "yourdb.db");
db = new SQLiteConnection(databasePath);
yourmodel.Image = imagePath;
db.Insert(yourmodel);
}
然后,假设您使用 ListView 或绑定到数据库中的表的东西,您将在 XAML 中有一个图像,就像这样
<Image HeightRequest="340" WidthRequest="550" x:Name="Image" Source="{Binding Image}"/>
这应该可以解决问题 - 让我知道这是否适合您!
拍完照片/ select一张图片(不管怎样都会覆盖同一个图片变量),将图片保存到本地,然后将文件路径作为字符串保存到变量中插入到现有的 SQLite 数据库中。
我有同样的问题- 这是我如何让它工作的
首先,在您为表格创建列的模型中,确保有一个 属性 作为图像路径的字符串
[PrimaryKey, AutoIncrement]
public int Id { get; set; }
public string Image { get; set; }
然后我们需要一个方法来在本地上传和保存您的图像,另一个方法来获取文件路径并将其设置为字符串。假设这将在您的 code-behind 中,首先添加这些:
public static string photofilename;
public static string imagePath;
static SQLiteConnection db;
YourModel yourmodel = new YourModel();
然后是LoadPhoto方法
async void LoadPhotoAsync(FileResult photo)
{
// canceled
string PhotoPath;
if (photo == null)
{
PhotoPath = null;
return;
}
// save the file into local storage
var newFile = Path.Combine(FileSystem.AppDataDirectory, photo.FileName);
using (var stream = await photo.OpenReadAsync())
using (var newStream = File.OpenWrite(newFile))
await stream.CopyToAsync(newStream);
PhotoPath = newFile;
}
然后是 upload/save 照片(在这种情况下,我让用户从设备上传)的方法,我已将其附加到“上传图片”按钮。在这种方法中,我将图像显示到我的 XAML ImageViewer 中的图像,但这对您来说可能不是必需的。
async void Image_ClickedAsync(System.Object sender, System.EventArgs e)
{
try
{
var photo = await MediaPicker.PickPhotoAsync();
LoadPhotoAsync(photo);
photofilename = photo.FileName;
imagePath = Path.Combine(FileSystem.AppDataDirectory, photofilename);
}
catch (FeatureNotSupportedException fnsEx)
{
// Feature is not supported on the device
}
catch (PermissionException pEx)
{
// Permissions not granted
}
catch (Exception ex)
{
Console.WriteLine($"CapturePhotoAsync THREW: {ex.Message}");
}
ImageViewer.Source = imagePath;
ImageViewer.IsVisible = true;
}
这样做是打开 MediaPicker,允许用户选择一个图像并将图像路径设置为字符串 imagePath。在我这里的例子中,我还有“ImageViewer”,它是我 XAML 中的一个图像,用于显示图像,但我们还没有完成——我们还没有将它保存到您的 SQLite 数据库中。这是我在“保存”按钮上使用的方法-
private void SaveEvent(object sender, EventArgs e)
{
var databasePath = Path.Combine(FileSystem.AppDataDirectory, "yourdb.db");
db = new SQLiteConnection(databasePath);
yourmodel.Image = imagePath;
db.Insert(yourmodel);
}
然后,假设您使用 ListView 或绑定到数据库中的表的东西,您将在 XAML 中有一个图像,就像这样
<Image HeightRequest="340" WidthRequest="550" x:Name="Image" Source="{Binding Image}"/>
这应该可以解决问题 - 让我知道这是否适合您!