我的Xamarin.forms应用程序(Android)集成了SQLite数据库,我可以正确地管理它,这要归功于我在此处找到的示例:https://learn.microsoft.com/fr-fr/xamarin/get-started/quickstarts/database
我的第一个问题是:如何将此notes.db3文件保存在Onedrive或可能的Google Drive上。
我的第二个问题是:如何提供包含数据表的数据库给应用程序。从我在互联网上找到的内容来看,您需要将预填充的文件sqlite.db3复制到资源文件夹中,然后使用代码将此文件复制到应用程序文件夹中。
我搜索了很多,但找不到确切的代码以便能够完成它。 感谢您的帮助,这将非常有用,因为这个主题的文档非常少。
编辑: 以下是第二个问题的答案:
- 当新用户首次运行程序时,我使用该程序来填充有用数据的表。
- 我通过编程方式将SQLite文件复制到可由外部应用程序访问的文件夹中:Android Studio(Visual Studio 2019中的Android Device Monitor实用程序的文件管理器不起作用!)。 以下是代码:
using Xamarin.Essentials;
using FileSystem = Xamarin.Essentials.FileSystem;
public void CopyDBToSdcard(string dbName)
{
var dbPath = Path.Combine(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), dbName));
string destPath = Path.Combine("/sdcard/Android/data/com.aprisoft.memocourses/files", dbName);
//
if (File.Exists(dbPath))
{
if (File.Exists(destPath))
{
File.Delete(destPath);
}
File.Copy(dbPath, destPath);
}
}
我将这个预填充的SQLite文件复制到我的应用程序中,放在主项目的根目录。在该文件的属性中,我在“生成操作”中指定“嵌入资源”。
当程序第一次运行时,它会检查是否找到了SQLite文件。如果找不到,我使用 Dirk 在此处提供的代码将文件复制到特殊文件夹“LocalApplicationData”中。以下是代码:
public void CopyDB_FR(string filename)
{
var embeddedResourceDb = Assembly.GetExecutingAssembly().GetManifestResourceNames().First(s => s.Contains(filename));
var embeddedResourceDbStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(embeddedResourceDb);
var dbPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), filename);
//
if (!File.Exists(dbPath))
{
using (var br = new BinaryReader(embeddedResourceDbStream))
{
using (var bw = new BinaryWriter(new FileStream(dbPath, FileMode.Create)))
{
var buffer = new byte[2048];
int len;
while ((len = br.Read(buffer, 0, buffer.Length)) > 0)
{
bw.Write(buffer, 0, len);
}
}
}
}
}
我保持这个线程开放,因为我还没有得到对我的第一个问题的答案。任何帮助将不胜感激。谢谢。
编辑2: 我遵循了微软的示例,使用Graph APIs在我的应用程序中构建了连接到Azure,并且它可以工作:连接很好,我可以检索用户数据。 然而,我找不到复制文件到Onedrive的方法。 我正在使用以下代码:
await (Application.Current as App).SignIn();
btnConnect.IsEnabled = false;
//
// put user's files
string path = Path.Combine("/data/data/com.ApriSoft.memocourses/files/Backup", "MemoCourses.db3");
byte[] data = System.IO.File.ReadAllBytes(path);
Stream stream = new MemoryStream(data);
await App.GraphClient.Me
.Drive
.Root
.ItemWithPath("/Backup/MemoCourses.db3")
.Content
.Request()
.PutAsync<DriveItem>(stream);
;
但是几分钟后我收到了以下错误信息:
身份验证错误 代码:GeneralException 消息:发送请求时发生错误。
我的代码有问题吗? 请帮助我,我想完成我的应用程序。非常感谢。