错误:SQL不完整:ls

时间:2016-05-27 05:34:59

标签: java android sqlite shell root

我正在尝试访问另一个应用程序的数据库并将其内容打印到控制台(USING ROOT),但出于某种原因我收到了这样的回复:

E/[Error]: Error: incomplete SQL: ls
E/[Error]: exit

我真的不明白为什么会这样。我试图将我的语法放在转义引号中,我尝试了其他sqlite命令,但它似乎没有正常工作。

我可以使用ADB通过我的PC以相同的路径访问数据库并使用ADB打印内容,如果我按下应用程序中的按钮,它会要求我访问root权限,因此这些不是问题。

我愚蠢的代码:

  

的onCreate

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button btnCon = (Button)findViewById(R.id.button1);
        btnCon.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                RunWithRoot("su shell -c sqlite3 \"data/data/app.package/databases/Database.db\" \"select * from messages;\"");
            }
        });
    }
  

RunWithRoot

private void RunWithRoot(String textView) {
        try {
            String line;
            Process process = Runtime.getRuntime().exec(textView);
            OutputStream stdin = process.getOutputStream();
            InputStream stderr = process.getErrorStream();
            InputStream stdout = process.getInputStream();

            stdin.write(("ls\n").getBytes());
            stdin.write("exit\n".getBytes());
            stdin.flush();

            stdin.close();
            BufferedReader br =
                    new BufferedReader(new InputStreamReader(stdout));
            while ((line = br.readLine()) != null) {
                Log.d("[Output]", line);
            }
            br.close();
            br =
                    new BufferedReader(new InputStreamReader(stderr));
            while ((line = br.readLine()) != null) {
                Log.e("[Error]", line);
            }
            br.close();

            process.waitFor();
            process.destroy();

        } catch (Exception ex) {
        }
    }

有人知道我做错了什么吗?我对Android开发很新,甚至更新root。如果有人能用这个把我拉向正确的方向,那将是非常感激的。

PS:这个应用程序仅供个人使用,所以我不需要检查是否有人有根,或者路径是否存在等等。我已经听过一些开发人员的想法担心嘿

1 个答案:

答案 0 :(得分:0)

我使用以下代码修复了它。

private void RunWithRoot(){
    String line;
    Process process = Runtime.getRuntime().exec("su shell");
    OutputStream stdin = process.getOutputStream();
    InputStream stderr = process.getErrorStream();
    InputStream stdout = process.getInputStream();

    stdin.write("su -c 'sqlite3 \"/data/data/app.pkge/databases/Database.db\" \"select * from messages;\"'\n".getBytes());
    stdin.flush();

    stdin.close();
    BufferedReader br = new BufferedReader(new InputStreamReader(stdout));
    while ((line = br.readLine()) != null) {
        Log.d("[Output]", line);
    }
    br.close();
    br = new BufferedReader(new InputStreamReader(stderr));
    while ((line = br.readLine()) != null) {
        Log.e("[Error]", line);
    }
    br.close();

    process.waitFor();
    process.destroy();
}

现在它正常工作!主要是感谢@ScaryWombat!