【问题标题】:How to access an SQLite database under the Android app sandbox storage?Android应用沙盒存储下如何访问SQLite数据库?
【发布时间】:2019-10-03 10:07:31
【问题描述】:

我有一个本机应用程序,它在 com.companyname.appname/databases/MyDatabase.db 中生成一个 SQLite 数据库文件。这是在 Android 的内部应用存储中。

我需要将此应用程序迁移到 Xamarin.Forms,但我需要访问该数据库以将其移动到另一个目录或直接读取数据库。

问题是使用System.Environment.SpecialFolder.Personal / System.Environment.SpecialFolder.MyDocuments 这是documentation here 中所说的最高可能位置,只会导致 com.companyname.appname/files/ 位置。我需要上一层才能访问数据库文件夹。这可能吗?

注意:我已尝试对路径进行硬编码,并且还添加了不起作用并引发错误的“../”。

【问题讨论】:

    标签: android sqlite xamarin xamarin.forms xamarin.android


    【解决方案1】:

    问题在于,使用 System.Environment.SpecialFolder.Personal / System.Environment.SpecialFolder.MyDocuments 是此处文档中所述的最高可能位置,只会导致 com.companyname.appname/files/ 位置。

    用作文档公共存储库的Personal directory 等效于MyDocuments。有关更多信息,您可以查看 MS 文档。 https://docs.microsoft.com/en-us/dotnet/api/system.environment.specialfolder?view=netframework-4.8

    使用个人文件夹读取数据库的简单方法。

    string databaseFolder = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
                    string databasePath = Path.Combine(docFolder, "TodoSQLite2.db3");
    

    将退出的数据库复制到Assets文件夹。

    并将 Build Action 设置为 AndroidAsset

    更新:

    如果你想在运行时将数据库复制到另一个文件夹,你可以试试下面的代码。例如,我使用本地文件夹。

    // Check if it exists at that path
    if (File.Exists(filePath))
    {
       // Copy the file to the app's local folder, you could change the path where you want to copy.
       string folderPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
       string destinationPath = Path.Combine(folderPath, "myData.db");
       File.Copy(filePath, destinationPath);
    }
    

    【讨论】:

    • 我如何以编程方式获取“System.Environment.SpecialFolder.Personal”上方的文件夹?在 Xamarin.Android 中,我只获得 com.companyname.appname/files/ 位置。
    • @iamlawrencev 什么是“获取'System.Environment.SpecialFolder.Personal'上方的文件夹”是什么意思?您的意思是要设置用于以编程方式保存数据库的文件夹吗?如果是,您可以尝试使用代码Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "TodoSQLite.db3") 设置路径。
    • 我的意思是以编程方式导航到 System.Environment.SpecialFolder.Personal 代码返回的文件夹上方的文件夹。我需要在运行时将数据库复制到另一个文件夹。
    • @iamlawrencev 我已经更新了我的回复,请检查更新后的代码。
    • 这仍然没有解决最初的问题,其中我无法访问 com.companyname.appname/databases/MyDatabase.db 位置,因为 Environment.SpecialFolder.Personal 只进入 com.companyname.appname /文件位置。如果我可以从该位置访问上一级的文件夹并导航到数据库文件夹,那么复制将是微不足道的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-01
    相关资源
    最近更新 更多