所以我的应用程序使用内容提供程序和 SQLite 数据库,类似于 Google 记事本示例。我找到了 SimpleXML,并想用它来导入/导出数据库,以便它可以在设备之间传输。我发现的唯一例子就是这个例子。 我希望不必编写一些中间类来传入/传出数据库。有没有人找到一种简单的方法,甚至可以在没有 simplexml 的情况下做到这一点?
问问题
1534 次
2 回答
2
您需要导入/导出整个数据库还是仅部分数据库。对于应传输完整数据库的情况,您可能只需复制通常存储在 /data/data/YOUR_APP/databases 中的数据库文件本身
于 2012-10-10T03:31:24.910 回答
1
public class DataXmlExporter extends DataBaseDemoActivity {
static final String DATASUBDIRECTORY = "bookwormdata";
// private final SQLiteDatabase db;
private XmlBuilder xmlBuilder;
Button butt;
/* public DataXmlExporter(final SQLiteDatabase db) {
this.db = db;
}*/
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main7);
butt=(Button)findViewById(R.id.exportxml);
String exportFileNamePrefix=exportxml;
// public void export(final String dbName, final String exportFileNamePrefix) throws IOException {
Log.i(Constants._COUNT, "exporting database - " + dbname + " exportFileNamePrefix=" + exportFileNamePrefix);
try {
xmlBuilder = new XmlBuilder();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
xmlBuilder.start(dbname);
// get the tables
String sql = "select * from dept";
Cursor c = db.rawQuery(sql, new String[0]);
if (c.moveToFirst()) {
//while (c.moveToNext()) {
String tableName ="dept";//c.getString(c.getColumnIndex("dep_id"));
// skip metadata, sequence, and uidx (unique indexes)
if (!tableName.equals("android_metadata") && !tableName.equals("sqlite_sequence")
&& !tableName.startsWith("uidx")) {
try {
exportTable(tableName);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// }
}
String xmlString = null;
try {
xmlString = xmlBuilder.end();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
writeToFile(xmlString, exportFileNamePrefix + ".xml");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.i(Constants._COUNT, "exporting database complete");
Toast.makeText(DataXmlExporter.this, "DB xml backup Successfully", 2000).show();
butt.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent(DataXmlExporter.this, DataBaseDemoActivity.class);
startActivity(intent);
}
});
}
private void exportTable(final String tableName) throws IOException {
xmlBuilder.openTable(tableName);
String sql = "select * from " + tableName;
Cursor c = db.rawQuery(sql, new String[0]);
if (c.moveToFirst()) {
int cols = c.getColumnCount();
do {
xmlBuilder.openRow();
for (int i = 0; i < cols; i++) {
/*if(i==6)
{
//String id = c.getString( c.getColumnIndex("photo"));
String str = new String(image);
xmlBuilder.addColumn(c.getColumnName(i), str);
}*/
xmlBuilder.addColumn(c.getColumnName(i), c.getString(i));
}
xmlBuilder.closeRow();
} while (c.moveToNext());
}
c.close();
xmlBuilder.closeTable();
}
private void writeToFile(final String xmlString, final String exportFileName) throws IOException {
File dir = new File(Environment.getExternalStorageDirectory(), DataXmlExporter.DATASUBDIRECTORY);
if (!dir.exists()) {
dir.mkdirs();
}
File file = new File(dir, exportFileName);
file.createNewFile();
ByteBuffer buff = ByteBuffer.wrap(xmlString.getBytes());
FileChannel channel = new FileOutputStream(file).getChannel();
try {
channel.write(buff);
} finally {
if (channel != null) {
channel.close();
}
}
}
/**
* XmlBuilder is used to write XML tags (open and close, and a few attributes)
* to a StringBuilder. Here we have nothing to do with IO or SQL, just a fancy StringBuilder.
*
* @author ccollins
*
*/
static class XmlBuilder {
private static final String OPEN_XML_STANZA = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
private static final String CLOSE_WITH_TICK = "'>";
private static final String DB_OPEN = "<database name='";
private static final String DB_CLOSE = "</database>";
private static final String TABLE_OPEN = "<table name='";
private static final String TABLE_CLOSE = "</table>";
private static final String ROW_OPEN = "<row>";
private static final String ROW_CLOSE = "</row>";
private static final String COL_OPEN = "<col name='";
private static final String COL_CLOSE = "</col>";
private final StringBuilder sb;
public XmlBuilder() throws IOException {
sb = new StringBuilder();
}
void start(final String dbName) {
sb.append(XmlBuilder.OPEN_XML_STANZA);
sb.append(XmlBuilder.DB_OPEN + dbName + XmlBuilder.CLOSE_WITH_TICK);
}
String end() throws IOException {
sb.append(XmlBuilder.DB_CLOSE);
return sb.toString();
}
void openTable(final String tableName) {
sb.append(XmlBuilder.TABLE_OPEN + tableName + XmlBuilder.CLOSE_WITH_TICK);
}
void closeTable() {
sb.append(XmlBuilder.TABLE_CLOSE);
}
void openRow() {
sb.append(XmlBuilder.ROW_OPEN);
}
void closeRow() {
sb.append(XmlBuilder.ROW_CLOSE);
}
void addColumn(final String name, final String val) throws IOException {
sb.append(XmlBuilder.COL_OPEN + name + XmlBuilder.CLOSE_WITH_TICK + val + XmlBuilder.COL_CLOSE);
}
}
}
尝试这个。这对我有用。
于 2012-10-30T13:33:25.690 回答