如何从图库中 select 图像并保存到 xamarin 中的 sql 数据库
How to select image from gallery and save to sql database in xamarin
我使用 Xamarin Media Plugin 上传图片,我想将该图片保存在 Sqlite 中并从 Sqlite 中检索回来。我该怎么做?
存储:将Image位图转换为Base64String并存储到SQLite。
public static string Base64Encode(string plainText) {
var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText);
return System.Convert.ToBase64String(plainTextBytes);
}
检索:获取 Base64String 并再次将其转换为位图。
public static string Base64Decode(string base64EncodedData) {
var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData);
return System.Text.Encoding.UTF8.GetString(base64EncodedBytes);
}
以及如何从图库中 select 图像并保存到 xamarin 中的 sql 数据库 --
如果像这样,我在哪里实现这些 Base64Encode?
using Plugin.Media;
using Plugin.Media.Abstractions;
using System;
using Xamarin.Forms;
using SQLite;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace PersonListData
{
public class Person
{
[PrimaryKey, AutoIncrement]
public int IdSis { get; set; }
public string NamePerson { get; set; }
public byte[] PersonImg { get; set; }
}
async void SaveOnClik(object sender, EventArgs e)
{
var person = (Person)BindingContext;
await App.Database.SavePersonAsync(person);
await Navigation.PopAsync();
}
async void PickPhotos(object sender, EventArgs e)
{
if (CrossMedia.Current.IsPickPhotoSupported)
{
var file = await CrossMedia.Current.PickPhotoAsync(new Plugin.Media.Abstractions.PickMediaOptions
{
PhotoSize = PhotoSize.Medium,
});
if (file == null)
return;
image.Source = ImageSource.FromStream(() =>
{
var stream = file.GetStream();
file.Dispose();
return stream;
});
}
else
{
await DisplayAlert("Image error", ":( Hcant do thid.", "Ok");
return;
}
}
readonly SQLiteAsyncConnection _database;
public DataPerson(string dbPath)
{
_database = new SQLiteAsyncConnection(dbPath);
_database.CreateTableAsync<Person>().Wait();
}
public Task<List<Person>> GetPersonListAsync()
{
return _database.Table<Person>().ToListAsync();
}
public Task<Person> GetPersonAsync(int id)
{
return _database.Table<Person>()
.Where(i => i.IdSis == id)
.FirstOrDefaultAsync();
}
public Task<int> SavePersonAsync(Person person)
{
if (person.IdSis != 0)
{
return _database.UpdateAsync(person);
}
else
{
return _database.InsertAsync(person);
}
}
public Task<int> DeletePersonAsync(Person person)
{
return _database.DeleteAsync(person);
}
}
我对这个位置感到困惑
您可以尝试将图片路径保存到sqlite数据库中。
在模型中创建路径 属性。
public class Person
{
[PrimaryKey, AutoIncrement]
public int IdSis { get; set; }
public string NamePerson { get; set; }
public string Path{ get; set; }
public byte[] PersonImg { get; set; }
}
然后将字符串存入数据库。
public Task<int> SaveItemAsync(Person item)
{
if (item.ID != 0)
{
return Database.UpdateAsync(item);
}
else
{
return Database.InsertAsync(item);
}
}
您可以查看下面的 link 代码示例,了解如何将字符串保存到 sqlite 数据库中。
https://docs.microsoft.com/en-us/xamarin/xamarin-forms/data-cloud/data/databases
如果你还想把byte[]保存到sqlite数据库,你需要把stream转成byte[]。请检查有关如何将图像从流转换为字节的方式。
我不再考虑用base64保存照片
在 c#
using Plugin.Media;
....
async void GetPersonImage(object sender, EventArgs e)
{
if (!CrossMedia.Current.IsPickPhotoSupported)
{
await DisplayAlert("Foto tidak didukung", ":( Hak akses dibatasi.", "Oke deh ..");
return;
}
var file = await Plugin.Media.CrossMedia.Current.PickPhotoAsync(new Plugin.Media.Abstractions.PickMediaOptions
{
PhotoSize = Plugin.Media.Abstractions.PhotoSize.Medium,
});
if (file == null)
return;
string path = file.Path;
FtSiswa.Text = path; //this label hide
await DisplayAlert("Foto disimpan di: ", file.Path, "OK");
KameraFotos.Source = ImageSource.FromStream(() =>
{
var stream = file.GetStream();
file.Dispose();
return stream;
});
}
在xaml
.... <Image x:Name="KameraFotos" BackgroundColor="Bisque" Grid.Column="2" Grid.RowSpan="2" Aspect="AspectFit"> <Image.Source> <FileImageSource File="{Binding PersonImg}" /> </Image.Source> <TapGestureRecognizer Tapped="GetPersonImage" NumberOfTapsRequired="1" /> </Image.GestureRecognizers> </Image> ....
我觉得把图片保存在数据库中记录的路径和文件地址效率更高
我使用 Xamarin Media Plugin 上传图片,我想将该图片保存在 Sqlite 中并从 Sqlite 中检索回来。我该怎么做?
存储:将Image位图转换为Base64String并存储到SQLite。
public static string Base64Encode(string plainText) {
var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText);
return System.Convert.ToBase64String(plainTextBytes);
}
检索:获取 Base64String 并再次将其转换为位图。
public static string Base64Decode(string base64EncodedData) {
var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData);
return System.Text.Encoding.UTF8.GetString(base64EncodedBytes);
}
以及如何从图库中 select 图像并保存到 xamarin 中的 sql 数据库 -- 如果像这样,我在哪里实现这些 Base64Encode?
using Plugin.Media;
using Plugin.Media.Abstractions;
using System;
using Xamarin.Forms;
using SQLite;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace PersonListData
{
public class Person
{
[PrimaryKey, AutoIncrement]
public int IdSis { get; set; }
public string NamePerson { get; set; }
public byte[] PersonImg { get; set; }
}
async void SaveOnClik(object sender, EventArgs e)
{
var person = (Person)BindingContext;
await App.Database.SavePersonAsync(person);
await Navigation.PopAsync();
}
async void PickPhotos(object sender, EventArgs e)
{
if (CrossMedia.Current.IsPickPhotoSupported)
{
var file = await CrossMedia.Current.PickPhotoAsync(new Plugin.Media.Abstractions.PickMediaOptions
{
PhotoSize = PhotoSize.Medium,
});
if (file == null)
return;
image.Source = ImageSource.FromStream(() =>
{
var stream = file.GetStream();
file.Dispose();
return stream;
});
}
else
{
await DisplayAlert("Image error", ":( Hcant do thid.", "Ok");
return;
}
}
readonly SQLiteAsyncConnection _database;
public DataPerson(string dbPath)
{
_database = new SQLiteAsyncConnection(dbPath);
_database.CreateTableAsync<Person>().Wait();
}
public Task<List<Person>> GetPersonListAsync()
{
return _database.Table<Person>().ToListAsync();
}
public Task<Person> GetPersonAsync(int id)
{
return _database.Table<Person>()
.Where(i => i.IdSis == id)
.FirstOrDefaultAsync();
}
public Task<int> SavePersonAsync(Person person)
{
if (person.IdSis != 0)
{
return _database.UpdateAsync(person);
}
else
{
return _database.InsertAsync(person);
}
}
public Task<int> DeletePersonAsync(Person person)
{
return _database.DeleteAsync(person);
}
}
我对这个位置感到困惑
您可以尝试将图片路径保存到sqlite数据库中。
在模型中创建路径 属性。
public class Person
{
[PrimaryKey, AutoIncrement]
public int IdSis { get; set; }
public string NamePerson { get; set; }
public string Path{ get; set; }
public byte[] PersonImg { get; set; }
}
然后将字符串存入数据库。
public Task<int> SaveItemAsync(Person item)
{
if (item.ID != 0)
{
return Database.UpdateAsync(item);
}
else
{
return Database.InsertAsync(item);
}
}
您可以查看下面的 link 代码示例,了解如何将字符串保存到 sqlite 数据库中。 https://docs.microsoft.com/en-us/xamarin/xamarin-forms/data-cloud/data/databases
如果你还想把byte[]保存到sqlite数据库,你需要把stream转成byte[]。请检查有关如何将图像从流转换为字节的方式。
我不再考虑用base64保存照片
在 c#
using Plugin.Media;
....
async void GetPersonImage(object sender, EventArgs e)
{
if (!CrossMedia.Current.IsPickPhotoSupported)
{
await DisplayAlert("Foto tidak didukung", ":( Hak akses dibatasi.", "Oke deh ..");
return;
}
var file = await Plugin.Media.CrossMedia.Current.PickPhotoAsync(new Plugin.Media.Abstractions.PickMediaOptions
{
PhotoSize = Plugin.Media.Abstractions.PhotoSize.Medium,
});
if (file == null)
return;
string path = file.Path;
FtSiswa.Text = path; //this label hide
await DisplayAlert("Foto disimpan di: ", file.Path, "OK");
KameraFotos.Source = ImageSource.FromStream(() =>
{
var stream = file.GetStream();
file.Dispose();
return stream;
});
}
在xaml
.... <Image x:Name="KameraFotos" BackgroundColor="Bisque" Grid.Column="2" Grid.RowSpan="2" Aspect="AspectFit"> <Image.Source> <FileImageSource File="{Binding PersonImg}" /> </Image.Source> <TapGestureRecognizer Tapped="GetPersonImage" NumberOfTapsRequired="1" /> </Image.GestureRecognizers> </Image> ....
我觉得把图片保存在数据库中记录的路径和文件地址效率更高