android数据库调试管理工具FastAndr-dbms

384 阅读3分钟

由于在android开发中涉及到数据库方面的开发的过程中遇到很多麻烦和困扰,就着手写了个android数据库调试管理工具FastAndr-dbms,希望对大家有点帮助

二话不说,先上图

图一

图二

图三

界面还是比较小清新....

框架功能使用

功能

  1. 可视化数据编辑界面
  2. 可配置服务端口号
  3. 可增、删、改、查 数据库及SharedPreference的数据

缺陷

  1. 不可自定义sqlite语句查询
  2. 数据库获取到的boolean型数据只能0或1显示

使用

  1. gradle添加
compile 'cn.hotapk:fastandr_dbms:0.4.0'

如果gson冲突

 compile ('cn.hotapk:fastandr_dbms:0.4.0'){
        exclude group: 'com.google.code.gson'
    }
  1. manifest添加网络权限
<uses-permission android:name="android.permission.INTERNET" />
  1. 开启服务
 try {
            FDbManager.init(this).startServer();
        } catch (Exception e) {
            e.printStackTrace();
        }

默认端口号为8888,如要配置,按以下方式

FDbManager  fDbManager= FDbManager.init(this);
fDbManager.setPort(9999);
fDbManager.startServer();
  1. web查看

浏览器打开 http://xxx.xxx.xxx:8888 即可

源码分析

1. http内网服务 由于要使用到内网数据传输,所有要用到http服务. 然后就选用了之前开源过的 FHttpServer http服务框架,这框架可以让你使用得更简单,方便. 使用上类似spring,这框架的好处就不多说了...


/**
 * @author laijian
 * @version 2017/11/25
 * @Copyright (C)上午1:19 , www.hotapk.cn
 * web数据操作
 */
public class FDbController {

    /**
     * 获取数据库列表
     * @return
     */
    @ResponseBody
    @RequestMapping("getDbList")
    public ResponseData getDbList() {
        return FDbService.getDbList();
    }

    /**
     * 获取table列表
     * @param dbname
     * @return
     */
    @ResponseBody
    @RequestMapping("getTables")
    public ResponseData getTables(@RequestParam("dbname") String dbname) {
        return FDbService.getTableList(dbname);
    }
...

2. 获取db列表 获取db数据列表

    List<String> templs = Arrays.asList(FDbManager.getAppContext().databaseList());
            List<String> rows = new ArrayList<>();
            for (int i = 0; i < templs.size(); i++) {
                if (!templs.get(i).matches(".*journal*.|undefined|.*xml|.*shared_prefs*.")) {
                    rows.add(templs.get(i));
                }
            }

Context.databaseList() sdk提供的方法就可以获取数据库列表了 获取数据库列表时,去除一些系统没用的数据库表

3. 获取sharedprefs数据列表

public static String getSharePrefsRootPath() {
        return FDbManager.getAppContext().getApplicationInfo().dataDir + "/shared_prefs";
    }
/**
     * 获取SharedPreference xml数据
     *
     * @return
     */
    public static List<String> getSharedPreferenceXMl() {

        ArrayList<String> tags = new ArrayList<>();
        String rootPath = getSharePrefsRootPath();
        File root = new File(rootPath);
        if (root.exists()) {
            for (File file : root.listFiles()) {
                String fileName = file.getName();
                if (fileName.endsWith(".xml")) {
                    tags.add(fileName);
                }
            }
        }
        Collections.sort(tags);
        return tags;
    }

Context.dataDir + "/shared_prefs" sdk提供的方法可以得到存放SharedPreference的路径

4. 获取数据库表名


  /**
     * 获取数据库所有表名
     *
     * @param database SQLiteDatabase
     * @return
     */
    public static List<String> getAllTableName(SQLiteDatabase database) {
        List<String> tabs = new ArrayList<>();
        Cursor cursor = database.rawQuery("SELECT name FROM sqlite_master WHERE type='table'", null);
        try {
            if (cursor.moveToFirst()) {
                while (!cursor.isAfterLast()) {
                    tabs.add(cursor.getString(0));
                    cursor.moveToNext();
                }
            }
        } catch (Exception e) {
        } finally {
            if (cursor != null) {
                cursor.close();
            }
        }
        return tabs;
    }

"SELECT name FROM sqlite_master WHERE type='table'" sqlite语句可获取表名

5. 获取表数据

先获取表字段及类型

