设备上sqlite数据库的位置

107

我已经以编程方式创建了一个SQLite数据库,使用默认的扩展SQLiteOpenHelper并覆盖onCreate()方法。这种方式可以在需要时即时创建数据库。

我想使用SQLite浏览器检查我的OS X机器上的db文件内容。 我知道db文件的名称,但是我在设备上找不到它。我通过USB连接到设备并使用Finder和终端查找,但我只是找不到db文件。

在Android设备上,sqlite数据库的默认位置在哪里?


请参见此处:编程获取数据库路径 - shizhen
20个回答

103
你可以在以下位置找到你创建的数据库,它的名称是<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ᵩ
44
在真实手机上,您无法访问/data文件夹。它的权限被设置为“700”。您需要具备root权限才能查看它。 - Falmarri
16
如果您希望从应用程序中获取路径,可以使用context.getDatabasePath("<your-database-name>")方法。实际上,这个方法返回的就是路径。您可以从创建该数据库的应用程序中访问此路径进行读写操作。请注意,只有该应用程序才能对其进行访问。 - Yaroslav Mytkalyk
1
Android默认保存数据库的路径无法在非root设备上访问。因此,访问数据库文件(仅限于调试环境)的最简单方法是修改类的构造函数。在这个答案之后的一些回答中(确切地说,在这里:https://dev59.com/dm855IYBdhLWcg3wPB36#21832714),您将找到我是如何做到这一点的。 - RandomUser
请参见此处:编程获取数据库路径 - shizhen

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
2
这个解决方案很好用。但是,你可以使用getDatabasePath(your_db_name)来获取File对象并使用getAbsolutePath()来获取准确的路径,而不是构造它。 getDatabasePath方法在ContextWrapper中定义。 - Roy
在Android中,文件名和路径名区分大小写。 - Johann

33

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 权限...


这并不完全正确。它不是可浏览的,但其中文件的可访问性取决于它们各自的权限位。 - Chris Stratton
我的手机已经取得了root权限。我该如何“浏览”数据文件夹? - Sreecharan Desabattula
@SreecharanDesabattula,您需要进入adb shell并使用“su”命令切换到超级用户以浏览目录。 - Gautham C.
/system/bin/sh:su:未找到 - eastwater
@Sunnyday Try sudo su - Mohammedsalim Shivani

20

这个问题很旧了,但回答可能会帮助其他人。

在非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);
    }
}

我尝试了这个,但在Logcat中返回错误信息无法打开数据库'/mnt/sdcard/itens'。 - underfilho
2
非常抱歉,这个答案已经四年了。而且原帖也比这更早(2010年)。此时,Android与2010年有很大不同。因此,数据库位置可能在另一个路径中。很抱歉我不能为您提供更多帮助。 - RandomUser
可能是因为应用程序没有被允许写入而导致了错误,无论如何还是谢谢。 - underfilho

13

/data/data/packagename/databases/

ie

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


11

SQLite数据库是一个文件。您可以将该文件移动并复制到另一个系统(例如从手机到工作站),它仍然可以正常工作。Android将该文件存储在/data/data/packagename/databases/目录中。您可以使用adb命令或Eclipse中的File Explorer视图Window > Show View > Other... > Android > File Explorer)来查看、移动或删除它。


9

这可能有点晚,但可以帮助。 您可以通过adb访问数据库而无需对设备进行root处理。

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

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

现在你可以从这里打开。

5
是的,对于调试 APK 需要这样做。否则,在发布版本中不需要这样做(或者在 Android 版本中 run-as 功能无法正常工作时也不需要)。 - Chris Stratton

5
如果您将数据库命名为不带路径的文件,则获取其文件夹的最常见方法如下:
final File dbFile = new File(getFilesDir().getParent()+"/databases/"+DBAdapter.DATABASE_NAME);

这里的DBAdapter.DATABASE_NAME只是一个字符串,比如"mydatabase.db"。
Context.getFilesDir()返回应用程序文件的路径,例如:/data/data/<your.app.packagename>/files/,因此您需要使用.getParent()+"/databases/"来删除"files"并添加"databases"代替它。
顺便说一句,Eclipse会警告您硬编码了"data/data/"字符串,但在这种情况下不会。


3
您可以使用adb shell访问它 如何操作 上面链接的内容:
教程:如何通过命令行访问Android数据库。 当您在程序中开始处理数据库时,能够直接访问它非常重要和有用,以检查程序刚刚完成了什么并进行调试。
在Android上也很重要。
以下是如何操作: 1)启动模拟器(或将真实设备连接到计算机)。我通常从Eclipse启动我的程序。 2)在android工具目录中启动命令提示符。 3)键入adb shell。这将在模拟器/连接的设备上启动unix shell。 4)进入数据库所在的目录:cd data/data,这里列出了设备上所有应用程序的列表。进入您的应用程序目录(请注意,Unix区分大小写!!):cd com.alocaly.LetterGame,并进入您的数据库目录:cd databases。在这里,您可以找到所有数据库。在我的情况下,只有一个(现在):SCORE_DB 5)在要检查/更改的数据库上启动sqlite:sqlite3 SCORE_DB。从这里,您可以检查存在哪些表:.tables 6)输入任何SQL指令:select * from Score;
这很简单,但每次需要时,我都不知道该去哪里找到它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接