sqlite数据库在设备上的位置


100

我已经使用默认的扩展SQLiteOpenHelper和覆盖方式以编程方式创建了一个sqlite数据库onCreate()。这样,可以在需要时动态创建数据库。

我想使用sqlite浏览器检查OS X机器上db文件的内容。我知道db文件的名称,但是在设备上找不到它。我已经通过USB连接到设备,并使用finder和terminal进行了查找,但是我只是找不到db文件。

Android设备上的sqlite数据库的默认位置是什么?


Answers:


96

您可以找到创建的数据库,名为 <your-database-name>

//data/data/<Your-Application-Package-Name>/databases/<your-database-name>

使用文件资源管理器将其拉出,并将其重命名为.db3扩展名,以在SQLiteExplorer中使用它

使用DDMS的文件浏览器导航到仿真器目录。


1
当我在模拟器中尝试该命令时,可以将CD刻录到/ data。但是,当我用连接的Galaxy Vibrant尝试该操作时,无法将CD刻录到/ data。在这两种情况下,adb服务器是否以不同的方式运行?
罗伯(Robᵩ)2010年

42
您无权访问真实电话上的/ data文件夹。它被切碎了700。您需要root特权才能看到它。
Falmarri 2010年

15
以防万一,如果您想从应用程序获取路径则为context.getDatabasePath(“ <您的数据库名称>”)。实际上返回上面的路径。您可以通过创建数据库的应用程序访问此路径以进行读写。
Yaroslav Mytkalyk

无法在非root用户的设备上访问Android保存数据库的默认路径。因此,访问数据库文件的最简单方法(仅用于调试环境)是修改类的构造函数。在此之后的一些答案(恰好在这里:stackoverflow.com/a/21832714/2982814),您将找到我的管理方法。
RandomUser '17


45

为此,我所做的是

File f=new File("/data/data/your.app.package/databases/your_db.db3");
FileInputStream fis=null;
FileOutputStream fos=null;

try
{
  fis=new FileInputStream(f);
  fos=new FileOutputStream("/mnt/sdcard/db_dump.db");
  while(true)
  {
    int i=fis.read();
    if(i!=-1)
    {fos.write(i);}
    else
    {break;}
  }
  fos.flush();
  Toast.makeText(this, "DB dump OK", Toast.LENGTH_LONG).show();
}
catch(Exception e)
{
  e.printStackTrace();
  Toast.makeText(this, "DB dump ERROR", Toast.LENGTH_LONG).show();
}
finally
{
  try
  {
    fos.close();
    fis.close();
  }
  catch(IOException ioe)
  {}
}

为此,您的应用必须具有访问SD卡的权限,并将以下设置添加到manifest.xml

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

不是一个绝妙的方法,但是有效。


真好 我一直在寻找。也可以选择将完整的数据库上传到服务器以这种方式进行分析。
Jeroen

3
如果不起作用,请使用数据库名称“ /data/data/your.app.package/databases/your_db”,只需删除扩展名“ .db3”
Nigel Crasto

1
此解决方案工作正常。但是,您可以使用getDatabasePath(your_db_name)获取File对象,并使用getAbsolutePath()获取准确的路径,而不用构造它。getDatabasePath方法在ContextWrapper中定义。
罗伊

文件和路径名称在Android中区分大小写。
AndroidDev '16

29

Context包含许多路径函数:Context.getXXXPath()
其中之一是android.content.Context.getDatabasePath(String dbname),该函数 返回名为dbname的数据库的绝对路径。

Context ctx = this; // for Activity, or Service. Otherwise simply get the context.
String dbname = "mydb.db";
Path dbpath = ctx.getDatabasePath(dbname);

在这种情况下,返回的路径将类似于:

/data/data/com.me.myapp/databases/mydb.db

请注意,如果使用SQLiteOpenHelper打开数据库,则会自动生成此路径。


25

如果您正在谈论真实设备,/data/data/<application-package-name>则无法访问。您必须具有root权限...


那不是真的。这不是可浏览的,但是其中文件的可访问性取决于它们各自的权限位。
克里斯·斯特拉顿

我的手机已扎根。如何“浏览”数据文件夹?
Sreecharan Desabattula,2014年

@SreecharanDesabattula,您需要转到adb shell并使用“ su”命令切换到超级用户来浏览目录。
Gautham C. 2014年

/ system / bin / sh:su:找不到
晴天,

@Sunnyday Trysudo su
Mohammedsalim Shivani

19

这是一个古老的问题,但回答可能会帮助他人。

无法在非root用户的设备上访问Android保存数据库的默认路径。因此,访问数据库文件的最简单方法(仅用于调试环境)是修改类的构造函数:

public class MySQLiteOpenHelper extends SQLiteOpenHelper {
    MySQLiteOpenHelper(Context context) {
        super(context, "/mnt/sdcard/database_name.db", null, 0);
    }
}

请记住,要针对生产环境更改以下行:

