2012-04-29 232 views
3

我有两个SQLiteDatabase数据库实例。我需要将数据从一个复制到另一个。 我需要执行此查询:来自sql查询的多个数据库操作

INSERT INTO `toDB`.`tableName` SELECT * FROM `fromDB`.`tableName` 

那么,我该如何做到这我的数据库实例?如何替换toDB和fromDB?

+0

你需要从一个表在同一个数据库复制到另一个? – waqaslam 2012-04-29 11:16:57

+0

将第一个数据库中的一个表复制到第二个数据库 – pleerock 2012-04-29 11:21:27

回答

2

从未尝试过这一点,但它应该以这种方式工作:

你必须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获取数据库的路径,因为不能保证所有设备上的路径都是相同的。

+0

,但是您可以使用**/data/data /...**访问其他应用程序的数据库吗? – waqaslam 2012-04-29 11:18:54

+0

如果数据库文件具有正确的权限是:[MODE_WORLD_READABLE](http://developer.android.com/reference/android/content/Context.html#MODE_WORLD_READABLE),但通常不是。 – zapl 2012-04-29 11:21:19

+0

幸运的是我的数据库存储在SD卡中,所以这种方法已经奏效。谢谢。但我仍然想知道是否有更多最佳方法 – pleerock 2012-04-29 13:38:20

0

是的,你可以做到这一点如下:

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(); 
      } 
     } 
    }