如何访问 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?的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 HttpRequest 从连接的 Android 设备访问本地 tomcat
Android 模拟器无法连接到本地服务器(未指定输入文件)