如何访问 Android 模拟器中的本地文件夹以检索 SQLite db?

Posted

技术标签:

【中文标题】如何访问 Android 模拟器中的本地文件夹以检索 SQLite db?【英文标题】:How to access local folder in an Android emulator to retrieve SQLite db? 【发布时间】:2021-03-26 22:49:03 【问题描述】:

我创建了一个 SQLite 数据库来存储来自用户存储食谱的假设应用程序的数据:

using System;
using System.IO;
using DataAccesSQLite_scratch;
using SQLite;
using Xamarin.Forms;

[assembly: Dependency(typeof(SQLiteDb))]

namespace DataAccesSQLite_scratch

    public class SQLiteDb : ISQLiteDb
    

        public SQLiteAsyncConnection GetConnection()
        
            var documentsPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
            var path = Path.Combine(documentsPath, "mysqlite.db3");
            return new SQLiteAsyncConnection(path);
        
    

using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using SQLite;
using Xamarin.Forms;

namespace DataAccesSQLite_scratch

    public class Recipe : INotifyPropertyChanged
    

        public event PropertyChangedEventHandler PropertyChanged;

        private void OnPropertyChanged([CallerMemberName] string propertyName = null)
        
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        

        [PrimaryKey, AutoIncrement]
        public int Id  get; set; 

        private string _name;

        [MaxLength(225)]
        public string Name
        
            get  return _name; 
            set
            
                // code below assures that if the value isn't changed, this event should not be called
                if (_name == value)
                    return;

                _name = value;

                OnPropertyChanged();
            
        
        
    

    public partial class MainPage : ContentPage
    
        private SQLiteAsyncConnection _connection;
        private ObservableCollection<Recipe> _recipes;

        public MainPage()
        
            InitializeComponent();
            _connection = DependencyService.Get<SQLiteDb>().GetConnection();
    
        

        // By convention use the "OnAppearing()" method and don't put underlying code in the constructor
        protected override async void OnAppearing()
        
            await _connection.CreateTableAsync<Recipe>();

            var recipes = await _connection.Table<Recipe>().ToListAsync();
            _recipes = new ObservableCollection<Recipe>(recipes);
            recipesListView.ItemsSource = _recipes;

            base.OnAppearing();
        

        async void OnAdd(object sender, System.EventArgs e)
        
            var recipe = new Recipe  Name = "Recipe" + DateTime.Now.Ticks ;
            await _connection.InsertAsync(recipe);
            _recipes.Add(recipe);
        

        async void OnUpdate(object sender, System.EventArgs e)
        
            var recipe = _recipes[0];
            recipe.Name += " UPDATED";

            await _connection.UpdateAsync(recipe);
        

        async void OnDelete(object sender, System.EventArgs e)
        
            var recipe = _recipes[0];

            await _connection.DeleteAsync(recipe);
            _recipes.Remove(recipe);
        
    

所有方法都有效并正确存储。因此,当我关闭应用程序并重新启动它时,数据已成功持久化。但是,如何在我的模拟器中访问这些数据?然后我怎么能将这些数据导出到例如.csv 或 .json 格式?可以看出,它应该在 SpecialFolder.MyDocuments 中。但我在模拟器本身上找不到。

提前致谢

【问题讨论】:

它在应用程序的安全沙箱中,使用可 root 的模拟器图像(即“系统图像”,而不是“Google API 图像”或“Google Play 图像”)或只是复制/保存db 文件到非安全位置,例如:***.com/questions/54126671/… @Viol1997 有什么更新吗? 【参考方案1】:

但是,如何在模拟器中访问这些数据?然后我怎么能将这些数据导出到例如.csv 或 .json 格式?可以看出,它应该在 SpecialFolder.MyDocuments 中。但我在模拟器本身上找不到。

根据你的sqlite数据库路径,它是内部存储,除非它是root,否则你无法在模拟器上找到数据库文件。然后你可以在data/data/com.companyname/files中找到数据库文件。

打开cmd,输入Adb Root来root安卓模拟器,然后输入Adb shell验证是否成功。

如果您想将 sqlite 数据库导出为 csv 文件,请查看以下帖子:

Exporting SQLite Database to csv file in android

【讨论】:

以上是关于如何访问 Android 模拟器中的本地文件夹以检索 SQLite db?的主要内容,如果未能解决你的问题,请参考以下文章

如何访问android中的下载文件夹?

如何通过 HttpRequest 从连接的 Android 设备访问本地 tomcat

Android模拟器如何加载本机地址及访问本机服务器

Android 模拟器无法连接到本地服务器(未指定输入文件)

我的电脑通过 *** 连接,Android 模拟器无法访问本地 Intranet 站点

如何将我的Android模拟器连接到我的本地Web服务器