我有一周以来的第一部智能手机,并尝试使用Xamarin制作应用程序。
我使用SQLite和EntityFrameworkCore来存储数据。
工作正常,但为了更容易调试,我想使用SQLite浏览器。 数据库文件路径为' data / data / {AppName} /Database.db'。
我通过USB从物理设备进行调试,但是当我使用Windows资源管理器浏览设备时,我找不到SQLite DB文件。 '数据/数据'文件夹不可用。然后我不能使用SQLite浏览器来查看数据。
在这篇文章中,作者使用Android模拟器,可以看到数据/数据'文件夹: https://blog.xamarin.com/building-android-apps-with-entity-framework/
但我更喜欢使用真实设备。
有解决方案吗?
来自MikeT的解决方案,在开发中将db文件存储在可用文件夹中,如下所示:
public static string DatabasePath
{
get
{
var dbFolder = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads).AbsolutePath;
var fileName = "database.db";
var dbFullPath = Path.Combine(dbFolder, fileName);
return dbFullPath;
}
}
在生产中,将db文件复制到可用文件夹。
答案 0 :(得分:1)
我相信,您需要使用一台真正的设备来根据设备直接访问数据。
但是,您可以做的是将数据库文件复制到其他地方,例如到外部存储。以下是我使用的核心流程: -
try {
FileInputStream fis = new FileInputStream(dbfile);
OutputStream backup = new FileOutputStream(backupfilename);
//byte[] buffer = new byte[32768];
int length;
while((length = fis.read(buffer)) > 0) {
backup.write(buffer, 0, length);
}
backup.flush();
backup.close();
fis.close();
catch (IOException e) {
e.printStackTrace();
confirmaction = false;
}
我使用以下内容获取backupfilename
的路径名: -
File dir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),subdirectory);
this.directory = dir.getPath();
然后我添加实际文件名(用户输入)。
注意!我会检查以确定是否已安装EXTERNAL存储等。
要获取我使用的数据库路径: -
String dbfilename = this.getDatabasePath(
DBConstants.DATABASE_NAME).getPath();
dbfile = new File(dbfilename);
这当然是Java,但我认为它可以转换/改编以适应。答案的关键是将数据库文件放到可以访问它的位置。
答案 1 :(得分:0)
从您的活动中调用ExtractDb方法
public void ExtractDB()
{
var szSqliteFilename = "databasename.db3";
var szSourcePath = new FileManager().GetLocalFilePath(szSqliteFilename);
var szDatabaseBackupPath = Android.OS.Environment.ExternalStorageDirectory.AbsolutePath + "/databasename_Backup.db3";
if (File.Exists(szSourcePath))
{
File.Copy(szSourcePath, szDatabaseBackupPath, true);
Toast.MakeText(this, "Copied", ToastLength.Short).Show();
}
}
获取Android设备存储的路径,如下所示
public class FileManager
{
public string GetLocalFilePath(string filename)
{
string path = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
return Path.Combine(path, filename);
}
}
您需要在清单文件中添加android.permission.WRITE_EXTERNAL_STORAGE权限。