 public static List<FieldInfor> getAllTablefield(SQLiteDatabase database, String tableName) {
        List<FieldInfor> fields = new ArrayList<>();
        Cursor cursor = database.rawQuery("PRAGMA table_info([" + tableName + "])", null);
        if (cursor != null) {
            cursor.moveToFirst();
            if (cursor.getCount() > 0) {
                do {
                    FieldInfor fieldInfor = new FieldInfor();
                    for (int i = 0; i < cursor.getColumnCount(); i++) {
                        final String columnName = cursor.getColumnName(i);
                        switch (columnName) {
                            case "name":
                                fieldInfor.setTitle(cursor.getString(i));
                                break;
                            case "type":
                                fieldInfor.setType(cursor.getString(i));
                                break;
                            case "pk":
                                fieldInfor.setPrimary(cursor.getInt(i) == 1);
                                break;
                            default:
                        }

                    }
                    fields.add(fieldInfor);
                } while (cursor.moveToNext());
            }
            cursor.close();
        }

"PRAGMA table_info([" + tableName + "])" sqlite语句可以获取表字段属性等

名称 描述
name 表字段的名称
type 表字段类型
pk 是否为主键

然后获取表数据

private static void getCursorData(Cursor cursor, List<FieldInfor> allTablefield, List<Map<String, Object>> datas) {
        if (cursor != null && cursor.moveToFirst()) {
            do {
                Map<String, Object> map = new HashMap<>();
                for (int i = 0; i < allTablefield.size(); i++) {
                    switch (allTablefield.get(i).getType()) {
                        case FConstant.BLOB:
                            map.put(allTablefield.get(i).getTitle(), blobToString(cursor.getBlob(i)));
                            break;
                        case FConstant.INTEGER:
                            map.put(allTablefield.get(i).getTitle(), cursor.getInt(i));
                        case FConstant.REAL:
                            map.put(allTablefield.get(i).getTitle(), cursor.getDouble(i));
                        default:
                            map.put(allTablefield.get(i).getTitle(), cursor.getString(i));
                            break;
                    }
                }
                datas.add(map);
            } while (cursor.moveToNext());
        }

    }

sqlite 数据库有以下几种存储类型

存储类 描述
NULL 值是一个NULL 值。
INTEGER 值是一个带符号的整数,根据值的大小存储在1、2、3、4、6 或8 字节中。
REAL 值是一个浮点值,存储为8 字节的IEEE 浮点数字。
TEXT 值是一个文本字符串,使用数据库编码(UTF-8、UTF-16BE 或UTF-16LE)存储。

6. 获取sharedprefs数据

 /**
     * 获取pref的数据
     *
     * @param prefname
     * @return
     */
    public static List<Map<String, Object>> getPrefData(String prefname) {
        SharedPreferences preferences = FDbManager.getAppContext().getSharedPreferences(prefname.replace(".xml", ""), Context.MODE_PRIVATE);
        Map<String, ?> entries = preferences.getAll();
        List<Map<String, Object>> datas = new ArrayList<>();
        for (Map.Entry<String, ?> entry : entries.entrySet()) {
            Map<String, Object> map = new HashMap<>();
            map.put("Key", entry.getKey());
            map.put("Value", entry.getValue().toString());
            if (entry.getValue() instanceof Integer) {
                map.put("dataType", FConstant.INTEGER);
            } else if (entry.getValue() instanceof Long) {
                map.put("dataType", FConstant.LONG);
            } else if (entry.getValue() instanceof Float) {
                map.put("dataType", FConstant.FLOAT);
            } else if (entry.getValue() instanceof Boolean) {
                map.put("dataType", FConstant.BOOLEAN);
            } else if (entry.getValue() instanceof Set) {
                map.put("dataType", FConstant.STRING_SET);
            } else {
                map.put("dataType", FConstant.TEXT);
            }
            datas.add(map);
        }
        return datas;
    }

以上是FastAndr-dbms框架的全部内容,谢谢观看,欢迎使用. 同时希望各位在使用中遇到什么问题或建议可以用以下联系方式进行反馈

android开发讨论群 320120776

个人博客

github地址(感兴趣的话,不妨点赞支持下)