Android areaAndroid知识Android开发

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

2017-04-07  本文已影响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的介绍到这里就结束了,有兴趣的朋友也可以去看看源码,学习一下其中的思路。

上一篇下一篇

猜你喜欢

热点阅读