我需要对SQLite数据库进行一些额外的故障排除。我想使用db实用程序打开文件,但我的设备无法生根。我想将数据库复制到一个存储位置,它不会被根安全性阻止,但我无法弄明白。如何在Android上可以访问其他应用程序的位置复制SQLite数据库?
答案 0 :(得分:0)
您可以使用FileSystemStorage
API将SQLite数据库复制到SDCard,但这不是一个好方向。更好的方法是使用Android Studio中的设备监控工具,您可以在其中浏览设备文件系统,请参阅:https://developer.android.com/studio/debug/device-file-explorer.html
将此文件复制到桌面后,您可以使用以下内容检查数据库:http://sqlitebrowser.org/
就个人而言,我只想添加一个"黑客模式"到应用程序并从此处集成此代码段,以便我可以检查数据库:https://www.codenameone.com/javadoc/com/codename1/db/Database.html
Style s = UIManager.getInstance().getComponentStyle("TitleCommand");
FontImage icon = FontImage.createMaterial(FontImage.MATERIAL_QUERY_BUILDER, s);
Form hi = new Form("SQL Explorer", new BorderLayout());
hi.getToolbar().addCommandToRightBar("", icon, (e) -> {
TextArea query = new TextArea(3, 80);
Command ok = new Command("Execute");
Command cancel = new Command("Cancel");
if(Dialog.show("Query", query, ok, cancel) == ok) {
Database db = null;
Cursor cur = null;
try {
db = Display.getInstance().openOrCreate("MyDB.db");
if(query.getText().startsWith("select")) {
cur = db.executeQuery(query.getText());
int columns = cur.getColumnCount();
hi.removeAll();
if(columns > 0) {
boolean next = cur.next();
if(next) {
ArrayList<String[]> data = new ArrayList<>();
String[] columnNames = new String[columns];
for(int iter = 0 ; iter < columns ; iter++) {
columnNames[iter] = cur.getColumnName(iter);
}
while(next) {
Row currentRow = cur.getRow();
String[] currentRowArray = new String[columns];
for(int iter = 0 ; iter < columns ; iter++) {
currentRowArray[iter] = currentRow.getString(iter);
}
data.add(currentRowArray);
next = cur.next();
}
Object[][] arr = new Object[data.size()][];
data.toArray(arr);
hi.add(BorderLayout.CENTER, new Table(new DefaultTableModel(columnNames, arr)));
} else {
hi.add(BorderLayout.CENTER, "Query returned no results");
}
} else {
hi.add(BorderLayout.CENTER, "Query returned no results");
}
} else {
db.execute(query.getText());
hi.add(BorderLayout.CENTER, "Query completed successfully");
}
hi.revalidate();
} catch(IOException err) {
Log.e(err);
hi.removeAll();
hi.add(BorderLayout.CENTER, "Error: " + err);
hi.revalidate();
} finally {
Util.cleanup(db);
Util.cleanup(cur);
}
}
});
hi.show();