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

是因为在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框架的全部内容,谢谢观看,欢迎使用.
再就是希望各位在利用受到sqlite相见什么问题或建议好为此以下联系方式进行反馈

android开发讨论群 320120776

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

网站地图xml地图