Где разместить базу данных SQLite, чтобы она была доступна другим приложениям - PullRequest
0 голосов
/ 24 апреля 2018

Мне нужно выполнить некоторые дополнительные действия по устранению неполадок в базе данных SQLite.Я хочу использовать утилиту db для открытия файла, но мое устройство не может быть рутировано.Я хотел скопировать БД в место хранения, где он не был бы заблокирован корневой защитой, но я не могу понять это.Как сделать копию базы данных SQLite в папке на Android, доступной для других приложений?

1 Ответ

0 голосов
/ 25 апреля 2018

Вы можете скопировать базу данных SQLite на SDCard, используя FileSystemStorage API, но это не очень хорошее направление. Лучшим подходом было бы использовать инструмент мониторинга устройств из 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();
...