导出SQLite表数据作为XML [英] Exporting SQLite Table data as 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屋!