ATTACH DATABASE在Android上提供“数据库已在使用中”

时间:2016-11-26 22:12:57

标签: android database sqlite

在iOS和Android上的本机应用程序项目中,我们在android上遇到了 sqlite3 的问题。我们想通过ATTACH DATABASE(sql-command)打开两个数据库并一个数据库连接到第二个数据库。

我们做什么:

  1. 打开sqlite3数据库“user.db”(android上的最终原生文件路径 设备是'/data/user/0/com.company.app/databases/user.db',我们使用 android.database.sqlite.SQLiteDatabase

  2. 打开sqlite3数据库“system.db”

  3. 将用户数据库附加到系统数据库:

  4. 在SQLiteDatabase-Instance for system.db-database上,我们执行

    ATTACH DATABASE '/data/user/0/com.company.app/databases/user.db' AS dbUser
    

    结果:

    这会出现以下错误:

      

    数据库dbUser已在使用中(代码1)

    sqlite3 for iOS上的相同sql语句工作正常,没有任何错误。

    为了完整起见。使用以下语句打开数据库:

    import android.database.sqlite.SQLiteDatabase;
    
    SQLiteDatabase mydb = SQLiteDatabase.openDatabase(dbfile.getAbsolutePath(), null, openFlags);
    

    要求谷歌提供此类错误消息会让很多网站声明,不允许将TEMP用作数据库别名。由于我们使用“dbUser”而不是TEMP,因此应该有另一个原因。我们现在无法理解。

    有人可以帮忙吗?

3 个答案:

答案 0 :(得分:1)

您无需打开要附加的数据库; ATTACH语句已打开它。

无论如何,错误“Database xxx 已被使用”表示某个数据库已附加了该特定名称。

代码的问题在于它被执行了两次。

答案 1 :(得分:0)

通常在执行几次附加命令时会发生这种情况, 您可以使用DETACH命令

# Let's first make sure it works on Python 2.x and 3.x by shadowing the input
try:
    input = raw_input  # on Python 2.x use raw_input instead of input
except NameError:
    pass

result = 0  # tip: use a name that's not already built-in, like result
while True:  # loop 'forever'...
    data = input()  # don't print anything when asking for input
    try:
        data = int(data)  # don't print anything to STDOUT
        if not data:  # only if the integer is 0
            break
        result += data  # add to the final result
    except ValueError:  # risen if the input is not an integer...
        pass  # so just ignore it

print("The sum is: " + str(result))  # finally, print the result

,然后再次连接数据库或使用新名称附加ATTACH,例如:

DETACH DATABASE 'database_name';

记住具有新名称的ATTACH时,与数据库的其他连接仍处于打开状态。

答案 2 :(得分:-1)

没有太多介入,不是“在打开数据库之前附加你做的事情。我一直在使用常规的sql express版本,我相信我不能在打开时附加或分离。附加可能在iOS和android上有不同的处理方式这可能会导致一个问题