SQLite数据库的位置,以便其他应用程序可用

时间:2018-04-24 20:48:42

标签: codenameone

我需要对SQLite数据库进行一些额外的故障排除。我想使用db实用程序打开文件,但我的设备无法生根。我想将数据库复制到一个存储位置,它不会被根安全性阻止,但我无法弄明白。如何在Android上可以访问其他应用程序的位置复制SQLite数据库?

1 个答案:

答案 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();