导出SQLite表数据作为XML [英] Exporting SQLite Table data as XML

查看:152
本文介绍了导出SQLite表数据作为XML的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我得到一个空指针异常尝试我SQLite数据库的表导出到一个XML文件中。

I am getting a Null pointer Exception while trying to export my SQLite database's table into an XML file.

堆栈跟踪: 链接

- 结果的更新2:
我只是不明白什么是传递(在初始化和调用主要活动的exportData方法的时间)是: DatabaseAssistant DA =新DatabaseAssistant(?myContext,** ** WHAT_IS_PASSED_HERE); DA.exportData(); 结果 - 结果
更新:
提到行从哪里获得NPE是:在 com.astix.reachout.DatabaseAssistant.exportData(DatabaseAssistant.java:72 &放大器; com.astix.reachout .ReachOutMain $ 9.onClick(ReachOutMain.java:347)

--
Update 2: I just don't get it of what is passed in(at time of initializing and calling the exportData Method in Main Activity): DatabaseAssistant DA = new DatabaseAssistant(myContext, **WHAT_IS_PASSED_HERE?**); DA.exportData();
--
Update: Lines mentioned where I get NPE are: at com.astix.reachout.DatabaseAssistant.exportData(DatabaseAssistant.java:72 & com.astix.reachout.ReachOutMain$9.onClick(ReachOutMain.java:347)

哪些 _exporter.startDbExport(_db.getPath()); 可在 DA.exportData() < BR>
- 结果
我提到这个答案
我的数据库助理code:

Which are _exporter.startDbExport( _db.getPath() ); available inside DA.exportData()
--
I referred to this answer. My Database Assistant code:

public class DatabaseAssistant
{
    public String filNameFullPath;
    public long filNameTS;
    public String EXPORT_FILE_NAME;
    //private static final String EXPORT_FILE_NAME = "/sdcard/datanaexport.xml";

    private Context _ctx;
    private SQLiteDatabase _db;
    private Exporter _exporter;

    public String newfilename(){
        System.out.println("inside newfilename()");

        filNameTS = System.currentTimeMillis();
        filNameFullPath = Environment.getExternalStorageDirectory().getPath();
        EXPORT_FILE_NAME = filNameFullPath + "/" + filNameTS +".xml";
        System.out.println("new file name: " + EXPORT_FILE_NAME);
        return EXPORT_FILE_NAME;
    }

    public DatabaseAssistant( Context ctx, SQLiteDatabase db )
    {
        _ctx = ctx;
        _db = db;

        newfilename();
        try
        {
            System.out.println("inside try databaseAssitant() -- file name: " + EXPORT_FILE_NAME);
            // create a file on the sdcard to export the
            // database contents to
            File myFile = new File( EXPORT_FILE_NAME );
                        myFile.createNewFile();

                        FileOutputStream fOut =  new FileOutputStream(myFile);
                        BufferedOutputStream bos = new BufferedOutputStream( fOut );

            _exporter = new Exporter( bos );
        }
        catch (FileNotFoundException e)
        {
            e.printStackTrace();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }

    public void exportData( )
    {
        log( "Exporting Data" );

        try
        {
            System.out.println("inside try exportData()");
            _exporter.startDbExport( _db.getPath() );

            // get the tables out of the given sqlite database
                    String sql = "SELECT * FROM sqlite_master";

                    Cursor cur = _db.rawQuery( sql, new String[0] );
                    Log.d("db", "show tables, cur size " + cur.getCount() );
                    cur.moveToFirst();

                    String tableName;
                    while ( cur.getPosition() < cur.getCount() )
                    {
                        tableName = cur.getString( cur.getColumnIndex( "name" ) );
                        log( "table name " + tableName );

                        // don't process these two tables since they are used
                        // for metadata
                        if ( ! tableName.equals( "android_metadata" ) &&
                        ! tableName.equals( "sqlite_sequence" ) )
                        {
                            exportTable( tableName );
                        }

                        cur.moveToNext();
                    }
                _exporter.endDbExport();
            _exporter.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }

    private void exportTable( String tableName ) throws IOException
    {
        _exporter.startTable(tableName);

        // get everything from the table
        String sql = "select * from " + tableName;
        Cursor cur = _db.rawQuery( sql, new String[0] );
        int numcols = cur.getColumnCount();

        log( "Start exporting table " + tableName );

//      // logging
//      for( int idx = 0; idx < numcols; idx++ )
//      {
//          log( "column " + cur.getColumnName(idx) );
//      }

        cur.moveToFirst();

        // move through the table, creating rows
        // and adding each column with name and value
        // to the row
        while( cur.getPosition() < cur.getCount() )
        {
            _exporter.startRow();
            String name;
            String val;
            for( int idx = 0; idx < numcols; idx++ )
            {
                name = cur.getColumnName(idx);
                val = cur.getString( idx );
                log( "col '" + name + "' -- val '" + val + "'" );

                _exporter.addColumn( name, val );
            }

            _exporter.endRow();
            cur.moveToNext();
        }

        cur.close();

        _exporter.endTable();
    }

    private void log( String msg )
    {
        Log.d( "DatabaseAssistant", msg );
    }

    class Exporter
    {
        private static final String CLOSING_WITH_TICK = "'>";
        private static final String START_DB = "<export-database name='";
        private static final String END_DB = "</export-database>";
        private static final String START_TABLE = "<table name='";
        private static final String END_TABLE = "</table>";
        private static final String START_ROW = "<row>";
        private static final String END_ROW = "</row>";
        private static final String START_COL = "<col name='";
        private static final String END_COL = "</col>";

        private BufferedOutputStream _bos;

        public Exporter() throws FileNotFoundException
        {
            this( new BufferedOutputStream(
                    _ctx.openFileOutput( EXPORT_FILE_NAME,
                    Context.MODE_WORLD_READABLE ) ) );
        }

        public Exporter( BufferedOutputStream bos )
        {
            _bos = bos;
        }

        public void close() throws IOException
        {
            if ( _bos != null )
            {
                _bos.close();
            }
        }

        public void startDbExport( String dbName ) throws IOException
        {
            String stg = START_DB + dbName + CLOSING_WITH_TICK;
            _bos.write( stg.getBytes() );
        }

        public void endDbExport() throws IOException
        {
            _bos.write( END_DB.getBytes() );
        }

        public void startTable( String tableName ) throws IOException
        {
            String stg = START_TABLE + tableName + CLOSING_WITH_TICK;
            _bos.write( stg.getBytes() );
        }

        public void endTable() throws IOException
        {
            _bos.write( END_TABLE.getBytes() );
        }

        public void startRow() throws IOException
        {
            _bos.write( START_ROW.getBytes() );
        }

        public void endRow() throws IOException
        {
            _bos.write( END_ROW.getBytes() );
        }

        public void addColumn( String name, String val ) throws IOException
        {
            String stg = START_COL + name + CLOSING_WITH_TICK + val + END_COL;
            _bos.write( stg.getBytes() );
        }
    }

    class Importer
    {

    }

}

在我的主要活动(的onClick称为下一个按钮):

And in my main activity(called under onClick of a button):

DatabaseAssistant DA = new DatabaseAssistant(myContext, mySQLiteDatabase);
DA.exportData();

下面^(以上声明):

private Context myContext;
private SQLiteDatabase mySQLiteDatabase;

任何建议是AP preciable ..
谢谢

Any suggestion is appreciable.. Thanks

推荐答案

_exporter _db

您构造函数初始化两个变量,所以很可能在 mySQLiteDatabase 给构造已经是
(虽然你的将会的得到一个无效的 _exporter 如果有错误在构造函数中发生的;它是一个坏主意,只是燮preSS异常和去仿佛一切都没有happended,这是不是这里的情况,因为没有堆栈从痕迹)。

Your constructor initializes both variables, so it is likely that the mySQLiteDatabase given to the constructor is already null. (Although you will get an invalid _exporter if any error happens in the constructor; it is a bad idea to just suppress exceptions and go on as if nothing has happended. This is not the case here because there is not stack trace from that.)

这篇关于导出SQLite表数据作为XML的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