【问题标题】:Printing all rows of a SQLite database in Android在 Android 中打印 SQLite 数据库的所有行
【发布时间】:2014-11-18 20:32:16
【问题描述】:

出于调试/检查点的目的,我想在 Android 中打印出 SQLite 数据库的所有行。我没有找到任何东西可以回答这个精确的问题:如何以人类可读的格式轻松打印 SQLite 数据库的所有行?

【问题讨论】:

    标签: java android sqlite


    【解决方案1】:

    我想出的解决方案是这样的:

    public class DbHelper extends SQLiteOpenHelper {
        String TAG = "DbHelper";
        ... // functions omitted
    
    
        /**
         * Helper function that parses a given table into a string
         * and returns it for easy printing. The string consists of 
         * the table name and then each row is iterated through with
         * column_name: value pairs printed out.
         *
         * @param db the database to get the table from
         * @param tableName the the name of the table to parse
         * @return the table tableName as a string
         */
        public String getTableAsString(SQLiteDatabase db, String tableName) {
            Log.d(TAG, "getTableAsString called");
            String tableString = String.format("Table %s:\n", tableName);
            Cursor allRows  = db.rawQuery("SELECT * FROM " + tableName, null);
            if (allRows.moveToFirst() ){
                String[] columnNames = allRows.getColumnNames();
                do {
                    for (String name: columnNames) {
                        tableString += String.format("%s: %s\n", name,
                                allRows.getString(allRows.getColumnIndex(name)));
                    }
                    tableString += "\n";
    
                } while (allRows.moveToNext());
            }
    
            return tableString;
        }
    
    }
    

    希望这对你们中的一些人有所帮助。

    【讨论】:

    • 别忘了关闭光标。
    • 您的方法很棒,但我希望我可以在两个字符串中分别返回所有列。 (我有 2。一封电子邮件和一个密码)。
    • 包括进口会很好
    【解决方案2】:

    我稍微改了一下:把Cursor分隔成字符串(可以独立使用),设计成表格打印。

    public String tableToString(SQLiteDatabase db, String tableName) {
        Log.d("","tableToString called");
        String tableString = String.format("Table %s:\n", tableName);
        Cursor allRows  = db.rawQuery("SELECT * FROM " + tableName, null);
        tableString += cursorToString(allRows);
        return tableString;
    }
    
    public String cursorToString(Cursor cursor){
        String cursorString = "";
        if (cursor.moveToFirst() ){
            String[] columnNames = cursor.getColumnNames();
            for (String name: columnNames) 
                cursorString += String.format("%s ][ ", name);
            cursorString += "\n";
            do {
                for (String name: columnNames) {
                    cursorString += String.format("%s ][ ",
                            cursor.getString(cursor.getColumnIndex(name)));
                }
                cursorString += "\n";
            } while (cursor.moveToNext());
        }
        return cursorString;
    }
    

    【讨论】:

      【解决方案3】:

      另一个更快的选择是使用有根设备,然后将应用程序数据库导出到您的开发机器,以便使用能够读取 sqlite dbs 的桌面应用程序打开。 Google play 上还有一个名为 sqlite 调试器的应用程序,您可以使用它来查看应用程序数据库,但这又需要 root。

      【讨论】:

      • 感谢您的建议!我可以看到用例会是更好的方法。
      • 你不需要root设备来下载db到开发PC。
      • @RalphMclee 需要详细说明吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-23
      • 2018-04-28
      • 2014-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多