如何在真实设备上查看我的应用程序的sqlite数据库内容?

4
我想在我部署的设备上查看我的应用程序中创建的数据库内容。我可以在模拟器中使用sqlite命令查看,但无法在真实设备上查看。有人知道如何在真实设备中进行操作吗?
5个回答

7

如果应用程序被标记为 debuggable,则不需要 root 权限。您可以使用 run-as adb 命令。

例如,要使用 sqlite:

adb shell "run-as com.your.package sqlite3 databases/database_name"

或者复制并拉取数据库:
adb shell "run-as com.your.package cat databases/database_name > /sdcard/some_name"
adb pull /sdcard/some_name

很不幸,看起来pre-ICS的run-as有相当多的bug,比如问题2079213965


感谢大家的回复,Phillipe也感谢你的回复。复制和拉取对我很有用... - Bijesh
我真后悔没早点发现这个,因为我刚刚花了几个小时来root我的手机,但好在知道了! - jklp
不支持非Root手机,我刚试了一下廉价的Micromax。 - Skynet
它应该可以在非root手机上运行(这实际上是这个问题的重点),但很多手机/Android版本包括有缺陷的run-as(甚至最近也是如此,例如问题58373)。 - bwt

2

实际上您的真实设备没有被root,因此您没有权限访问/data/data/<Application>/database/目录。

唯一的解决方案是将该文件复制到外部存储,并通过SQLiteManager或任何其他SQLite工具查看它。


要复制哪个文件?我在我的真实设备上看不到任何SQLite数据库文件? - Deepak Yadav

1

我认为您需要一个已经root的设备才能访问sqlite。

请看这个讨论


0

试试这个,

你可以将数据库复制到SD卡中,这样你就可以看到你的数据库了。

   public void backup() {
        try {
            File sdcard = Environment.getExternalStorageDirectory();
            File outputFile = new File(sdcard,
                    "YourDatabase.db");

            if (!outputFile.exists()) 
                 outputFile.createNewFile(); 

            File data = Environment.getDataDirectory();
            File inputFile = new File(data,
                    "data/"+getPackageName()+"/databases/"+"YourDatabase.db");
            InputStream input = new FileInputStream(inputFile);
            OutputStream output = new FileOutputStream(outputFile);
            byte[] buffer = new byte[1024];
            int length;
            while ((length = input.read(buffer)) > 0) {
                output.write(buffer, 0, length);
            }
            output.flush();
            output.close();
            input.close();
        } catch (IOException e) {
            e.printStackTrace();
            throw new Error("Copying Failed");
        }
    }

希望能对你有所帮助。

我遇到了 java.io.FileNotFoundException: /data/data/databases/timeline.db (没有那个文件或目录) 的错误,于是我尝试列出该目录的内容。使用以下代码:File file = new File(Environment.getDataDirectory()+"/data/databases"); File[] listOfFiles = file.listFiles(); 但是我得到了一个NullPointerException,这意味着无法访问该文件夹... - Bijesh

0
尝试使用以下函数: copyFile(new File("data/data/<app>/database"),new File("mnt/sdcard/...."))
public void copyFile(File filesrc, File filedst)
 {
  try
 {
  FileInputStream localFileInputStream = new FileInputStream(filesrc);
  FileOutputStream localFileOutputStream = new FileOutputStream(filedst);
  byte[] arrayOfByte = new byte[1024];
  while (true)
  {
    int i = localFileInputStream.read(arrayOfByte);
    if (i == -1)
    {
      localFileOutputStream.close();
      localFileInputStream.close();
      break;
    }
    localFileOutputStream.write(arrayOfByte, 0, i);
  }
}
catch (Exception localException)
{
  Log.d("XXX", "ExceptioncopyFile:" + localException.getMessage(), localException);
}

}


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