【问题标题】:Using multiple SQLite databases at once一次使用多个 SQLite 数据库
【发布时间】:2010-09-05 09:00:50
【问题描述】:

我有 2 个 SQLite 数据库,一个从服务器下载 (server.db),一个用作客户端的存储 (client.db)。我需要使用服务器数据库中的数据对客户端数据库执行各种同步查询。

例如,我想删除client.db tRole 表中的所有行,并用server.db tRole 表中的所有行重新填充。

另一个例子,我想删除client.db tFile 表中fileID 不在server.db tFile 表中的所有行。

在 SQL Server 中,您只需在表前加上数据库名称即可。无论如何在使用 Adob​​e Air 的 SQLite 中执行此操作?

【问题讨论】:

  • "从数据库级别无法做到这一点。"为何如此? SQLite 有一个attach 关键字,允许您附加另一个数据库。而 Theo 的回答表明 Air 似乎有相应的 API 调用。当您特别说“从数据库级别”时,我是否遗漏了一些区别?

标签: actionscript-3 apache-flex sqlite air adobe


【解决方案1】:

在 SQLite 中一次打开多个数据库是可能的,但在 Flex/AIR 中是否可以完成则值得怀疑。在命令行客户端中运行 ATTACH DATABASE path/to/other.db AS otherDb,然后您可以将该数据库中的表称为 otherDb.tableName,就像在 MySQL 或 SQL Server 中一样。

可以使用语法 database-name.table-name 来引用附加数据库中的表。

ATTACH DATABASE documentation at sqlite.org

【讨论】:

    【解决方案2】:

    我刚刚查看了 AIR SQL API,SQLConnection 上有一个 attach 方法,看起来正是您需要的。

    我没有对此进行测试,但根据文档它应该可以工作:

    var connection : SQLConnection = new SQLConnection();
    
    connection.open(firstDbFile);
    connection.attach(secondDbFile, "otherDb");
    
    var statement : SQLStatement = new SQLStatement();
    
    statement.connection = connection;
    statement.text = "INSERT INTO main.myTable SELECT * FROM otherDb.myTable";
    statement.execute();
    

    该代码 sn-p 中可能存在错误,我最近使用 AIR SQL API 的工作不多。请注意,使用open 打开的数据库的表可以使用main.tableName 获得,任何附加的数据库都可以被赋予任何名称(上例中的otherDb)。

    【讨论】:

      【解决方案3】:

      这段代码可以工作,是我写的:

      package lib.tools
      
      import flash.utils.ByteArray;
      import flash.data.SQLConnection;
      import flash.data.SQLStatement;
      import flash.data.SQLResult;
      import flash.data.SQLMode; 
      import flash.events.SQLErrorEvent;
      import flash.events.SQLEvent;
      import flash.filesystem.File;
      import mx.core.UIComponent;
      import flash.data.SQLConnection;
      
      public class getConn {
          public var Conn:SQLConnection;
      
          public function getConn(database:Array) {       
              Conn = new SQLConnection();
              var Key:ByteArray = new ByteArray();
              Key.writeUTFBytes("Some16ByteString"); 
              Conn.addEventListener(SQLErrorEvent.ERROR, createError);
              var dbFile:File = File.applicationDirectory.resolvePath(database[0]);
              Conn.open(dbFile);
              if(database.length > 1) {
                  for(var i:Number = 1; i < database.length; i++) {
                      var DBname:String = database[i];
                      Conn.attach(DBname.split("\.")[0], File.applicationDirectory.resolvePath(DBname));
                  }
              }
              Conn.open(dbFile, SQLMode.CREATE, false, 1024, Key); 
          }
      
          private function createError(event:SQLErrorEvent):void {
              trace("Error code:", event.error.details);
              trace("Details:", event.error.message);
          }
      
          public function Rs(sql:Array):Object {
              var stmt:SQLStatement = new SQLStatement();
              Conn.begin();
              stmt.sqlConnection = Conn;
              try {
                  for(var i:String in sql) {          
                      stmt.text = sql[i]; 
                      stmt.execute();
                  }
                  Conn.commit();
              } catch(error:SQLErrorEvent) {
                  createError(error);
                  Conn.rollback();
              };
              var result:Object =stmt.getResult();
              return result;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2016-11-27
        • 1970-01-01
        • 2011-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多