我有两个SQLiteDatabase
数据库实例。我需要将数据从一个复制到另一个。 我需要执行此查询:来自sql查询的多个数据库操作
INSERT INTO `toDB`.`tableName` SELECT * FROM `fromDB`.`tableName`
那么,我该如何做到这我的数据库实例?如何替换toDB和fromDB?
我有两个SQLiteDatabase
数据库实例。我需要将数据从一个复制到另一个。 我需要执行此查询:来自sql查询的多个数据库操作
INSERT INTO `toDB`.`tableName` SELECT * FROM `fromDB`.`tableName`
那么,我该如何做到这我的数据库实例?如何替换toDB和fromDB?
从未尝试过这一点,但它应该以这种方式工作:
你必须ATTACH在SQLite的级别的其他数据库,以便源码可以直接访问它。
例如您打开应在toDB
数据库并发出以下命令(通过execSQL
)
ATTACH DATABASE '/data/data/your.package/databases/dbname.db' AS fromDB
你应该可以访问其它数据库现在可以做
INSERT INTO main.tableName SELECT * FROM fromDbB.tableName
您最初打开的数据库自动具有名称“main”。
您可以并应该通过Context#getDatabasePath获取数据库的路径,因为不能保证所有设备上的路径都是相同的。
,但是您可以使用**/data/data /...**访问其他应用程序的数据库吗? – waqaslam 2012-04-29 11:18:54
如果数据库文件具有正确的权限是:[MODE_WORLD_READABLE](http://developer.android.com/reference/android/content/Context.html#MODE_WORLD_READABLE),但通常不是。 – zapl 2012-04-29 11:21:19
幸运的是我的数据库存储在SD卡中,所以这种方法已经奏效。谢谢。但我仍然想知道是否有更多最佳方法 – pleerock 2012-04-29 13:38:20
是的,你可以做到这一点如下:
DatabaseHelper dbHelper = DatabaseHelper.create(CMOSApplication.getInstance()); SQLiteDatabase db = null; try { db = dbHelper.getWritableDatabase(); db.execSQL("attach database ? as oldDB", new String[] { CMOSApplication.getInstance().getDatabasePath("cmos_database").getPath() }); db.execSQL("insert into task select * from oldDB.task"); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { if(db != null){ try { db.execSQL("detach oldDB"); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
你需要从一个表在同一个数据库复制到另一个? – waqaslam 2012-04-29 11:16:57
将第一个数据库中的一个表复制到第二个数据库 – pleerock 2012-04-29 11:21:27