public class MySQLiteOpenHelper extends SQLiteOpenHelper {
    MySQLiteOpenHelper(Context context) {
        super(context, "database_name.db", null, 0);
    }
}

我尝试了此操作,并Failed to open database '/mnt/sdcard/itens'.Logcat
underfilho

1
我很抱歉。这个答案已经四岁了。而且OP的版本早于该版本(2010)。目前,Android与2010年有很大不同。因此,数据库位置可以在其他路径上。抱歉,不能为您提供更多帮助。
RandomUser '18

可能是由于不允许应用程序编写而发生错误,还是要感谢
underfilho

12

/data/data/packagename/databases/

/data/data/com.example.program/databases/


9

SQLite数据库只是一个文件。您可以将该文件拿走,四处移动,甚至将其复制到另一个系统(例如,从手机到工作站),都可以正常工作。Android将文件存储在/data/data/packagename/databases/目录中。您可以在Eclipse()中使用adb command或来查看,移动或删除它。File Explorer viewWindow > Show View > Other... > Android > File Explorer


9

好吧,这可能会晚了,但会有所帮助。您可以访问数据库而无需通过adb植根设备

使用cmd启动adb并键入以下命令

-run-as com.your.package  
-shell@android:/data/data/com.your.package $ ls  
cache  
databases  
lib  
shared_prefs  

现在您可以从这里开始。


4
是的,用于调试APK。否,仅适用于量产版(或运行方式已被破坏的Android版本)。
克里斯·斯特拉顿

5

如果您将数据库命名为文件而未给出路径,则最常见的获取文件夹的方法如下:

final File dbFile = new File(getFilesDir().getParent()+"/databases/"+DBAdapter.DATABASE_NAME);

这里DBAdapter.DATABASE_NAME只是一个String类似“mydatabase.db”。
Context.getFilesDir()返回应用程序文件的路径,例如:/data/data/<your.app.packagename>/files/多数民众赞成为什么.getParent()+"/databases/"要删除“文件”并添加“数据库”。
BTW Eclipse会警告您有关硬编码的“ data / data /”字符串,但在这种情况下则不会。


3
By Default it stores to:    

String DATABASE_PATH = "/data/data/" + PACKAGE_NAME + "/databases/" + DATABASE_NAME;

Where:

String DATABASE_NAME = "your_dbname";
String PACKAGE_NAME = "com.example.your_app_name";

并检查您的数据库是否存储到设备存储中。如果是这样,则必须在Manifest.xml中使用权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

3

您可以使用adb shell操作方法来访问它

上面链接的内容:

教程:如何使用命令行访问Android数据库。当您开始在程序中处理数据库时,能够在程序外部直接访问它,检查程序刚完成并进行调试非常重要且有用。

这在Android上也很重要。

这是这样做的方法:

1)启动仿真器(或将您的真实设备连接到PC)。为此,我通常从Eclipse启动我的程序之一。2)在android tools目录中启动命令提示符。3)输入adb shell。这将在您的仿真器/连接的设备上启动一个unix shell。4)转到数据库所在的目录:cd数据/数据在这里您拥有设备上所有应用程序的列表进入应用程序目录(请注意,Unix区分大小写!!)cd com.alocaly.LetterGame并下降在数据库目录中:cd数据库在这里您可以找到所有数据库。就我而言,只有一个(现在):SCORE_DB 5)在要检查/更改的数据库上启动sqlite:sqlite3 SCORE_DB在这里,您可以检查存在哪些表:.tables 6)输入所需的任何SQL指令:从得分中选择*;

这很简单,但是每次需要时,我都不知道在哪里可以找到它。


1

如果您的应用程序创建了数据库,则默认情况下将此数据库保存在目录中 DATA/data/APP_NAME/databases/FILENAME.

以上目录的各个部分是根据以下规则构造的。DATA是Environment.getDataDirectory()方法返回的路径。APP_NAME是您的应用程序名称。FILENAME是您在数据库的应用程序代码中指定的名称。


0

您还可以检查IDE是否具有Eclipse的DDMS透视图之类的实用程序,该实用程序可让您浏览目录和/或在仿真器或有根设备中进行文件复制。


0

定义您的数据库名称,例如:

private static final String DATABASE_NAME = "/mnt/sdcard/hri_database.db";

您可以在中查看数据库:

storage/sdcard0/yourdatabasename.db

0

公共类MySQLiteOpenHelper扩展了SQLiteOpenHelper {MySQLiteOpenHelper(Context context){super(context,“ /mnt/sdcard/database_name.db”,null,0); }}

不要硬编码“ / sdcard /”;使用Environment.getExternalStorageDirectory()。getPath()代替


0

不要像这样对路径进行硬编码//data/data/<Your-Application-Package-Name>/databases/<your-database-name>。很好,它在大多数情况下都可以正常工作,但是这种情况不适用于可以支持多个用户的设备。路径可以像//data/user/10/<Your-Application-Package-Name>/databases/<your-database-name>。可能的解决方案是使用context.getDatabasePath(<your-database-name>)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.