因为在android开发中涉及到数据库方面的开发的过程当中遇到不少麻烦和困扰,就着手写了个android数据库调试管理工具FastAndr-dbms,但愿对你们有点帮助android
二话不说,先上图git
界面仍是比较小清新....github
缺陷web
compile 'cn.hotapk:fastandr_dbms:0.4.0'
复制代码
若是gson冲突spring
compile ('cn.hotapk:fastandr_dbms:0.4.0'){
exclude group: 'com.google.code.gson'
}
复制代码
<uses-permission android:name="android.permission.INTERNET" />
复制代码
try {
FDbManager.init(this).startServer();
} catch (Exception e) {
e.printStackTrace();
}
复制代码
默认端口号为8888,如要配置,按如下方式sql
FDbManager fDbManager= FDbManager.init(this);
fDbManager.setPort(9999);
fDbManager.startServer();
复制代码
浏览器打开 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数据列表bash
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 | 值是一个带符号的整数,根据值的大小存储在一、二、三、四、6 或8 字节中。 |
REAL | 值是一个浮点值,存储为8 字节的IEEE 浮点数字。 |
TEXT | 值是一个文本字符串,使用数据库编码(UTF-八、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框架的所有内容,谢谢观看,欢迎使用. 同时但愿各位在使用中遇到什么问题或建议能够用如下联系方式进行反馈
github地址(感兴趣的话,不妨点赞支持下)