如何在Android应用程序沙盒存储下访问SQLite数据库?
我有一个本机应用程序,它在com.companyname.appname/databases/MyDatabase.db中生成一个SQLite数据库文件。这是在Android的内部应用程序存储中 我需要将此应用程序迁移到Xamarin.Forms中,但我需要访问该数据库以将其移动到另一个目录或直接读取数据库 问题是使用如何在Android应用程序沙盒存储下访问SQLite数据库?,android,sqlite,xamarin,xamarin.forms,xamarin.android,Android,Sqlite,Xamarin,Xamarin.forms,Xamarin.android,我有一个本机应用程序,它在com.companyname.appname/databases/MyDatabase.db中生成一个SQLite数据库文件。这是在Android的内部应用程序存储中 我需要将此应用程序迁移到Xamarin.Forms中,但我需要访问该数据库以将其移动到另一个目录或直接读取数据库 问题是使用System.Environment.SpecialFolder.Personal/System.Environment.SpecialFolder.MyDocuments,这是中
System.Environment.SpecialFolder.Personal
/System.Environment.SpecialFolder.MyDocuments
,这是中所述的可能的最高位置,只会导致com.companyname.appname/files/位置。我需要更高一级才能访问数据库文件夹。这可能吗
注意:我已经尝试对路径进行硬编码,并且添加了“./”,它不起作用并抛出错误
问题在于,使用System.Environment.SpecialFolder.Personal/System.Environment.SpecialFolder.MyDocuments(此处文档中所述的最高可能位置)只会导致com.companyname.appname/files/location
用作文档公共存储库的个人目录
相当于MyDocuments
。有关更多信息,您可以查看MS文档
使用个人文件夹读取数据库的简单方法
string databaseFolder = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
string databasePath = Path.Combine(docFolder, "TodoSQLite2.db3");
将退出的数据库复制到资产文件夹
并将构建操作设置为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/System.Environment.SpecialFolder.MyDocuments(此处文档中所述的最高可能位置)只会导致com.companyname.appname/files/location
用作文档公共存储库的个人目录
相当于MyDocuments
。有关更多信息,您可以查看MS文档
使用个人文件夹读取数据库的简单方法
string databaseFolder = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
string databasePath = Path.Combine(docFolder, "TodoSQLite2.db3");
将退出的数据库复制到资产文件夹
并将构建操作设置为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/location。@iamlawersv“获取'System.Environment.SpecialFolder.Personal'上方的文件夹”是什么意思?您的意思是要设置用于以编程方式保存数据库的文件夹吗?如果是,您可以尝试使用代码
Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),“TodoSQLite.db3”)
来设置路径。我的意思是通过编程导航到System.Environment.SpecialFolder.Personal代码返回的文件夹上方的文件夹。我需要在运行时将数据库复制到另一个文件夹。@iamv我已经更新了回复,请检查更新的代码。这仍然无法解决最初的问题,即我无法访问com.companyname.appname/databases/MyDatabase.db位置,因为Environment.SpecialFolder.Personal仅访问com.companyname.appname/files位置。如果我可以从该位置访问一级文件夹并导航到databases文件夹,那么复制就很简单了。那么如何通过编程方式在“System.Environment.SpecialFolder.Personal”上方获取文件夹?在Xamarin.Android中,我只获取com.companyname.appname/files/location。@iamlawersv“获取'System.Environment.SpecialFolder.Personal'上方的文件夹”是什么意思?您的意思是要设置用于以编程方式保存数据库的文件夹吗?如果是,您可以尝试使用代码Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),“TodoSQLite.db3”)
来设置路径。我的意思是通过编程导航到System.Environment.SpecialFolder.Personal代码返回的文件夹上方的文件夹。我需要在运行时将数据库复制到另一个文件夹。@iamv我已经更新了回复,请检查更新的代码。这仍然无法解决最初的问题,即我无法访问com.companyname.appname/databases/MyDatabase.db位置,因为Environment.SpecialFolder.Personal仅访问com.companyname.appname/files位置。如果我可以从该位置访问一级以上的文件夹并导航到databases文件夹,那么复制起来就很简单了。