美文网首页Android areaAndroid知识Android开发
再也不用担心调试数据库的问题了

再也不用担心调试数据库的问题了

作者: 街头客 | 来源:发表于2017-04-07 15:00 被阅读263次

    gif效果图

    gif效果图

    背景

    Android开发中比较让人蛋疼的其中一个问题就是关于数据库数据的操作。

    一般我们能操作数据库无非就大概下面几个方法:
    1,root过的手机,然后用手机连接电脑,电脑导出数据库;
    2,采用模拟器建立模拟手机,然后用【Android Device Monitor】-->【File Exploer】进入【data】目录,获取数据库;
    3,安装Android Studio插件,例如SQLScout,可以直接查看,但是。。。要钱;

    然后在偶然的机会,我浏览到了Android Debug Database开源包,在build.gradle中配置后,可以很方便的利用浏览器对数据库进行操作。

    Android调试数据库能做什么?

    1,查看所有数据库;
    2,在给定的数据库上运行SQL查询来更新和删除您的数据;
    3,直接编辑数据库值。
    4,直接删除数据库数据。
    5,排序数据;
    6,下载数据库。

    build.gradle中配置

    // 数据库调试 2017/4/6 09:20
    debugCompile 'com.amitshekhar.android:debug-db:1.0.0'
    

    编译后,运行app,在logcat中会打印出如下日志:

    04-07 14:21:42.653 29009-29009/com.medtrust.doctor D/DebugDB: Open http://192.168.0.127:8080 in your browser
    

    打开上面的网址,就可以很方面的操作数据库,如下图:

    效果图

    需要注意的问题:

    1,手机跟电脑得连接在同一网段下;
    2,如果你想使用不同的端口以外的8080,在应用程序的build.gradle文件下buildtypes做如下的改变:

    debug {
        resValue("string", "PORT_NUMBER", "8081")
    }
    

    3,关于页面的操作请求,全部在【com.amitshekhar.server.RequestHandler.java】该路径下,在如下代码块中:

    if (route.startsWith("getDbList")) { // 获取数据库列表
        final String response = getDBListResponse();
        bytes = response.getBytes();
    } else if (route.startsWith("getAllDataFromTheTable")) { // 根据数据库名称,获取所有表数据
        final String response = getAllDataFromTheTableResponse(route);
        bytes = response.getBytes();
    } else if (route.startsWith("getTableList")) { // 获取所有表
        final String response = getTableListResponse(route);
        bytes = response.getBytes();
    } else if (route.startsWith("updateTableData")) { // 修改表数据
        final String response = updateTableDataAndGetResponse(route);
        bytes = response.getBytes();
    } else if (route.startsWith("deleteTableData")) { // 删除表数据
        final String response = deleteTableDataAndGetResponse(route);
        bytes = response.getBytes();
    } else if (route.startsWith("query")) { // 查询表数据
        final String response = executeQueryAndGetResponse(route);
        bytes = response.getBytes();
    } else if (route.startsWith("downloadDb")) { // 下载数据库
        bytes = Utils.getDatabase(mSelectedDatabase, databaseFiles);
    } else {
        bytes = Utils.loadContent(route, mAssets);
    }
    

    4,关于数据库的导出,我自己也做了如下尝试,也能把数据库拿出来:

    String[] str = this.databaseList(); // 数据库名称列表
    File file;
    for (int i = 0; i < str.length; i++) {
        file = this.getDatabasePath(str[i]); // 根据名称,获取数据库File
        if (file != null) {
            if ("ml_home".equals(str[i])) { // 获取对应的数据库名称
                _exportDB(file);
            }
        }
    }
    
    /**
     * 导出数据库 2017/4/6 11:29
     * @param file 数据库文件
     */
    private void _exportDB(final File file) {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                FileInputStream fis = null;
                FileOutputStream fos = null;
    
                try {
                    fis = new FileInputStream(file);
                    File writeFile = new File(Environment.getExternalStorageDirectory(), "ml_home.db");
                    if (writeFile.exists())
                        writeFile.delete();
                    else
                        writeFile.createNewFile();
    
                    fos = new FileOutputStream(writeFile);
                    while (true) {
                        int i = fis.read();
                        if (i != -1) {
                            fos.write(i);
                        } else {
                            break;
                        }
                    }
    
                    fos.flush();
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    try {
                        fos.close();
                        fis.close();
                    } catch (IOException ioe) {
                    }
                }
            }
        };
    
        new Thread(runnable).start();
    
    }
    

    好了,这个Android Debug Database的介绍到这里就结束了,有兴趣的朋友也可以去看看源码,学习一下其中的思路。

    相关文章

      网友评论

      • 卜俊文:SQLScout插件有破解版的哦,不过用了会感觉有点问题,表还打不开,无语了,
        这个Android Debug Database库,配置完打开地址总是空白的,打开页面总是一直白色的,以前试过可以,现在好像何难打开那个数据库页面,连同一个wifi的
        卜俊文:@街头客 我第一次也可以用0 0,之后就很难可以打开了= =,应该是网络问题吧。
        街头客:@卜俊文 哦?我刚写这文章的时候,图都是刚做的,还可以用啊。。。我的同事昨天也都可以使用,:joy:,没碰到你说的这种情况,奇怪了。

      本文标题:再也不用担心调试数据库的问题了

      本文链接:https://www.haomeiwen.com/subject/jfshattx.html