Xamarin Android Sqlite Db浏览器

时间:2017-06-23 22:11:10

标签: android sqlite xamarin xamarin.android

我有一周以来的第一部智能手机,并尝试使用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文件复制到可用文件夹。

2 个答案:

答案 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权限。