1

我有一个非常不寻常的问题。

我正在尝试创建一个简单的数据库(6 个表,其中 4 个只有 2 列)。我正在使用我在以前的项目中使用过的内部数据库库,它确实有效。

但是,在我当前的项目中,偶尔会出现错误。基本上数据库没有正确创建。它被添加到 sdcard 中,但是当我访问它时,我得到一个DatabaseException.

当我从桌面管理器访问设备并尝试打开数据库(使用 SQLite 数据库浏览器 v2.0b1)时,我得到“文件不是 SQLite 3 数据库”。

更新
我发现当我从 sdcard 中手动删除数据库时会发生这种情况。由于无法阻止用户这样做,我能做些什么来处理它吗?

代码

public static boolean initialize()
{
    boolean memory_card_available = ApplicationInterface.isSDCardIn();
    String application_name = ApplicationInterface.getApplicationName();
    if (memory_card_available == true)
    {
        file_path = "file:///SDCard/" + application_name + ".db";
    }
    else
    {
        file_path = "file:///store/" + application_name + ".db";
    }

    try
    {
        uri = URI.create(file_path);
        FileClass.hideFile(file_path);
    } catch (MalformedURIException mue)
    {
    }

    return create(uri);
}

private static boolean create(URI db_file)
{
    boolean response = false;

    try
    {
        db = DatabaseFactory.create(db_file);
        db.close();

        response = true;
    } catch (Exception e)
    {
    }

    return response;
}
4

2 回答 2

2

My only suggestion is keep a default database in your assets - if there is a problem with the one on the SD Card, attempt to recreate it by copying the default one.

Not a very good answer I expect.

于 2013-08-08T15:41:11.387 回答
1

由于看起来您的问题是用户正在删除您的数据库,因此请确保在打开它时捕获异常(或访问它......无论您遇到异常):

try {
    URI uri = URI.create("file:///SDCard/Databases/database1.db");
    sqliteDB = DatabaseFactory.open(myURI);
    Statement st = sqliteDB.createStatement( "CREATE TABLE 'Employee' ( " +
                                              "'Name' TEXT, " +
                                              "'Age' INTEGER )" );               
    st.prepare();
    st.execute();
} catch ( DatabaseException e ) {         
    System.out.println( e.getMessage() );

    // TODO: decide if you want to create a new database here, or 
    // alert the user if the SDCard is not available
}

请注意,即使用户删除您的应用程序创建的私人文件可能并不常见,但由于设备通过 USB 连接到 PC,因此 SDCard 不可用是完全正常的。因此,您确实应该始终测试这种情况(文件打开错误)。

请参阅有关检查 SDCard 可用性的答案

另外,请阅读有关 SQLite db storage locations的信息,并确保查看 Michael Donohue关于 eMMC 存储的此答案。


更新:SQLite 腐败

请参阅此链接,描述 SQLite 数据库损坏的多种方式。在我看来,这绝对听起来像是 .db 文件被删除了,而不是 journal / wal 文件。如果是这样,您可以尝试database1*在创建database1.db. 但是,您的评论似乎表明这是另一回事。也许您也可以查看文件锁定失败模式。

如果您不顾一切,您可以尝试在每次创建新数据库时更改您的代码以使用不同的名称(例如database2database3),以确保您不会从以前的数据库中获得工件。

于 2013-08-11T03:43:03.797 回答